4

最初在这里发布了这个问题:

https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/wbSpXvnO10A/nov36skmnQ0J


我的扩展程序具有与用户的 gmail 选项卡交互的可选功能。我们根本不想在用户首次安装扩展程序时看到的权限确认中提及 mail.google.com 域。所以我将该条目从清单的权限块中移出并移到 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,并将内容脚本添加到匹配的 URL,但前提是用户已批准可选权限?

4

2 回答 2

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 这样的变量并检查它的存在是很重要的,这样您就不会多次注入(每次页面加载都会触发此事件多次)

于 2013-08-17T21:02:42.950 回答
1

现在有了contentScripts.register()API,它可以让您以编程方式注册内容脚本。

browser.contentScripts.register({
    matches: ['https://mail.google.com/*'],
    js: [{file: 'content.js'}]
});

此 API 仅在 Firefox 中可用,但您可以使用Chrome 的 polyfill 。新脚本的工作方式与 manifest.json 中的常规内容脚本完全相同。

对于更全面的解决方案,您可以查看我的webext-domain-permission-togglewebext-dynamic-content-scripts模块,它们并不直接适用于您的用例,但对于想要放弃<all_urls>权限并按需注入内容脚本的人可能会有所帮助。

于 2019-08-03T07:32:13.803 回答