Аддон присоединяет скрипт просто отлично с jpm run, но не с фактическим xpi

Я все еще довольно новичок в addon-sdk и столкнулся с необъяснимой для меня проблемой. До сих пор я использовал jpm run для проверки всего - и все это прекрасно работает. Теперь я близок к тому, чтобы закончить с тем, чего я хочу достичь, поэтому я хотел провести тестовый запуск в "обычном" браузере - в основном, чтобы использовать его в течение пары дней, чтобы посмотреть, все ли работает так, как ожидалось.

Однако процесс установки уже выдает два сообщения об ошибках:

[Исключение... "Компонент возвратил код ошибки: 0x80004005 (NS_ERROR_FAILURE) [nsIURI.hostPort]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" расположение: "JS frame:: resource://gre/modules/PopupNotifications.jsm:: PopupNo Ресцентрации / <:: строка 667 "данные: нет] (неизвестно)

получает дважды

Ну, пока все хорошо (или плохо). Кнопка переключения, которую добавляет мой аддон, по-прежнему отображается. Нажатие на кнопку открывает панель, которая содержит html-страницу - все еще работает. Файл panel.html содержит кнопку, и это источник моих проблем.

При нажатии кнопка отправляет сообщение в мой основной аддон-файл:

optionsButton.addEventListener("click", function(){
    self.port.emit("options-clicked");
});

который прослушивает index.js:

panel.port.on("options-clicked", function () {

    tabs.open("./privacyProtector/options.html");
    panel.hide();

    var optionsTab = tabs[tabs.length - 1];
    var worker = optionsTab.attach({
        contentScriptFile: "./privacyProtector/js/internalOptions.js",
    });

    /* send current settings to options */
    worker.port.emit("initialize", createSettingsJSON());
});

Теперь вкладка options.html открывается (и панель исчезает), но выглядит так, как будто contentScriptFile не присоединен. Я пытался выяснить, где именно код перестал работать, но не смог. "Console.log()" после

worker.port.emit("initialize", createSettingsJSON());

работает нормально, однако console.log()

self.port.on("initialize", function (message) {
    initialize(message);
});

(который находится в internalOptions.js) не отображается в консоли.

Во всяком случае, консоль браузера сообщает:

Использование nsIFile в процессе контента не рекомендуется. NETUtil.jsm:335:12

<недоступно> timers.js:43

с ошибками я понятия не имею, что делать, потому что все это прекрасно работает с "jpm run". Поэтому я был бы благодарен за любую помощь, потому что я абсолютно не знаю, что здесь происходит.

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

Спасибо!

Изменить: я загрузил код в GitHub. может быть, это помогает мне легче.

https://github.com/Azlond/TrackingProtector

Вышеупомянутый код находится в data/privacyProtector/js/panel.js, index.js строка 66-91 и data/privacyProtector/js/internalOptions.js.

1 ответ

Решение

Ну, мне удалось решить эту проблему.

Вместо того, чтобы вручную прикреплять скрипт к открытой вкладке, я теперь использую pagemod для прикрепления скрипта при каждом открытии страницы параметров.

var pageMod = require("sdk/page-mod");
pageMod.PageMod({
    include: "resource://protector/data/privacyProtector/options.html",
    contentScriptFile: "./privacyProtector/js/internalOptions.js",
    contentScriptWhen: "end",
    onAttach: sendSettings
});

Таким образом, страница параметров работает отлично. Я столкнулся с новой проблемой, но я задам ей новый вопрос, так что это может быть отдельной проблемой.

Другие вопросы по тегам