ws.onmessage = function () {
ok(true, "created websocket with http scheme");
};
ws.onclose = function (e) {
shouldCloseCleanly(e);
resolve();
};
});
}
// test2: assure serialization of the connections; // this test expects that the serialization list to connect to the proxy // is empty. function test2() { returnnew Promise(function (resolve) { var waitTest2Part1 = true; var waitTest2Part2 = true;
var ws1 = CreateTestWS( "ws://sub2.test2.example.com/tests/dom/websocket/tests/file_websocket", "test-2.1"
); var ws2 = CreateTestWS( "ws://sub2.test2.example.com/tests/dom/websocket/tests/file_websocket", "test-2.2"
);
var ws2CanConnect = false;
function maybeFinished() { if (!waitTest2Part1 && !waitTest2Part2) {
resolve();
}
}
ws1.onopen = function () {
ok(true, "ws1 open in test 2");
ws2CanConnect = true;
ws1.close();
};
ws1.onclose = function () {
waitTest2Part1 = false;
maybeFinished();
};
ws2.onopen = function () {
ok(ws2CanConnect, "shouldn't connect yet in test-2!");
ws2.close();
};
// test3: client tries to connect to an non-existent ws server; function test3() { returnnew Promise(function (resolve) { var hasError = false; var ws = CreateTestWS("ws://this.websocket.server.probably.does.not.exist");
ws.onopen = shouldNotOpen;
ws.onerror = function () {
hasError = true;
};
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
ok(hasError, "rcvd onerror event");
is(e.code, 1006, "test-3 close code should be 1006 but is:" + e.code);
resolve();
};
});
}
// test4: client tries to connect using a relative url; function test4() { returnnew Promise(function (resolve) { var ws = CreateTestWS("file_websocket", "test-4");
ws.onmessage = function () {
ok(true, "created websocket with relative scheme");
};
ws.onclose = function (e) {
shouldCloseCleanly(e);
resolve();
};
});
}
// test5: client uses an invalid protocol value; function test5() { returnnew Promise(function (resolve) { try {
CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", ""
);
ok(false, "couldn't accept an empty string in the protocol parameter");
} catch (e) {
ok(true, "couldn't accept an empty string in the protocol parameter");
}
try {
CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "\n"
);
ok( false, "couldn't accept any not printable ASCII character in the protocol parameter"
);
} catch (e) {
ok( true, "couldn't accept any not printable ASCII character in the protocol parameter"
);
}
try {
CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test 5"
);
ok(false, "U+0020 not acceptable in protocol parameter");
} catch (e) {
ok(true, "U+0020 not acceptable in protocol parameter");
}
resolve();
});
}
// test6: counter and encoding check; function test6() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-6"
); var counter = 1;
ws.onclose = function (e) {
shouldCloseCleanly(e);
resolve();
};
});
}
// test7: onmessage event origin property check function test7() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://sub2.test2.example.org/tests/dom/websocket/tests/file_websocket", "test-7"
); var gotmsg = false;
ws.onopen = function () {
ok(true, "test 7 open");
};
ws.onmessage = function (e) {
ok(true, "test 7 message");
is(
e.origin, "ws://sub2.test2.example.org", "onmessage origin set to ws:// host"
);
gotmsg = true;
ws.close();
};
ws.onclose = function (e) {
ok(gotmsg, "recvd message in test 7 before close");
shouldCloseCleanly(e);
resolve();
};
});
}
// test8: client calls close() and the server sends the close frame (with no // code or reason) in acknowledgement; function test8() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-8"
);
ws.onclose = function (e) {
shouldCloseCleanly(e); // We called close() with no close code: so pywebsocket will also send no // close code, which translates to code 1005
is(e.code, 1005, "test-8 close code has wrong value:" + e.code);
is(e.reason, "", "test-8 close reason has wrong value:" + e.reason);
resolve();
};
});
}
// test9: client closes the connection before the ws connection is established; function test9() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://test2.example.org/tests/dom/websocket/tests/file_websocket", "test-9"
);
ws._receivedErrorEvent = false;
ws.onopen = shouldNotOpen;
ws.onerror = function () {
ws._receivedErrorEvent = true;
};
ws.onclose = function (e) {
ok(ws._receivedErrorEvent, "Didn't received the error event in test 9.");
shouldCloseNotCleanly(e);
resolve();
};
ws.close();
});
}
// test10: client sends a message before the ws connection is established; function test10() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://sub1.test1.example.com/tests/dom/websocket/tests/file_websocket", "test-10"
);
ws.onclose = function (e) {
shouldCloseCleanly(e);
resolve();
};
try {
ws.send("client data");
ok(false, "Couldn't send data before connecting!");
} catch (e) {
ok(true, "Couldn't send data before connecting!");
}
// test11: a simple hello echo; function test11() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-11"
);
is(ws.readyState, 0, "create bad readyState in test-11!");
ws.onopen = function () {
is(ws.readyState, 1, "open bad readyState in test-11!");
ws.send("client data");
};
ws.onmessage = function (e) {
is(e.data, "server data", "bad received message in test-11!");
ws.close(1000, "Have a nice day");
// this ok() is disabled due to a race condition - it state may have // advanced through 2 (closing) and into 3 (closed) before it is evald // ok(ws.readyState == 2, "onmessage bad readyState in test-11!");
};
ws.onclose = function (e) {
is(ws.readyState, 3, "onclose bad readyState in test-11!");
shouldCloseCleanly(e);
is(e.code, 1000, "test 11 got wrong close code: " + e.code);
is(
e.reason, "Have a nice day", "test 11 got wrong close reason: " + e.reason
);
resolve();
};
});
}
// test12: client sends a message containing unpaired surrogates function test12() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-12"
);
ws.onopen = function () { try { // send an unpaired surrogate
ws._gotMessage = false;
ws.send("a\ud800b");
ok(true, "ok to send an unpaired surrogate");
} catch (e) {
ok( false, "shouldn't fail any more when sending an unpaired surrogate!"
);
}
};
ws.onmessage = function (msg) {
is(
msg.data, "SUCCESS", "Unpaired surrogate in UTF-16 not converted in test-12"
);
ws._gotMessage = true; // Must support unpaired surrogates in close reason, too
ws.close(1000, "a\ud800b");
};
ws.onclose = function (e) {
is(ws.readyState, 3, "onclose bad readyState in test-12!");
ok(ws._gotMessage, "didn't receive message!");
shouldCloseCleanly(e);
is(e.code, 1000, "test 12 got wrong close code: " + e.code);
is(
e.reason, "a\ufffdb", "test 11 didn't get replacement char in close reason: " + e.reason
);
resolve();
};
});
}
// test13: server sends an invalid message; function test13() { returnnew Promise(function (resolve) { // previous versions of this test counted the number of protocol errors // returned, but the protocol stack typically closes down after reporting a // protocol level error - trying to resync is too dangerous
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-13"
);
ws._timesCalledOnError = 0;
ws.onerror = function () {
ws._timesCalledOnError++;
};
ws.onclose = function () {
ok(ws._timesCalledOnError > 0, "no error events");
resolve();
};
});
}
// test14: server sends the close frame, it doesn't close the tcp connection // and it keeps sending normal ws messages; function test14() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-14"
);
ws.onmessage = function () {
ok( false, "shouldn't received message after the server sent the close frame"
);
};
ws.onclose = function (e) {
shouldCloseCleanly(e);
resolve();
};
});
}
// test15: server closes the tcp connection, but it doesn't send the close // frame; function test15() { returnnew Promise(function (resolve) { /* * DISABLED: see comments for test-15 case in file_websocket_wsh.py
*/
resolve();
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-15"
);
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
resolve();
};
// termination of the connection might cause an error event if it happens in OPEN
ws.onerror = function () {};
});
}
// test16: client calls close() and tries to send a message; function test16() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-16"
);
ws.onopen = function () {
ws.close();
ok(
!ws.send("client data"), "shouldn't send message after calling close()"
);
};
ws.onmessage = function () {
ok(false, "shouldn't send message after calling close()");
};
ws.onerror = function () {};
ws.onclose = function () {
resolve();
};
});
}
// test17: see bug 572975 - all event listeners set function test17() { returnnew Promise(function (resolve) { var status_test17 = "not started";
var test17func = function () { var local_ws = new WebSocket( "ws://sub1.test2.example.org/tests/dom/websocket/tests/file_websocket", "test-17"
);
status_test17 = "started";
// The tests that expects that their websockets neither open nor close MUST // be in the end of the tests, i.e. HERE, in order to prevent blocking the other // tests.
// test18: client tries to connect to an http resource; function test18() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket_http_resource.txt"
);
ws.onopen = shouldNotOpen;
ws.onerror = ignoreError;
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
resolve();
};
});
}
// test19: server closes the tcp connection before establishing the ws // connection; function test19() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-19"
);
ws.onopen = shouldNotOpen;
ws.onerror = ignoreError;
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
resolve();
};
});
}
// test20: see bug 572975 - only on error and onclose event listeners set function test20() { returnnew Promise(function (resolve) { var test20func = function () { var local_ws = new WebSocket( "ws://sub1.test1.example.org/tests/dom/websocket/tests/file_websocket", "test-20"
);
local_ws.onerror = function () {
ok(false, "onerror called on test " + current_test + "!");
};
// test21: see bug 572975 - same as test 17, but delete strong event listeners // when receiving the message event; function test21() { returnnew Promise(function (resolve) { var test21func = function () { var local_ws = new WebSocket( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-21"
); var received_message = false;
// test22: server takes too long to establish the ws connection; function test22() { returnnew Promise(function (resolve) { const pref_open = "network.websocket.timeout.open";
SpecialPowers.setIntPref(pref_open, 5);
var ws = CreateTestWS( "ws://sub2.test2.example.org/tests/dom/websocket/tests/file_websocket", "test-22"
);
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
resolve();
};
SpecialPowers.clearUserPref(pref_open);
});
}
// test23: should detect WebSocket on window object; function test23() { returnnew Promise(function (resolve) {
ok("WebSocket" in window, "WebSocket should be available on window object");
resolve();
});
}
// test24: server rejects sub-protocol string function test24() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-does-not-exist"
);
// test25: ctor with valid empty sub-protocol array function test25() { returnnew Promise(function (resolve) { var prots = [];
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
// This test errors because the server requires a sub-protocol, but // the test just wants to ensure that the ctor doesn't generate an // exception
ws.onerror = ignoreError;
ws.onopen = shouldNotOpen;
// test26: ctor with invalid sub-protocol array containing 1 empty element function test26() { returnnew Promise(function (resolve) { var prots = [""];
try {
CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
ok(false, "testing empty element sub protocol array");
} catch (e) {
ok(true, "testing empty sub element protocol array");
}
resolve();
});
}
// test27: ctor with invalid sub-protocol array containing an empty element in // list function test27() { returnnew Promise(function (resolve) { var prots = ["test27", ""];
try {
CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
ok(false, "testing empty element mixed sub protocol array");
} catch (e) {
ok(true, "testing empty element mixed sub protocol array");
}
resolve();
});
}
// test28: ctor using valid 1 element sub-protocol array function test28() { returnnew Promise(function (resolve) { var prots = ["test28"];
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
// test29: ctor using all valid 5 element sub-protocol array function test29() { returnnew Promise(function (resolve) { var prots = ["test29a", "test29b"];
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
// test30: ctor using valid 1 element sub-protocol array with element server // will reject function test30() { returnnew Promise(function (resolve) { var prots = ["test-does-not-exist"]; var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
ws.onopen = shouldNotOpen;
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
resolve();
};
ws.onerror = function () {};
});
}
// test31: ctor using valid 2 element sub-protocol array with 1 element server // will reject and one server will accept function test31() { returnnew Promise(function (resolve) { var prots = ["test-does-not-exist", "test31"]; var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
// test32: ctor using invalid sub-protocol array that contains duplicate items function test32() { returnnew Promise(function (resolve) { var prots = ["test32", "test32"];
try {
CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
ok(false, "testing duplicated element sub protocol array");
} catch (e) {
ok(true, "testing duplicated sub element protocol array");
}
resolve();
});
}
// test33: test for sending/receiving custom close code (but no close reason) function test33() { returnnew Promise(function (resolve) { var prots = ["test33"];
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
ws.onopen = function () {
ok(true, "test 33 open");
ws.close(3131); // pass code but not reason
};
// test35: test for sending custom close code and reason function test35() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-35a"
);
ws.onopen = function () {
ok(true, "test 35a open");
ws.close(3500, "my code");
};
wsb.onclose = function (event) {
ok(true, "test 35b close");
ok(event.wasClean, "test 35b closed cleanly");
is(event.code, 3501, "test 35 custom server code");
is(event.reason, "my code", "test 35 custom server reason");
resolve();
};
};
});
}
// test36: negative test for sending out of range close code function test36() { returnnew Promise(function (resolve) { var prots = ["test-36"];
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
ws.onopen = function () {
ok(true, "test 36 open");
try {
ws.close(13200);
ok(false, "testing custom close code out of range");
} catch (ex) {
ok(true, "testing custom close code out of range");
ws.close(3200);
}
};
var wsb = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-37b"
);
wsb.onopen = function () { // now test that a rejected close code and reason dont persist
ok(true, "test 37b open"); try {
wsb.close(
3101, "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123"
);
ok(false, "testing custom close reason out of range 37b");
} catch (ex) {
ok(true, "testing custom close reason out of range 37b");
wsb.close();
}
};
ws.onclose = function () {
ok(true, "test 40 close");
is(status_test40, "started", "test 40 did not open");
resolve();
};
});
}
// test41: HSTS function test41() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://example.com/tests/dom/websocket/tests/file_websocket", "test-41a",
1
);
ws.onopen = function () {
ok(true, "test 41a open");
is(
ws.url, "ws://example.com/tests/dom/websocket/tests/file_websocket", "test 41a initial ws should not be redirected"
);
ws.close();
};
ws.onclose = function () {
ok(true, "test 41a close");
// Since third-party loads can't set HSTS state, this will not set // HSTS for example.com. var wsb = CreateTestWS( "wss://example.com/tests/dom/websocket/tests/file_websocket", "test-41b",
1
);
wsb.onclose = function () {
ok(true, "test 41b close");
// try ws:// again, it should be done over ws:// again var wsc = CreateTestWS( "ws://example.com/tests/dom/websocket/tests/file_websocket", "test-41c"
);
wsc.onopen = function () {
ok(true, "test 41c open");
is(
wsc.url, "ws://example.com/tests/dom/websocket/tests/file_websocket", "test 41c ws should not be redirected by hsts to wss"
);
wsc.close();
};
// test42: non-char utf-8 sequences function test42() { returnnew Promise(function (resolve) { // test some utf-8 non-characters. They should be allowed in the // websockets context. Test via round trip echo. var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-42"
); var data = ["U+FFFE \ufffe", "U+FFFF \uffff", "U+10FFFF \udbff\udfff"]; var index = 0;
ws.onopen = function () {
ws.send(data[0]);
ws.send(data[1]);
ws.send(data[2]);
};
ws.onmessage = function (e) {
is(
e.data,
data[index], "bad received message in test-42! index=" + index
);
index++; if (index == 3) {
ws.close();
}
};
ws.onclose = function () {
resolve();
};
});
}
// test43: Test setting binaryType attribute function test43() { returnnew Promise(function (resolve) { var prots = ["test-43"];
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket",
prots
);
// test44: Test sending/receving binary ArrayBuffer function test44() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-44"
);
is(ws.readyState, 0, "bad readyState in test-44!");
ws.binaryType = "arraybuffer";
ws.onopen = function () {
is(ws.readyState, 1, "open bad readyState in test-44!"); var buf = new ArrayBuffer(3); // create byte view var view = new Uint8Array(buf);
view[0] = 5;
view[1] = 0; // null byte
view[2] = 7;
ws.send(buf);
};
ws.onmessage = function (e) {
ok(e.data instanceof ArrayBuffer, "Should receive an arraybuffer!"); var view = new Uint8Array(e.data);
ok(
view.length == 2 && view[0] == 0 && view[1] == 4, "testing Reply arraybuffer"
);
ws.close();
};
ws.onclose = function (e) {
is(ws.readyState, 3, "onclose bad readyState in test-44!");
shouldCloseCleanly(e);
resolve();
};
});
}
// test45: Test sending/receving binary Blob function test45() { returnnew Promise(function (resolve) { function test45Real(blobFile) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-45"
);
is(ws.readyState, 0, "bad readyState in test-45!"); // ws.binaryType = "blob"; // Don't need to specify: blob is the default
ws.onopen = function () {
is(ws.readyState, 1, "open bad readyState in test-45!");
ws.send(blobFile);
};
var test45blob;
ws.onmessage = function (e) {
test45blob = e.data;
ok(test45blob instanceof Blob, "We should be receiving a Blob");
ws.close();
};
ws.onclose = function (e) {
is(ws.readyState, 3, "onclose bad readyState in test-45!");
shouldCloseCleanly(e);
// check blob contents var reader = new FileReader();
reader.onload = function () {
is(
reader.result, "flob", "response should be 'flob': got '" + reader.result + "'"
);
};
reader.onerror = function () {
ok(false, "Failed to read blob: error code = " + reader.error.code);
};
reader.onloadend = function () {
resolve();
};
reader.readAsBinaryString(test45blob);
};
}
SpecialPowers.createFiles(
[{ name: "testBlobFile", data: "flob" }], function (files) {
test45Real(files[0]);
}, function (msg) {
ok(false, "Failed to create file for test45: " + msg);
resolve();
}
);
});
}
// test46: Test that we don't dispatch incoming msgs once in CLOSING state function test46() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-46"
);
is(ws.readyState, 0, "create bad readyState in test-46!");
ws.onopen = function () {
is(ws.readyState, 1, "open bad readyState in test-46!");
ws.close();
is(ws.readyState, 2, "close must set readyState to 2 in test-46!");
};
ws.onmessage = function () {
ok(false, "received message after calling close in test-46!");
};
ws.onclose = function (e) {
is(ws.readyState, 3, "onclose bad readyState in test-46!");
shouldCloseCleanly(e);
resolve();
};
});
}
// test47: Make sure onerror/onclose aren't called during close() function test47() { returnnew Promise(function (resolve) { var hasError = false; var ws = CreateTestWS( "ws://another.websocket.server.that.probably.does.not.exist"
);
ws.onopen = shouldNotOpen;
ws.onerror = function () {
is(
ws.readyState,
3, "test-47: readyState should be CLOSED(3) in onerror: got " +
ws.readyState
);
ok(!ws._withinClose, "onerror() called during close()!");
hasError = true;
};
ws.onclose = function (e) {
shouldCloseNotCleanly(e);
ok(hasError, "test-47: should have called onerror before onclose");
is(
ws.readyState,
3, "test-47: readyState should be CLOSED(3) in onclose: got " +
ws.readyState
);
ok(!ws._withinClose, "onclose() called during close()!");
is(e.code, 1006, "test-47 close code should be 1006 but is:" + e.code);
resolve();
};
// Call close before we're connected: throws error // Make sure we call onerror/onclose asynchronously
ws._withinClose = 1;
ws.close(3333, "Closed before we were open: error");
ws._withinClose = 0;
is(
ws.readyState,
2, "test-47: readyState should be CLOSING(2) after close(): got " +
ws.readyState
);
});
}
// test48: see bug 1227136 - client calls close() from onopen() and waits until // WebSocketChannel::mSocketIn is nulled out on socket thread. function test48() { returnnew Promise(function (resolve) { const pref_close = "network.websocket.timeout.close";
SpecialPowers.setIntPref(pref_close, 1);
var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-48"
);
ws.onopen = function () {
ws.close();
var date = new Date(); var curDate = null; do {
curDate = new Date();
} while (curDate - date < 1500);
};
ws.onclose = function () {
ok(true, "ws close in test 48");
resolve();
};
SpecialPowers.clearUserPref(pref_close);
});
}
function test49() { returnnew Promise(function (resolve) { var ws = CreateTestWS( "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket", "test-49"
); var gotError = 0;
ok(ws.readyState == 0, "create bad readyState in test-49!");
ws.onopen = function () {
ok(false, "Connection must fail in test-49");
};
ws.onerror = function () {
gotError = 1;
};
ws.onclose = function () {
ok(gotError, "Should get error in test-49!");
resolve();
};
});
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.