2

我正在尝试在我的 Firefox 扩展中导入一个名为“WebSocketServer.jsm”的 .jsm 文件(来自This github )。情况如下:

  • .jsm 文件位于名为 modules 的目录中,路径如下:

root_of_extension/modules/WebSocketServer.jsm

  • 我已将这一行添加到我的 chrome.manifest 文件中:

resource external_components modules/

  • 我在我的代码中插入了导入文件的推荐:

Cu.import("resource://external_components/WebSocketServer.jsm");

问题是从控制台我看到以下错误

console.error: 
Object
- message = Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXPCComponents_Utils.import]
- fileName = undefined
- lineNumber = 6
- stack = @undefined:6:undefined|CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:9|run@resource://gre/modules
/commonjs/sdk/addon/runner.js:149:1|startup/<@resource://gre/modules/commonjs/sdk/addon/runner.js:113:7|resolve@resource://gre/modules/commonjs
/sdk/core/promise.js:118:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|then@resource://gre/modules/commonjs/sdk/core/promise.js:153:9|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:118:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|then@resource://gre/modules/commonjs/sdk/core/promise.js:153:9|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|readAsync/<@resource://gre/modules/commonjs/
sdk/net/url.js:49:9|NetUtil_asyncOpen/<.onStopRequest@resource://gre/modules/NetUtil.jsm:137:17|
- toString = function () /* use strict */ toString

“Cu.import”行中的第 6 行。你有什么想法?

4

2 回答 2

2

只需将它放在您的数据文件夹中,而不是像您在数据文件夹中的任何其他文件一样获取路径。

var {Cu} = require('chrome');
const self = require('sdk/self');    
Cu.import(self.data.url('modules/WebSocket.jsm'));

我很确定,不需要弄乱清单。

于 2014-07-23T07:52:37.750 回答
1

这是我刚刚测试的解决方案。

首先是结构:

$ ls -lR
total 8
drwxr-xr-x  3 maierman  staff  102 23 Jul 15:45 data
drwxr-xr-x  3 maierman  staff  102 23 Jul 15:47 lib
-rw-r--r--  1 maierman  staff  164 23 Jul 15:33 package.json

./data:
total 40
-rw-------  1 maierman  staff  17925 23 Jul 15:45 WebSocketServer.jsm

./lib:
total 8
-rw-r--r--  1 maierman  staff  874 23 Jul 15:47 main.js

现在,main.js

const self = require("sdk/self");
const {Cc, Ci, Cu} = require("chrome");

const wssuri = self.data.url("WebSocketServer.jsm");

Cu.import(wssuri);

// Create an echo server
var clients = [];
var server;

exports.onUnload = function() {
  try {
    server.close();
    clients.slice().forEach(function(c) {
      try {
        c.close();
      }
      catch (cex) {
        console.debug("Failed to disconnect client " + client, cex);
      }
    });
  }
  catch (ex) {
    console.debug("Failed to disconnect server", ex);
  }
  Cu.unload(wssuri);
};

server = new WebSocketServer(12345);
server.onclient = function(client) {
  console.log(client + " connected");
  clients.push(client);

  client.onmessage = function(client, msg) {
    console.log(client + " message:" + msg);
    client.send(msg);
  };

  client.onclose = function(client) {
    console.log(client + " disconnected");
    clients = clients.filter(function(c) {
      return c != client;
    });
  };
};
server.connect();

还要确保获得最新版本的WebSocketServer.jsm. 我刚刚注意到并修复了一个错误,即未正确处理客户端断开连接(但这与您的问题无关)。

并通过在 Scratchpad 中执行以下命令来测试这一点。

var ws = new WebSocket("ws://localhost:12345");
ws.onmessage = function(e) {
  console.log(e.data);
};
ws.onopen = function(e) {
  console.log("opened");
  ws.send("hello, world!");
};
ws.onerror = ws.onclose = function(e) {
  console.log(e.type);
};
于 2014-07-23T13:59:53.630 回答