最初在这里发布了这个问题:
https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/wbSpXvnO10A/nov36skmnQ0J
我的扩展程序有一个可选功能,可与用户的gmail选项卡进行交互。我们不想在首次安装扩展程序时用户看到的权限确认中提及mail.google.com域。所以我将该条目移出了manifest的权限块并进入了optional_permissions块。我们还需要使用与mail.google.com绑定的内容脚本,但在清单中定义此内容会导致“mail.google.com”权限警告导致某些用户出现问题。
我已尝试删除content_script清单块并使用Programmatic Injection代替此处描述。 http://developer.chrome.com/extensions/content_scripts.html#pi 但是,以这种方式注入的脚本不是内容脚本,也无法访问所需的API(chrome.tabs等)
是否有某种方法可以充分利用这两个方面:使用optional_permission,并将内容脚本添加到匹配的网址中,但前提是用户是否已批准了可选权限?
答案 0 :(得分:1)
您似乎可以创建一个后台页面,并针对您的可选来源调用chrome.tabs.query以获取与该主机匹配的选项卡列表。然后,您可以将编程注入调用到内容脚本(chrome.tabs.executeScript)。这些都不需要“标签”权限(许多“标签”功能不需要任何特殊权限,它可以智能地查询其来源与您的可选权限相匹配的标签)
您可以每隔一秒左右调用一次,以查看是否有任何新标签尚未调用executeScript。
如果这是边缘触发的话会很好。见https://code.google.com/p/chromium/issues/detail?id=264704
你实际上可以通过使用chrome.tabs.onUpdated.addListener来简化边缘触发,并且每次触发时都会尝试注入(无论你是否有任何标签,每次页面都会加载许可与否)。当您没有权限时,您将在后台脚本的控制台中收到很多错误。让你的内容脚本设置一个像_I_already_executed = true这样的变量并检查它是否存在是很重要的,这样你就不会多次注入(每个页面加载会多次触发此事件)
答案 1 :(得分:0)
现在有contentScripts.register()
API,可让您以编程方式注册内容脚本。
browser.contentScripts.register({
matches: ['https://mail.google.com/*'],
js: [{file: 'content.js'}]
});
此API仅在Firefox中可用,但是您可以使用Chrome polyfill。新的脚本将与manifest.json中的常规内容脚本完全一样。
要获得更全面的解决方案,您可以查看我的webext-domain-permission-toggle
and webext-dynamic-content-scripts
模块,这些模块并不直接适用于您的用例,但可以帮助那些想放弃<all_urls>
权限并注入内容脚本的人按需。