我一直在研究与运行WebSocket服务器的本地应用程序交互的浏览器扩展。 Safari和Chrome扩展程序非常容易实现,在经历了一些令人头疼的FF开发之后,我想我可以像在其他浏览器中那样实现WebSockets。但是我遇到了一些问题。
据我所知,我无法在" main"中直接创建一个WebSocket。 js文件,因此尝试使用我在互联网上找到的解决方法:
https://github.com/canuckistani/Jetpack-Websocket-Example使用page-worker作为main和WebSocket代码之间的一种代理。当我实现这段代码时,我的WebSocket连接会立即错误地将{" isTrusted":true}作为唯一信息。
我还尝试使用隐藏框架,因为看起来这是1Password在其FF插件中处理websocket通信的方式,但这也会导致同样的即时错误。
当我在普通的FF实例中打开一个websocket连接到我的服务器时,它完全连接,但到目前为止,我还没有从插件中获得任何工作。
使用PageWorker:
var pw = pageWorker.Page({
contentUrl: self.data.url('com.html'),
contentScriptFile: self.data.url('com.js')
})
com.html:
<!DOCTYPE HTML>
<html>
<body>
</body>
</html>
com.js:
document.onready = launchCom();
// Could this need to be on ready?
function launchCom() {
console.log("[com.js] launchCom Called");
var wsAvailable = false;
if ("WebSocket" in window) {
console.log("[com.js] Detected Websocket in Window, attempting to open...");
// WebSocket is supported.
ws = new WebSocket('ws://localhost:9001');
wsAvailable = true;
} else {
console.log("[com.js] Websocket is not supported, upgrade your browser!");
}
}
ws.onmessage = function(event) {
console.log(event.data);
}
ws.onopen = function(evt) {
console.log("[com.js] ws opened. evt: " + evt);
}
ws.onerror = function(evt) {
console.log("[com.js] ws error: " + JSON.stringify(evt));
}
运行此结果:
console.log: xxx: [com.js] launchCom Called
console.log: xxx: [com.js] Detected Websocket in Window, attempting to open...
console.log: xxx: [com.js] ws error: {"isTrusted":true}
console.log: xxx: [com.js] ws closed. evt: {"isTrusted":true}
非常感谢任何帮助!
答案 0 :(得分:0)
我也陷入了类似的情况,因为websocket无法直接在main.js中实现。我也和你做的一样,可能是服务器拒绝连接。我的代码中的代码段如下所示:
main.js
var wsWorker = require('sdk/page-worker').Page({
contentURL: "./firefoxScript/webSocket.html",
contentScriptFile : ["./firefoxScript/webSocket.js"]
});
webSocket.html
<html>
<head>
<title></title>
</head>
<body>
</body>
</html>
webSocket.js
var ws = new WebSocket('ws://localhost:9451');
ws.onopen = function() {
console.log('Connection open...');
};
ws.onclose = function() {
console.log('Connection closed...');
};
ws.onmessage = function(event) {
console.log('Message recieved...');
};
ws.onerror = function(event) {
console.log('Connection Error...');
};
这对我来说非常合适。
答案 1 :(得分:0)
我已经解决了这个问题:
我在我的OS X应用程序中使用https://github.com/zwopple/PocketSocket作为我的服务器,而PocketSocket和FF似乎存在问题。
从
更改PocketSocket的PSWebSocketDriver.m第87行代码后[[headers[@"Connection"] lowercaseString] isEqualToString:@"upgrade"]
到
[[headers[@"Connection"] lowercaseString] containsString:@"upgrade"]
每https://github.com/zwopple/PocketSocket/issues/34, 我能够使用原始代码从FF插件打开WebSocket连接,但是服务器在消息上出错了。
在about:config允许的消息中将network.websocket.extensions.permessage-deflate设置为false所以我添加了
require("sdk/preferences/service").set("network.websocket.extensions.permessage-deflate", false);
到我的main.js并且正在工作!
对PocketSocket代码的微小改动对服务器与其他WebSocket客户端的交互没有任何影响。