Как отфильтровать iframes в расширении Add-on SDK? - PullRequest
7 голосов
/ 07 сентября 2011

Основная проблема заключается в том, что мое расширение загружается в каждый iframes на целевой веб-странице. Он помещает кнопки, которые появляются внутри фреймов. Я хочу, чтобы они исчезли. Объекты окна и документа отображаются как родительские объекты окна и документа. Поэтому невозможно проверить местоположение документа, например, потому что он показывает местоположение родителя вместо местоположения iframe.

Ответы [ 3 ]

3 голосов
/ 09 сентября 2011

Вы можете написать пользовательский сценарий, который использует ключ заголовка метаданных @noframes и включить пользовательский сценарий в свой Jetpack с этим пакетом пользовательских сценариев для дополнения sdk .

Написание пользовательских скриптов намного проще, чем написание модов для страниц.

2 голосов
/ 25 октября 2012

Редактировать: сейчас (выпущен аддон SDK версии 1.11) pagemod поддерживает то, что вы ищете. См. Документы и новую опцию attachTo.

Следующая информация устарела (может использоваться при сборке с использованием SDK надстройки 1.10 или более ранней версии:

К сожалению pagemod внедряет ваш сценарий во все фреймы страницы, а не только один раз на страницу в верхнем фрейме, как это достигается с помощью скриптов содержимого Chrome. Конечно, есть обходные пути для остановки выполнения скрипта (см. Другие ответы).

Но если вы действительно хотите внедрить свой сценарий только один раз на страницу, в верхнем фрейме вы должны использовать tabs. С этим решением ваш скрипт вводится только тогда, когда это необходимо.

Сильфон, который я предоставляю, и пример для портирования с pagemod на tabs, сохраняя работоспособность всей системы приема сообщений с port. Его можно легко изменить, если вам нужно не только получать, но и отправлять сообщения, используя тот же объект port. Скрипт внедряется, когда мы находимся в домене youtube.com :

Старый путь страницы:

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);
            });
        }
    }
});
1 голос
/ 28 сентября 2011

Один из обходных путей - добавить что-то подобное в ваш скрипт контента:

   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.

...