Addon 使用 jpm 运行 附加脚本就好了,但不是实际的 xpi
Addon attaches script just fine with jpm run, but not with the actual xpi
我对 addon-sdk 还是很陌生,运行 遇到了一个对我来说无法解释的问题。
到目前为止,我一直在使用 jpm 运行 测试所有内容 - 一切都很好。现在,我已经接近完成我想要完成的事情了,所以我想在 'normal' 浏览器中对其进行测试 运行 - 主要是用几天时间看看如果一切按预期进行。
但是,安装过程已经抛出两条错误消息:
[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)
被抛出两次。
好吧,到目前为止,一切都很好(或很糟糕)。我的插件添加的切换按钮仍然显示。单击该按钮会打开一个面板,其中包含一个 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 中)没有出现在控制台中。
无论如何,浏览器控制台报告:
Use of nsIFile in content process is deprecated. NetUtil.jsm:335:12
< unavailable > timers.js:43
这些错误我不知道该怎么办,因为所有这些都与“jpm 运行”一起工作得很好。因此,如果有任何帮助,我将不胜感激,因为我完全不知道这里发生了什么。
如果需要,我还可以 post 更多代码,但我认为 post 已经足够长了。
谢谢!
编辑:我把代码上传到github。也许这样可以更轻松地帮助我。
https://github.com/Azlond/TrackingProtector
上述代码在data/privacyProtector/js/panel.js,index.js第66-91行,data/privacyProtector/js/internalOptions.js
好吧,我设法解决了这个问题。
我现在不再手动将脚本附加到打开的选项卡,而是在选项页面打开时使用 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
});
这样,选项页面就可以正常工作了。
我遇到了一个新问题,但我会为它提出一个新问题,这样它就可以成为一个独立的问题。
我对 addon-sdk 还是很陌生,运行 遇到了一个对我来说无法解释的问题。 到目前为止,我一直在使用 jpm 运行 测试所有内容 - 一切都很好。现在,我已经接近完成我想要完成的事情了,所以我想在 'normal' 浏览器中对其进行测试 运行 - 主要是用几天时间看看如果一切按预期进行。
但是,安装过程已经抛出两条错误消息:
[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)
被抛出两次。
好吧,到目前为止,一切都很好(或很糟糕)。我的插件添加的切换按钮仍然显示。单击该按钮会打开一个面板,其中包含一个 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 中)没有出现在控制台中。
无论如何,浏览器控制台报告:
Use of nsIFile in content process is deprecated. NetUtil.jsm:335:12
< unavailable > timers.js:43
这些错误我不知道该怎么办,因为所有这些都与“jpm 运行”一起工作得很好。因此,如果有任何帮助,我将不胜感激,因为我完全不知道这里发生了什么。
如果需要,我还可以 post 更多代码,但我认为 post 已经足够长了。
谢谢!
编辑:我把代码上传到github。也许这样可以更轻松地帮助我。
https://github.com/Azlond/TrackingProtector
上述代码在data/privacyProtector/js/panel.js,index.js第66-91行,data/privacyProtector/js/internalOptions.js
好吧,我设法解决了这个问题。
我现在不再手动将脚本附加到打开的选项卡,而是在选项页面打开时使用 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
});
这样,选项页面就可以正常工作了。 我遇到了一个新问题,但我会为它提出一个新问题,这样它就可以成为一个独立的问题。