Google chrome extension 从权限移动到可选的\u权限:如何处理内容\u脚本?

Google chrome extension 从权限移动到可选的\u权限:如何处理内容\u脚本?,google-chrome-extension,Google Chrome Extension,最初在此处发布此问题: 我的扩展有一个可选功能,可以与用户的gmail标签交互。我们不想在用户首次安装扩展时看到的权限确认中提及mail.google.com域。因此,我将该条目从清单的权限块移到可选的\u权限块中。我们还需要使用一个绑定到mail.google.com的内容脚本,但是在清单中定义它会导致“mail.google.com”权限警告,这会引发一些用户 我已经尝试删除content_脚本清单块,并使用编程注入,如这里所述。 但是,以这种方式注入的脚本不是内容脚本,并且无法访问所需

最初在此处发布此问题:


我的扩展有一个可选功能,可以与用户的gmail标签交互。我们不想在用户首次安装扩展时看到的权限确认中提及mail.google.com域。因此,我将该条目从清单的权限块移到可选的\u权限块中。我们还需要使用一个绑定到mail.google.com的内容脚本,但是在清单中定义它会导致“mail.google.com”权限警告,这会引发一些用户

我已经尝试删除content_脚本清单块,并使用编程注入,如这里所述。 但是,以这种方式注入的脚本不是内容脚本,并且无法访问所需的API(chrome.tabs等)


有什么方法可以两全其美:使用可选权限,并将内容脚本添加到匹配的URL中,但前提是用户已经批准了可选权限?

您似乎可以创建一个背景页面,并对可选来源调用chrome.tabs.query,以获得与该主机匹配的选项卡列表。然后可以调用内容脚本的编程注入(chrome.tabs.executeScript)。所有这些都不需要“制表符”权限(许多“制表符”功能不需要任何特殊权限,它可以智能地让您查询其来源与您的可选权限匹配的制表符)

您可以每隔一秒钟左右调用一次,查看是否有尚未调用executeScript的新选项卡

如果这是边缘触发的,那就太好了。看

通过使用chrome.tabs.onUpdated.addListener并在每次触发时尝试插入(无论您是否拥有权限,每次页面加载到任何选项卡时都会尝试插入),您实际上可以使其大部分处于边缘触发状态。当您没有权限时,在后台脚本的控制台中会出现很多错误。让您的内容脚本设置一个变量,如_I_ready_executed=true,并检查其存在性,这样您就不会多次注入(每次页面加载都会触发此事件)

现在有了,它允许您以编程方式注册内容脚本

browser.contentScripts.register({
匹配:['https://mail.google.com/*'],
js:[{file:'content.js'}]
});
此API仅在Firefox中可用,但有一个可供使用的API。新脚本的工作方式与manifest.json中的常规内容脚本完全相同


要获得更全面的解决方案,您可以查看my Module(我的模块),它不直接应用于您的用例,但对希望放弃
权限并按需插入内容脚本的用户很有帮助。

您的扩展是什么?通过tabs.executeScript插入的代码与内容脚本具有完全相同的权限。内容脚本也无法访问大多数chrome.*API。这些都可以在后台页面上找到。您仍然需要请求访问要注入的页面。也许请求访问所有网站,导致“访问所有网站上的数据”比特别提到mail.google.com更不可怕?为了保持此答案的新鲜性,现在可以使用
declarativeContent
中的
requestContentScript