зеркало из https://github.com/mozilla/gecko-dev.git
167 строки
4.9 KiB
HTML
167 строки
4.9 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
-->
|
|
<head>
|
|
<title>Basic websocket frame interception test</title>
|
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
|
</head>
|
|
<body>
|
|
<script class="testbody" type="text/javascript">
|
|
|
|
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
|
|
|
|
const URI = "ws://mochi.test:8888/tests/dom/base/test/file_websocket_basic";
|
|
|
|
var frameReceivedCounter = 0;
|
|
var frameSentCounter = 0;
|
|
var webSocketCreatedCounter = 0;
|
|
var webSocketOpenedCounter = 0;
|
|
var webSocketMessageAvailableCounter = 0;
|
|
var webSocketClosedCounter = 0;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
var tests = [
|
|
{ payload: "Hello world!" },
|
|
{ payload: (function() { var buffer = ""; for (var i = 0; i < 120; ++i) buffer += i; return buffer; }()) },
|
|
]
|
|
|
|
var innerId =
|
|
window.top.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
|
|
ok(innerId, "We have a valid innerWindowID: " + innerId);
|
|
|
|
var service = Cc["@mozilla.org/websocketevent/service;1"]
|
|
.getService(Ci.nsIWebSocketEventService);
|
|
ok(!!service, "We have the nsIWebSocketEventService");
|
|
|
|
var listener = {
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebSocketEventListener]),
|
|
|
|
webSocketCreated: function(aWebSocketSerialID, aURI, aProtocols) {
|
|
info("WebSocketCreated");
|
|
|
|
is(aURI, URI, "URI matches");
|
|
is(aProtocols, "frame", "Protocol matches");
|
|
|
|
webSocketCreatedCounter++;
|
|
},
|
|
|
|
webSocketOpened: function(aWebSocketSerialID, aEffectiveURI, aProtocols, aExtensions) {
|
|
info("WebSocketOpened");
|
|
|
|
is(aEffectiveURI, URI, "EffectiveURI matches");
|
|
is(aProtocols, "frame", "Protocol matches");
|
|
is(aExtensions, "permessage-deflate", "No extensions");
|
|
|
|
webSocketOpenedCounter++;
|
|
},
|
|
|
|
webSocketMessageAvailable: function(aWebSocketSerialID, aData, aMessageType) {
|
|
info("WebSocketMessageAvailable");
|
|
|
|
if (tests.length) {
|
|
is(aData, tests[0].payload, "Message matches!");
|
|
is(aMessageType, Ci.nsIWebSocketEventListener.TYPE_STRING, "The type is 'string'");
|
|
|
|
webSocketMessageAvailableCounter++;
|
|
|
|
tests.shift();
|
|
if (tests.length) {
|
|
ws.send(tests[0].payload);
|
|
} else {
|
|
ws.send("end");
|
|
}
|
|
}
|
|
},
|
|
|
|
webSocketClosed: function(aWebSocketSerialID, aWasClean,
|
|
aCode, aReason) {
|
|
info("WebSocketClosed");
|
|
|
|
ok(aWasClean, "The socket is closed in a clean state");
|
|
is(aCode, 1000, "Exit code 1000");
|
|
ok(!aReason.length, "No reason");
|
|
|
|
webSocketClosedCounter++;
|
|
checkListener();
|
|
},
|
|
|
|
frameReceived: function(aWebSocketSerialID, aFrame) {
|
|
ok(!!aFrame, "We have received a frame");
|
|
|
|
if (tests.length) {
|
|
ok(aFrame.timeStamp, "Checking timeStamp: " + aFrame.timeStamp);
|
|
is(aFrame.finBit, true, "Checking finBit");
|
|
is(aFrame.rsvBit1, true, "Checking rsvBit1");
|
|
is(aFrame.rsvBit2, false, "Checking rsvBit2");
|
|
is(aFrame.rsvBit3, false, "Checking rsvBit3");
|
|
is(aFrame.opCode, aFrame.OPCODE_TEXT, "Checking opCode");
|
|
is(aFrame.maskBit, false, "Checking maskBit");
|
|
is(aFrame.mask, 0, "Checking mask");
|
|
is(aFrame.payload, tests[0].payload, "Checking payload: " + aFrame.payload);
|
|
}
|
|
|
|
frameReceivedCounter++;
|
|
},
|
|
|
|
frameSent: function(aWebSocketSerialID, aFrame) {
|
|
ok(!!aFrame, "We have sent a frame");
|
|
|
|
if (tests.length) {
|
|
ok(aFrame.timeStamp, "Checking timeStamp: " + aFrame.timeStamp);
|
|
is(aFrame.finBit, true, "Checking finBit");
|
|
is(aFrame.rsvBit1, true, "Checking rsvBit1");
|
|
is(aFrame.rsvBit2, false, "Checking rsvBit2");
|
|
is(aFrame.rsvBit3, false, "Checking rsvBit3");
|
|
is(aFrame.opCode, aFrame.OPCODE_TEXT, "Checking opCode");
|
|
is(aFrame.maskBit, true, "Checking maskBit");
|
|
ok(!!aFrame.mask, "Checking mask: " + aFrame.mask);
|
|
is(aFrame.payload, tests[0].payload, "Checking payload: " + aFrame.payload);
|
|
}
|
|
|
|
frameSentCounter++;
|
|
}
|
|
};
|
|
|
|
service.addListener(innerId, listener);
|
|
ok(true, "Listener added");
|
|
|
|
function checkListener() {
|
|
service.removeListener(innerId, listener);
|
|
|
|
ok(frameReceivedCounter, "We received some frames!");
|
|
ok(frameSentCounter, "We sent some frames!");
|
|
ok(webSocketCreatedCounter, "We have a create notification");
|
|
ok(webSocketOpenedCounter, "We have a open notification");
|
|
ok(webSocketMessageAvailableCounter, "We have a messageAvailable notification");
|
|
ok(webSocketClosedCounter, "We have a close notification");
|
|
SimpleTest.finish();
|
|
}
|
|
|
|
var ws = new WebSocket(URI, "frame");
|
|
ws.onopen = function(e) {
|
|
info("onopen");
|
|
|
|
ws.send(tests[0].payload);
|
|
}
|
|
|
|
ws.onclose = function(e) {
|
|
info("onclose");
|
|
}
|
|
|
|
ws.onmessage = function(e) {
|
|
info("onmessage");
|
|
if (tests.length) {
|
|
is(e.data, tests[0].payload, "Wrong data");
|
|
}
|
|
}
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|