Как отфильтровать iframes в расширении Add-on SDK?

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

7 голосов | спросил Gera János 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 22:41:24 +0400 2011, 22:41:24

3 ответа


0

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

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

ответил erikvold 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 09 Sep 2011 00:49:13 +0400 2011, 00:49:13
0

Изменить: сейчас (выпущен дополнительный пакет 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);
            });
        }
    }
});
ответил cprcrack 25 +04002012-10-25T17:58:14+04:00312012bEurope/MoscowThu, 25 Oct 2012 17:58:14 +0400 2012, 17:58:14
0

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

   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.

ответил doctororange 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 28 Sep 2011 04:16:34 +0400 2011, 04:16:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132