【问题标题】:Chrome Extension content script on iframe without src attribute没有 src 属性的 iframe 上的 Chrome 扩展内容脚本
【发布时间】:2015-07-02 18:08:02
【问题描述】:

我有一个内容脚本,它将 iframe 注入我页面的 DOM。此 iframe 没有 src 属性,我正在使用它的内容动态创建它...

iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);

如何在这个 iframe 上运行我的内容脚本?还是与后台沟通?我需要从此代码触发“关闭我的 iframe”事件。我知道这是可能的,因为蜂蜜正在这样做。

https://chrome.google.com/webstore/detail/honey/bmnlcjabgnpnenekpadlanbbkooimhnj?hl=en-US

【问题讨论】:

  • 我认为这是不可能的;无法访问data: URL。你为什么认为“蜂蜜在做这个”?
  • @Xan ,因为我安装了他们的扩展,我看到他们添加了一个 data: iframe,然后与其中的内容脚本进行交互。

标签: javascript html iframe google-chrome-extension


【解决方案1】:

您不能在 data:-URL (crbug.com/55084) 的框架中运行内容脚本。

虽然有一些选择:

  1. 在嵌入框架的页面中,使用onmessage 事件从iframe 订阅事件,并在data-URL 框架中插入调用parent.postMessage 的脚本。

    // Content script in parent frame.
    // Assuming that variable iframe exists, and that it is an iframe.
    window.addEventListener('message', onMessage);
    function onMessage(event) {
        if (event.source === iframe && event.message === 'close') {
            window.removeEventListener('message', onMessage); // Clean-up
            iframe.remove();
        }
    }
    
    // In the iframe
    parent.postMessage('close');
    
  2. 使用.srcdoc 而不是 .src+data URL 在 iframe 中加载 HTML:

    iframe.srcdoc = html;
    

    HTML 将与父文档位于同一来源,因此框架内的内容可以简单地使用 frameElement.remove(); 之类的东西来删除框架 (example)。 由于此脚本可以直接访问父页面,因此您插入的html 必须是可信的。不要从不受信任的站点插入任意 HTML!

  3. web_accessible_resources中声明一个扩展页面,并在框架中加载扩展页面。然后你可以使用extension messaging APIs在框架和扩展的背景之间进行通信。与之前的方法不同,此页面中的代码在您的扩展程序的源中运行,因此您可以访问一些 Chrome API(包括扩展程序消息或chrome.storage)和特定于源的数据(例如 localStorage)。

    iframe.src = chrome.runtime.getURL('name_of_your_page.html');
    

【讨论】:

  • 这很有帮助,我选择了第一个解决方案。
  • 这似乎随着 match_about_blank 选项的引入而改变了?
  • @rogerdpack 不在 Chrome 中,data:-URI 具有唯一的来源,因此它们不能由父页面编写脚本。
猜你喜欢
  • 2011-09-28
  • 2011-11-02
  • 2012-07-04
  • 2011-04-25
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多