Addon attaches script just fine with jpm run, but not with the actual xpi

瘦欲@ 提交于 2019-12-25 16:01:18

问题


I'm still fairly new to the addon-sdk and have run into a for me unexplainable problem. So far, I've been using jpm run to test everything - and it all works great. Now, I'm getting close to be finished with what I want to accomplish, so I wanted to give it a test run in a 'normal' browser - mainly to use it over a couple of days to see if everything works as expected.

However, the installing process already throws two error messages:

[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIURI.hostPort]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: resource://gre/modules/PopupNotifications.jsm :: PopupNotifications_refreshPanel/< :: line 667" data: no] (unknown)

gets thrown twice.

Well, so far, so good (or bad). The toggle-button which my addon adds still shows up. A click on the button opens up a panel which contains a html-page - still working. The panel.html contains a button, and this is the source for my troubles.

If clicked, the button sends a message to my main addon-file:

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

to which index.js listens:

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());
});

now the options.html tab gets opened (and the panel disappears), but it appears as if the contentScriptFile isn't attached. I tried to figure out exactly where the code stopped working, but haven't been able to. A 'console.log()' after

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

works fine, however a 'console.log()' at

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

(which is in internalOptions.js) doesn't appear in the console.

Anyway, the browser console reports:

Use of nsIFile in content process is deprecated. NetUtil.jsm:335:12

< unavailable > timers.js:43

which are errors I have no idea what to do with, because all of this is working perfectly fine with "jpm run". Therefore, I'd be grateful for any help at all, because I have absolutely no idea what's going on here.

If needed, I can also post more code, but I figured this post is already long enough as it is.

Thanks!

Edit: I uploaded the code to github. maybe this makes helping me easier.

https://github.com/Azlond/TrackingProtector

The aforementioned code is in data/privacyProtector/js/panel.js, index.js line 66-91, and data/privacyProtector/js/internalOptions.js


回答1:


Well, I managed to fix this problem.

Instead of manually attaching the script to the opened tab, I now use pagemod to attach the script whenever the the options page is opened.

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

This way, the options page works perfectly fine. I've encountered a new problem, but I'll ask a new question for it, so that this can be a stand-alone problem.



来源:https://stackoverflow.com/questions/36345848/addon-attaches-script-just-fine-with-jpm-run-but-not-with-the-actual-xpi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!