内容脚本可以通过在扩展清单文件中声明以编程方式或永久注入。程序注入需要主机权限,通常由浏览器或页面操作授予。
在我的用例中,我想注入 gmail、outlook.com 和 yahoo 邮件网站,而无需用户操作。我可以通过声明所有这些清单来做到这一点,但这样做需要对这些帐户的所有数据访问权限。有些用户可能只想授予 Outlook.com,而不授予 Gmail。编程注入不起作用,因为我需要知道何时注入。使用选项卡权限还需要另一个权限。
有没有什么好的方法可以选择性地注入网站?
如果没有适当的权限,您无法在站点上运行代码。幸运的是,您可以添加主机权限optional_permissions在清单文件中声明它们是可选的,并且仍然允许扩展使用它们。
为了响应用户手势,您可以使用chrome.permission.request请求额外的权限。此 API 只能在扩展页面(后台页面、弹出页面、选项页面等)中使用。从 Chrome 36.0.1957.0 开始,所需的用户手势也从内容脚本中继承,因此如果您愿意,您可以从内容脚本添加单击事件侦听器并使用chrome.runtime.sendMessage将请求发送到后台页面,后台页面依次调用chrome.permissions.request.
选项卡中可选的代码执行
获得主机权限(可选或强制)后,您必须以某种方式在匹配的页面中注入内容脚本(或CSS样式)。有几个选项,按照我的喜好排列:
Use the chrome.declarativeContent.RequestContentScript在页面中插入内容脚本的操作。读文档如果您想了解如何使用此 API。
Use the webNavigationAPI(例如chrome.webNavigation.onCommitted)来检测用户何时导航到该页面,然后使用chrome.tabs.executeScript在选项卡中插入内容脚本(或chrome.tabs.insertCSS插入样式)。
Use the tabs API (chrome.tabs.onUpdated)来检测页面可能已更改,并使用以下命令在页面中插入内容脚本chrome.tabs.executeScript
.
我强烈推荐选项 1,因为它是专门为此用例设计的。注意:此 API 是在 Chrome 38 中添加的,但仅适用于可选权限自 Chrome 39 起。尽管 ”警告:此操作仍处于实验阶段,稳定版本的 Chrome 不支持。“在文档中,该 API 实际上是在稳定版上受支持的。最初的想法是在稳定版上发布 API 之前等待审核,但该审查从未到来,所以现在这个 API 已经正常工作了近两年了。
第二个和第三个选项类似。两者之间的区别在于使用webNavigation
API 添加了额外的权限警告(“读取您的浏览历史记录”)。对于此警告,您可以获得一个可以有效过滤导航的 API,因此chrome.tabs.executeScript
可以最大程度地减少通话次数。
如果您不想在权限对话框中放置此额外的权限警告,那么您可以盲目地尝试在每个选项卡上注入。如果你的扩展有权限,那么注入就会成功。否则,就会失败。这听起来不太高效,而且也不是……从好的方面来说,这种方法不需要任何额外的权限。
通过使用后两种方法中的任何一种,您的内容脚本的设计方式必须能够处理多个插入(例如有警卫)。还支持插入框架(allFrames:true
),但前提是您的扩展程序被允许访问选项卡的 URL(或者框架的 URL,如果frameId已设置)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)