【问题标题】:Does content_scripts matches "chrome-extension://*/*" work?content_scripts 匹配“chrome-extension://*/*”是否有效?
【发布时间】:2012-04-17 17:44:20
【问题描述】:

我想在带有 chrome-extension:// URL 的 iframe 上运行内容脚本。我在 manifest.json 中添加了一行,是从文档 http://code.google.com/chrome/extensions/match_patterns.html 中复制出来的

 chrome-extension://*/*

但是当我重新加载我的扩展程序时,我会收到一条警报:

Could not load extension from '/work/sirius/extension'. 
Invalid value for 'content_scripts[2].matches[0]': Invalid scheme.

知道如何让它工作吗?

【问题讨论】:

标签: google-chrome-extension


【解决方案1】:

没有。内容脚本声明只能匹配 ftp:file:http:https:

matchesexclude_matches 字段中的任何无效 URL 模式都被拒绝(尝试加载扩展程序时生成错误)。

permissions option in the manifest file 处的无效模式将被忽略。

如果您想在扩展程序的选项卡上运行脚本,请在后台脚本中使用 chrome.extension.getViews。 更好的是,设计您的扩展程序的页面,使它们effectively communicate with each other (example)

【讨论】:

  • 我想在网页的 iframe 上运行内容脚本。 chrome.extension.getViews() 允许在扩展程序上使用脚本,而不是在网页上。
  • 我正在为 iframe 实现基于 postMessage 的通信机制,但 iframe 不是我的代码。所以我希望 content_scripts 允许我注入 postMesssage() 端点。
  • 上面指向“清单文件中的权限选项”的链接引导我使用编程脚本注入进行调查。不幸的是,这也不起作用:托管 chrome-extension:// iframe 的网络应用程序无法运行注入其 iframe 所需的扩展代码。也许我可以在标签有匹配的URL时编写一个单独的扩展到以编程方式注入。 span>
  • @johnjbarton 你说得对。通过在尝试权限选项时没有看到错误,我认为它是一个有效值。经过进一步调查,我发现无效模式不会产生错误。
  • 我尝试了从扩展程序进行程序注入。这也失败了,因为 iframe 本身是以编程方式添加的,并且 chrome.tabs.executeScript() 即使使用“allFrames:true”也只会在 html 解析期间触发。可能是 Web 应用程序上的内容脚本,它监视与 chrome-extension:// url 匹配的 iframe,然后向后台页面发送消息以调用 chrome.tabs.executeScript()。但这超出了我愚蠢的限制:-(
【解决方案2】:

我遇到了完全相同的问题,请查看 API http://code.google.com/chrome/extensions/match_patterns.html,它清楚地表明他们接受 chrome-extension://*/*,但他们不接受。

他们需要更新 API 以免混淆。

【讨论】:

【解决方案3】:

Chrome 作者似乎默默地删除了将内容脚本注入chrome-extension: 页面的功能。 Documentation 仍然说它可以工作,甚至包含带有 chrome-extension: 方案的示例,但实际上它不起作用。所以现在只有 http:https:ftp: 可以“开箱即用”,如果您的扩展程序的用户在扩展程序 (chrome://extensions/) 页面上启用了此功能,file: 可以工作。

更新:现在上面提到的文档已经更新,并且没有说明向chrome-extension: 页面注入内容脚本的能力。

【讨论】:

    【解决方案4】:

    您可以将 js 注入到您的 iframe html(chrome-extension: 页面)中,而无需在 manifast.json 中声明它。注入的js可以直接访问Chrome API。

    iframe.html:

    <!DOCTYPE html>
    <html>
    <head>
    ...
    </head>
    <body>
    ...
    </body>
    <script src="iframe.js"></script>
    </html>
    

    iframe.js:

    console.log(chrome); // {loadTimes: ƒ, csi: ƒ, …}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多