如何过滤掉附加SDK扩展中的iframe?

时间:2011-09-07 18:41:24

标签: javascript firefox-addon firefox-addon-sdk

主要问题是我的扩展程序正在加载到目标网页上的每个iframe中。它还会将按钮显示在iframe中。我希望他们消失。窗口和文档对象显示为父窗口和文档对象。因此,检查文档位置是不可能的,例如因为它显示父级的位置而不是iframe的位置。

3 个答案:

答案 0 :(得分:3)

您可以编写一个使用@noframes元数据标题键的用户脚本,并使用this user script package for the addon sdk将用户脚本包含在Jetpack中。

编写用户脚本比编写Page Mods要容易得多。

答案 1 :(得分:2)

编辑:现在(已发布附加SDK版本1.11)pagemod支持您要查找的内容。 See the docs和新attachTo选项。

以下信息已过时(如果您针对加载项SDK 1.10或之前的版本构建,则可以使用该信息:

不幸的是,pagemod会在页面的所有框架中插入您的脚本,而不是在顶部框架的每页上注入一次,就像您使用Chrome的内容脚本一样。当然,有一些停止执行脚本的解决方法(参见其他答案)。

但是如果你真的只想在每个页面注入一次脚本,在顶部框架上,你必须使用tabs 。使用此解决方案,您只需在必要时注入脚本。

Bellow我提供了从pagemod移植到tabs的示例,并保留了所有带port的邮件接收系统。如果您不仅需要接收,还可以使用相同的port对象发送消息,则可以轻松修改它。当我们在域 youtube.com

时,脚本会被注入

旧的pagemod方式:

var self = require("self");
var pagemod = require("page-mod");

pagemod.PageMod(
{
    include: "*.youtube.com",
    contentScriptFile: self.data.url("myContentScript.js"),
    onAttach: function(worker)
    {
        worker.port.on("myMessageId", function(payload)
        {
            console.log("Message received: " + payload);
        });
    }
});

新标签方式:

var self = require("self");
var tabs = require("tabs");

tabs.on("ready", function(tab)
{
    if (tab != undefined && tab.url != undefined && tab.url.split("/")[2] != undefined)
    {
        var domain = "youtube.com";
        var host = tab.url.split("/")[2];
        if (host == domain || host.substr(host.length - domain.length - 1) == "." + domain)
        {
            var worker = tab.attach({ contentScriptFile: self.data.url("myContentScript.js") });
            worker.port.on("myMessageId", function(payload)
            {
                console.log("Message received: " + payload);
            });
        }
    }
});

答案 2 :(得分:1)

一种解决方法是在内容脚本中添加类似的内容:

   if (window.frameElement === null){
     // I'm in the topmost window
     // Add buttons and things to the page.
   }else{
     // I'm in an iFrame... do nothing!
   }

内容脚本仍将添加到每个页面,但它是iFrames的一个相对简单和轻量级的检查。