使用jpm run,Addon可以很好地附加脚本,但不能使用实际的xpi

时间:2016-04-01 00:00:42

标签: javascript firefox-addon-sdk xpi jpm

我对addon-sdk还是比较新的,并且遇到了一个无法解释的问题。 到目前为止,我一直在使用jpm run来测试所有内容 - 这一切都很有效。现在,我已经接近完成了我想要完成的任务,所以我想在“普通”浏览器中进行测试运行 - 主要是在几天内使用它来查看一切是否按预期工作。

但是,安装过程已经抛出两条错误消息:

  

[Exception ...“组件返回失败代码: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]   (未知)

被抛出两次。

那么,到目前为止,那么好(或坏)。我的插件添加的切换按钮仍然显示出来。单击该按钮会打开一个包含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 个答案:

答案 0 :(得分:2)

好吧,我设法解决了这个问题。

不是手动将脚本附加到打开的选项卡,而是在打开选项页面时使用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
});

这样,选项页面工作得很好。 我遇到了一个新问题,但我会问一个新问题,所以这可能是一个独立的问题。