Safari扩展:WebSocket连接失败调用onclose而不是onerror,也没有例外

时间:2014-10-27 18:27:26

标签: javascript safari websocket safari-extension

我正在为Firefox,Chrome和Safari编写浏览器扩展程序。当尝试使用Safari扩展连接到WebSocket服务器时,没有服务器侦听特定端口,我的Safari扩展不会抛出异常,也不会调用错误。相反,正在调用Safari扩展的onclose处理程序。我也在控制台中看到了这条消息:

[Error] WebSocket network error: The operation couldn’t be completed. Connection refused (global.html, line 0)

在Firefox和Chrome上,它似乎正确处理了AFAIK并调用了错误。

我只是做这样的事情:

var socket = new WebSocket('ws://127.0.0.1:'+inPort, inHandlerName);
socket.binaryType = "arraybuffer";

然后声明onopen,onclose,onerror和onmessage的处理程序。 inPort是9000,inHandlerName是一个类似“global-handler”的字符串。我在每个WebSocket处理程序中添加了异常处理程序,并且还有具有创建WebSocket的代码的函数,但我没有看到任何异常被捕获。

这是一个已知问题吗?有没有办法找出连接是否失败?

编辑: 这也发生在Safari的简单网页上:

        var theSocket = new WebSocket('ws://127.0.0.1:9000', 'global-message');

        theSocket.onopen = function()
        {
            console.log("onopen");
        };
        theSocket.onerror = function()
        {
            console.log("onerror");
        };
        theSocket.onmessage = function()
        {
            console.log("onmessage");
        };
        theSocket.onclose = function()
        {
            console.log("onclose");
        };

1 个答案:

答案 0 :(得分:8)

这看起来并不像它的工作方式,但在onclose消息中,我得到了这样的事件参数:

theSocket.onclose = function(event)

并且该事件包含一个名为code的字段。当我无法连接到服务器时,代码值为1006.我目前已修复它,以便检查它是否在Safari中运行然后检查:

if(event.code == 1006)

如果是这样,我将在Firefox和Chrome的错误案例中执行相同的处理。