Код будет:
// main.js:
var data = require("self").data;
var windows = require("windows").browserWindows;
var widget = require("widget").Widget({
id: "addon",
label: "Some label",
contentURL: data.url("favicon.png"),
onClick: function() {
//var workers = [];
for each (var tab in windows.activeWindow.tabs) {
var worker = tab.attach({
contentScriptFile: [data.url("jquery.js"),
data.url("inject.js")]
});
worker.port.on('got-url', function(data) {
console.log(data.url);
// worker.tab.url = data.url;
});
worker.port.emit('init', true);
console.log("got here");
//workers.push(worker);
}
}
});
// inject.js
$(function() {
self.port.on('init', function() {
console.log('in init');
var first = $(".avatar:first");
if (first.length !== 0) {
var url = first.attr("href");
console.log('injected!');
self.port.emit('got-url', {url: url});
}
});
});
Редактировать : извините, на самом деле следовало запустить код, у нас возникла проблема с синхронизацией, когда скрипт контента был внедрен до того, как рабочий слушатель был настроен, поэтому слушатель еще не был создан, когда ' событие got-url 'было отправлено. Я работаю над этим, откладывая любое действие в скрипте контента, пока в скрипт контента не отправится событие 'init'.
Вот рабочий пример на строителе:
https://builder.addons.mozilla.org/addon/1045470/latest/
Оставшаяся проблема с этим примером заключается в том, что невозможно определить, была ли вкладка введена нашей надстройкой, поэтому мы будем «просачиваться» или использовать больше памяти каждый раз при щелчке виджета. Лучшим подходом может быть внедрение скрипта контента с использованием мод-страницы, когда он загружен, и отправка только события init в обработчике onclick виджета.