我一直在研究与运行WebSocket服务器的本地应用程序交互的浏览器扩展。Safari和Chrome扩展非常容易实现,在经历了一些对FF开发的头痛之后,我想我可以像在其他浏览器中一样实现WebSockets。然而,我遇到了一些问题。
我知道我不能直接在"main"js文件中创建WebSocket,所以我尝试使用我在互联网上找到的解决方案:
https://github.com/canuckistani/Jetpack-Websocket-Example使用页面工作者作为main和WebSocket代码之间的某种代理。当我实现这段代码时,我的WebSocket连接会立即将w/{"isTrusted":true}作为唯一信息出错。
我还尝试使用隐藏框架,因为这似乎是1Password在其FF Addon中处理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}
如有任何帮助,我们将不胜感激!
我已经解决了问题:
我正在使用https://github.com/zwopple/PocketSocket在我的OSX应用程序中作为我的服务器,并且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客户端的交互产生任何影响。
我也遇到了类似的情况,因为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...');
};
它对我来说运行得很好。