2

Я работаю над расширениями браузера, которые взаимодействуют с локальным приложением, работающим на сервере WebSocket. Safari и Chrome Extensions были очень просты в реализации, и после некоторой головной боли, которая ощущала развитие FF, я думал, что смогу реализовать WebSockets, как и в других браузерах. Однако у меня были некоторые проблемы.Немедленное разъединение с использованием websocket в FireFox Addon

Я понимаю, что я не могу напрямую создать WebSocket в «основной» файл JS, и поэтому попытались использовать обходные пути, которые я нашел в Интернете:

https://github.com/canuckistani/Jetpack-Websocket-Example использует страницу-работника как своего рода прокси между основным и кодом WebSocket. Когда я реализую этот код, мое соединение WebSocket сразу же выводит ошибки w/{"isTrusted": true} как единственную информацию.

Я также попытался использовать скрытый кадр, поскольку он выглядит так, как 1Password имеет дело с связью websocket в их FF Addon, но это также приводит к той же самой непосредственной ошибке.

Когда я просто открываю подключение к моему серверу в своем обычном экземпляре FF, он прекрасно соединяется, но до сих пор я не получил ничего от работы с аддоном.

делает 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

Я решил эту проблему:

Я использую https://github.com/zwopple/PocketSocket в моем OS X приложения, как мой сервер, и, как представляется, проблема с PocketSocket и FF.

После смены PSWebSocketDriver от PocketSocket.м линия 87 код из

[[headers[@"Connection"] lowercaseString] isEqualToString:@"upgrade"] 

в

[[headers[@"Connection"] lowercaseString] containsString:@"upgrade"] 

на https://github.com/zwopple/PocketSocket/issues/34, я смог открыть соединение WebSocket из FF аддон, используя исходный код, но сервер ошибочный на сообщения.

Установка network.websocket.extensions.permessage-выкачать ложь в о: конфигурации разрешено сообщения для отправки, поэтому я добавил

require("sdk/preferences/service").set("network.websocket.extensions.permessage-deflate", false); 

моим main.js и Everthing работает!

Крошечное изменение кода PocketSocket не оказало влияния на взаимодействие сервера с другими клиентами WebSocket.

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...'); 
}; 

Это прекрасно работает нормально для меня.