可选择注入内容脚本

Kya*_*Tun 16 google-chrome-extension content-script

可以通过在扩展清单文件中声明来以编程方式或永久方式注入内容脚本.程序注入需要主机权限,通常由浏览器或页面操作授予.

在我的用例中,我想在没有用户操作的情况下注入gmail,outlook.com和yahoo邮件网站.我可以通过声明所有这些显示来做,但这样做需要所有数据访问这些帐户.某些用途可能只想授予outlook.com,但不授予gmail.程序注射不起作用,因为我需要知道何时注射.使用制表符权限也需要另一个权限.

有没有什么好方法可以选择注入网站?

Rob*_*b W 9

没有适当的权限,您无法在站点上运行代码.幸运的是,您可以optional_permissions在清单文件中添加主机权限以声明它们是可选的,并且仍然允许扩展程序使用它们.

为了响应用户手势,您可以使用它chrome.permission.request来请求其他权限.此API只能用于扩展页面(后台页面,弹出页面,选项页面......).从Chrome 36.0.1957.0开始,所需的用户手势也会从内容脚本中继承,因此如果您愿意,可以从内容脚本添加点击事件侦听器,并使用chrome.runtime.sendMessage该请求发送到后台页面,后台又调用chrome.permissions.request.

选项卡中的可选代码执行

获取主机权限(可选或必需)后,您必须以某种方式在匹配的页面中注入内容脚本(或CSS样式).根据我的偏好,有几个选项:

  1. 使用该chrome.declarativeContent.RequestContentScript操作在页面中插入内容脚本.如果您想了解如何使用此API,请阅读文档.

  2. 使用webNavigationAPI(例如chrome.webNavigation.onCommitted)检测用户何时导航到页面,然后使用chrome.tabs.executeScript在选项卡中插入内容脚本(或chrome.tabs.insertCSS插入样式).

  3. 使用tabsAPI(chrome.tabs.onUpdated)检测页面可能已更改,并使用在页面中插入内容脚本chrome.tabs.executeScript.

我强烈推荐选项1,因为它是专门为此用例设计的.注意:此API已添加到Chrome 38中,但仅适用于自Chrome 39以来的可选权限.尽管文档中的" 警告:此操作仍然是实验性的,并且在Chrome的稳定版本中不受支持. "但实际上API仍然支持稳定版.最初的想法是在稳定发布API之前等待审核,但是审核从未发生过,所以现在这个API已经运行了近两年.

第二和第三种选择是相似的.两者之间的区别在于使用webNavigationAPI会添加额外的权限警告("阅读您的浏览历史记录").对于此警告,您将获得可以有效过滤导航的API,因此chrome.tabs.executeScript可以最小化调用次数.

如果您不想在权限对话框中添加此额外权限警告,则可以盲目地尝试在每个选项卡上注入.如果您的扩展程序具有权限,则注入将成功.否则,它失败了.这听起来不是很有效,而且它不是......在光明的一面,这种方法不需要任何额外的权限.

通过使用后两种方法中的任何一种,您的内容脚本必须以能够处理多次插入的方式设计(例如,使用保护).还支持在框架中插入(allFrames:true),但前提是允许您的扩展程序访问选项卡的URL(或者如果frameId设置了框架的URL ).

  • @istan"css"似乎不起作用,我在这里报告:https://crbug.com/708115作为解决方法,您可以使用"js"插入`<style>`或`<link>页面中的元素. (4认同)

fre*_*nte 6

我将把它分成两部分。

程序化脚本注入

有一个新的contentScripts.register()API可以以编程方式注册内容脚本,它们将完全content_scripts按照清单中的定义加载:

browser.contentScripts.register({
    matches: ['https://your-dynamic-domain.example.com/*'],
    js: [{file: 'content.js'}]
});
Run Code Online (Sandbox Code Playgroud)

此 API 仅在 Firefox 中可用,但您可以使用Chrome polyfill。将来您将能够使用,chrome.scripting.registerContentScript尚未实施

获取新权限

通过使用,chrome.permissions.request您可以添加可以注入内容脚本的新域。一个例子是:

// In a content script or options page
document.querySelector('button').addEventListener('click', () => {
    chrome.permissions.request({
        origins: ['https://your-dynamic-domain.example.com/*']
    }, granted => {
        if (granted) {
            /* Use contentScripts.register */
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

并且您必须添加optional_permissionsmanifest.json以允许请求新的来源:

{
    "optional_permissions": [
        "*://*/*"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我还编写了一些工具来为您和最终用户进一步简化此操作,例如 webext-domain-permission-togglewebext-dynamic-content-scripts。他们将在下一次浏览器启动时自动注册您的脚本,并允许用户删除新的权限和脚本。