Редактировать: сейчас (выпущен аддон 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);
});
}
}
});