Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to filter out iframes in an Add-on SDK extension?

The main problem is that my extension is loading into every iframes on a target webpage. It puts buttons that appear inside the iframes as well. I want them to disappear. The window and document objects are shown as the parent's window and document objects. So it's impossible to check the document location for example because it shows the parent's location instead of the iframe's location.

like image 354
Gera János Avatar asked Sep 07 '11 18:09

Gera János


2 Answers

You could write a user script which uses the @noframes metadata header key and include the user script in to your Jetpack with this user script package for the addon sdk.

Writing user scripts is much easier than writing Page Mods too.

like image 103
erikvold Avatar answered Nov 05 '22 07:11

erikvold


Edit: now (Add-on SDK version 1.11 released) pagemod supports what you are looking for. See the docs and the new attachTo option.

The following information is outdated (can be used if you build against Add-on SDK 1.10 or previous:

Unfortunately pagemod injects your script in all the frames of the page, and not just once per page on the top frame as what you achieve with Chrome's content scripts. Of course, there are workarounds for stopping the execution of the script (see the other answers).

But if you really want to inject your script only once per page, on the top frame, you have to use tabs. With this solution you script only gets injected when it has to.

Bellow I provide and example for porting from pagemod to tabs, keeping all the message reception system with port working. It can easily be modified if you need to not just receive, but also send messages using that same port object. The script gets injected when we are in the domain youtube.com:

Old pagemod way:

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);
        });
    }
});

New tabs way:

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);
            });
        }
    }
});
like image 2
cprcrack Avatar answered Nov 05 '22 06:11

cprcrack