Конструктор надстроек: несколько рабочих, использующих порт? - PullRequest
2 голосов
/ 19 марта 2012

Ссылаясь на этот вопрос: Конструктор дополнений: ContentScript и обратно к коду аддона?

Вот мой код аддона:

var widget = widgets.Widget({
  id: "addon",
  contentURL: data.url("icon.png"),
  onClick: function() {
    var workers = [];
    for each (var tab in windows.activeWindow.tabs) {
        var worker = tab.attach({contentScriptFile: [data.url("jquery.js"), data.url("myScript.js")]});
        workers.push(worker);
    }
  }
});

А вотmyScript.js:

var first = $(".avatar:first");
if (first.length !== 0) {
    var url = first.attr("href");
    self.port.emit('got-url', {url: url});
}

Теперь, когда у меня есть несколько рабочих, куда я могу поместить

worker.port.on('got-url', function(data) {
            worker.tab.url = data.url;
        });

Так как в другом вопросе у меня был только один рабочий, но теперь у меня есть массив рабочих.

1 Ответ

1 голос
/ 20 марта 2012

Код будет:

// 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 виджета.

...