【问题标题】:Chrome extension with declarativeContent.RequestContentScript带有 declarativeContent.RequestContentScript 的 Chrome 扩展
【发布时间】:2017-09-13 11:37:00
【问题描述】:

我正在尝试制作一个 Chrome 扩展程序,它将监控 GMail 并在用户开始写消息时执行某些操作。在研究了一些示例和文档之后,我发现我应该使用 declarativeContent 来做,它会对页面更改做出反应。

这就是我现在所做的。

manifest.json:

{
  "manifest_version": 2,
  "name": "Gmail helper",
  "version": "0.1",
  "permissions": [ "declarativeContent" ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  }
}

background.js:

chrome.runtime.onInstalled.addListener (function (details) {
  chrome.declarativeContent.onPageChanged.removeRules (undefined, function () {
    chrome.declarativeContent.onPageChanged.addRules ([{
      conditions: [
        new chrome.declarativeContent.PageStateMatcher({
          pageUrl: { hostEquals: 'mail.google.com', schemes: ['https'] },
          css: ["div"]
//          css: ["div[aria-label='Message Body']"]
        })
      ],
      actions: [ new chrome.declarativeContent.RequestContentScript({js: ["content.js"]}) ]
    }]);
  });
});

content.js:

alert ("Test");

我的计划是声明一个内容脚本,该脚本将在 GMail 中的页面更改时触发。我添加了一个声明性规则,其中定义了 pageURL、css 和操作。根据我的理解 content.js 应该在 pageUrl 和 css 内容匹配时执行。但是,content.js 没有被执行。

我做错了什么?

谢谢。

【问题讨论】:

    标签: javascript css google-chrome-extension


    【解决方案1】:

    在站点上运行内容脚本需要站点的权限,这在 declarativeContent API 的文档中没有明确说明,但可以推断为缺少“此操作可以在没有主机权限的情况下使用”注释,即出现在其他动作中。 declarativeContent API 的目的是在没有任何权限确认警告的情况下从 WebStore 安装扩展程序,因此该 API 自然无法授予您对 mail.google.com 的访问权限,除非您在清单中明确添加它:

    "permissions": ["declarativeContent", "https://mail.google.com/"]
    

    【讨论】:

    • 谢谢。我发现了一些有关权限的信息,但找不到任何参考或示例来显示您所写的内容。如您所见,我添加了 declarativeContent 的权限,但没有添加 URL。这是一个很好的答案。
    【解决方案2】:

    从您的任务描述看来,您不需要 declarativeContent。

    如果 GMail 页面打开,您需要向页面添加内容脚本,并且在内容脚本中您需要向消息编辑器 DOM 元素(或您需要跟踪的任何其他元素)添加侦听器。

    假设您知道如何做第二个,要将内容脚本添加到 GMail 页面,您需要将以下内容添加到清单中:

      "content_scripts": [
        {
          "matches": [
            "https://mail.google.com/*"
          ],
          "js": ["content.js"]
        }
    

    在这种情况下,您也不需要后台脚本和权限。

    注意: 尽管您不需要指定权限,但您的扩展程序需要向用户询问权限。 在安装过程中,Chrome 会警告用户您的扩展程序将有权访问页面上的所有用户数据,以便用户在不同意的情况下取消安装。

    【讨论】:

    • 谢谢。我更喜欢另一个答案,因为我认为这是一种更合适的方法。起初我尝试过您的方式,但我不知道如何对页面更改做出反应。我遇到了问题,因为我正在寻找的元素在开始时不可用。也许我应该使用"run_a": "document_end"。我尝试添加一个监听器,但这些元素根本不可用。
    • 不客气。当然这取决于你。我只是认为将页面更改跟踪添加到扩展名是矫枉过正的。如果您改变主意,您可以使用突变观察者来获取有关添加的 DOM 对象的通知 (stackoverflow.com/questions/16618876/…)。我在 GMail 页面上玩了一下,似乎消息编辑器总是显示为这个元素的子元素
      。所以你可能只追踪里面的孩子(我没有仔细调查,所以可能是错误的)。
    • @VictorPortnov 以后有什么方法可以请求内容脚本权限吗?
    • @Goehybrid 不,我不这么认为。实际上它不是权限,它是浏览器用来决定是否应该将内容脚本注入页面的一种过滤器。
    【解决方案3】:

    在文档描述中,RequestContentScript 是实验性的,但不是。在我的测试中,Chrome 版本 >= 60 可用,但 allFrames 似乎不起作用。

    在使用“RequestContentScript”之前,需要在“permissions”中声明主机权限。

    https://developer.chrome.com/extensions/declarativeContent#type-RequestContentScript

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签