ReferenceError:在简单的Firefox扩展中未定义Worker

时间:2014-11-20 20:11:23

标签: javascript firefox firefox-addon firefox-addon-sdk web-worker

我正在创建一个非常简单的Firefox扩展。我使用cfx init创建目录结构,并在lib/main.jsdata/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/Contents/MacOS/firefox-bin'。使用个人资料   在   '/var/folders/p1/zzdzcrrx6pq96hgsmy5xjqmh0000gp/T/tmp57OYe9.mozrunner'。   console.error:test:消息: ReferenceError:未定义Worker   堆:       @resource://jid1-zmowxggdley0aa-at-jetpack/test/lib/main.js:1:9 CuddlefishLoader / options< .load @ resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:129 :18   运行@资源://gre/modules/commonjs/sdk/addon/runner.js:138:19   启动/

我尝试将my_worker.js放在datalib文件夹中,但都不起作用。这似乎是一个超级简单的扩展。可能出现什么问题?

2 个答案:

答案 0 :(得分:3)

在开始编码之前阅读some intro docs可能是个好主意。

需要使用main.js功能导入require的Firefox附加SDK uses modules。没有全局Worker对象,因为错误很明确。内容脚本需要在某处附加到HTML页面;它不能单独存在。获得工作人员的三种最常见的方法是将内容脚本附加到

a tab

var tabs = require("sdk/tabs");

tabs.on('ready', function(tab) {
  var worker = tab.attach({
      contentScript:
        'document.body.style.border = "5px solid red";'
  });
});

使用PageMod

匹配一系列网址或正则表达式的任何网页
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"
});

请注意,panelsworker的工作方式非常相似,因为它们具有onMessageport属性。

另请注意,onMessage拼写为大写M

答案 1 :(得分:2)

在Firefox插件中,使用 ChromeWorker 代替工作人员。

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 / 目录中。