我正在创建一个非常简单的Firefox扩展。我使用cfx init
来创建目录结构,并有lib/main.js
和data/my_worker.js
main.js
如下:
var worker = new Worker("my_worker.js");
worker.onmessage = function(e) {
console.log(e.data);
};
worker.postMessage("Bobby");
my_worker.js
如下:
self.onmessage = function(e) {
self.postMessage("Hello " + e.data);
};
然后我运行:cfx run
来运行扩展。结果如下:
(addon-sdk-1.17)me:lib me$ cfx run 使用二进制在 '/applications/Firefox.app/Content/MacOS/firefox-bin'.使用配置文件 在 '/var/folder/p1/zzdzcrrx6pq96hgsmy5xjqmh0000gp/T/tmp57OYe9.mozrunner'. console.error: test: message: ReferenceError: 未定义工作线程 叠: @resource://jid1-zmowxggdley0aa-at-jetpack/test/lib/main.js:1:9 CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:18 run@resource://gre/modules/commonjs/sdk/addon/runner.js:138:19 启动/
我尝试将my_worker.js
放入data
和lib
文件夹中,但都不起作用。这似乎是一个超级简单的扩展。可能出现什么问题?
在开始编码之前阅读一些介绍文档可能是个好主意。
Firefox 附加 SDK 使用需要使用 require
函数导入到main.js
中的模块。没有全局Worker
对象,因为错误非常明确。内容脚本需要附加到某处的 HTML 页面;它不能单独存在。获取辅助角色的三种最常见方法是将内容脚本附加到
一个选项卡
var tabs = require("sdk/tabs");
tabs.on('ready', function(tab) {
var worker = tab.attach({
contentScript:
'document.body.style.border = "5px solid red";'
});
});
使用PageMod
与 URL 或正则表达式数组匹配的任何页面
var tag = "p";
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "*.mozilla.org",
contentScriptFile: data.url("element-getter.js"),
onAttach: function(worker) {
worker.port.emit("getElements", tag);
worker.port.on("gotElement", function(elementContent) {
console.log(elementContent);
});
}
});
带有PageWorker
的不可见背景页面,这可能是您要做的
pageWorker = require("sdk/page-worker").Page({
contentScript: "console.log(document.body.innerHTML);",
contentURL: "http://en.wikipedia.org/wiki/Internet"
});
请注意,panel
的工作方式与worker
非常相似,因为它们具有onMessage
和port
属性。
另请注意,onMessage
拼写为大写M
在 Firefox 插件中,使用 ChromeWorker 而不是 Worker。
在 main 中添加以下行.js
var { ChromeWorker } = require("chrome");
var self = require("sdk/self");
var data = self.data;
var localWorker = new ChromeWorker(data.url("my_worker.js"));
worker.onmessage = function(e) {
console.log(e.data);
};
worker.postMessage("Bobby");
my_worker.js
self.onmessage = function(e) {
self.postMessage("Hello " + e.data);
};
将my_worker.js文件放在 data/ 目录中。