tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_websocket_frame.html (4787B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--
      4 -->
      5 <head>
      6  <title>Basic websocket frame interception test</title>
      7  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
      8  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
      9 </head>
     10 <body>
     11 <script class="testbody" type="text/javascript">
     12 
     13 const URI = "ws://mochi.test:8888/tests/dom/websocket/tests/file_websocket_basic";
     14 
     15 var frameReceivedCounter = 0;
     16 var frameSentCounter = 0;
     17 var webSocketCreatedCounter = 0;
     18 var webSocketOpenedCounter = 0;
     19 var webSocketMessageAvailableCounter = 0;
     20 var webSocketClosedCounter = 0;
     21 
     22 var tests = [
     23  { payload: "Hello world!" },
     24  { payload: (function() { var buffer = ""; for (var i = 0; i < 120; ++i) buffer += i; return buffer; }()) },
     25 ]
     26 
     27 var innerId = window.windowGlobalChild.innerWindowId;
     28 ok(innerId, "We have a valid innerWindowID: " + innerId);
     29 
     30 var service = Cc["@mozilla.org/websocketevent/service;1"]
     31                .getService(Ci.nsIWebSocketEventService);
     32 ok(!!service, "We have the nsIWebSocketEventService");
     33 
     34 var listener = {
     35  QueryInterface: ChromeUtils.generateQI(["nsIWebSocketEventListener"]),
     36 
     37  webSocketCreated(aWebSocketSerialID, aURI, aProtocols) {
     38    info("WebSocketCreated");
     39 
     40    is(aURI, URI, "URI matches");
     41    is(aProtocols, "frame", "Protocol matches");
     42 
     43    webSocketCreatedCounter++;
     44  },
     45 
     46  webSocketOpened(aWebSocketSerialID, aEffectiveURI, aProtocols, aExtensions, httpChannelId) {
     47    info("WebSocketOpened");
     48 
     49    is(aEffectiveURI, URI, "EffectiveURI matches");
     50    is(aProtocols, "frame", "Protocol matches");
     51    is(aExtensions, "permessage-deflate", "No extensions");
     52    ok(httpChannelId > 0, "Channel ID received");
     53 
     54    webSocketOpenedCounter++;
     55  },
     56 
     57  webSocketMessageAvailable(aWebSocketSerialID, aData, aMessageType) {
     58    info("WebSocketMessageAvailable");
     59 
     60    if (tests.length) {
     61      is(aData, tests[0].payload, "Message matches!");
     62      is(aMessageType, Ci.nsIWebSocketEventListener.TYPE_STRING, "The type is 'string'");
     63 
     64      webSocketMessageAvailableCounter++;
     65 
     66      tests.shift();
     67      if (tests.length) {
     68        ws.send(tests[0].payload);
     69      } else {
     70        ws.send("end");
     71      }
     72    }
     73  },
     74 
     75  webSocketClosed(aWebSocketSerialID, aWasClean,
     76                            aCode, aReason) {
     77    info("WebSocketClosed");
     78 
     79    ok(aWasClean, "The socket is closed in a clean state");
     80    is(aCode, 1000, "Exit code 1000");
     81    ok(!aReason.length, "No reason");
     82 
     83    webSocketClosedCounter++;
     84    checkListener();
     85  },
     86 
     87  frameReceived(aWebSocketSerialID, aFrame) {
     88    ok(!!aFrame, "We have received a frame");
     89 
     90    if (tests.length) {
     91      ok(aFrame.timeStamp, "Checking timeStamp: " + aFrame.timeStamp);
     92      is(aFrame.finBit, true, "Checking finBit");
     93      is(aFrame.rsvBit1, true, "Checking rsvBit1");
     94      is(aFrame.rsvBit2, false, "Checking rsvBit2");
     95      is(aFrame.rsvBit3, false, "Checking rsvBit3");
     96      is(aFrame.opCode, aFrame.OPCODE_TEXT, "Checking opCode");
     97      is(aFrame.maskBit, false, "Checking maskBit");
     98      is(aFrame.mask, 0, "Checking mask");
     99      is(aFrame.payload, tests[0].payload, "Checking payload: " + aFrame.payload);
    100    }
    101 
    102    frameReceivedCounter++;
    103  },
    104 
    105  frameSent(aWebSocketSerialID, aFrame) {
    106    ok(!!aFrame, "We have sent a frame");
    107 
    108    if (tests.length) {
    109      ok(aFrame.timeStamp, "Checking timeStamp: " + aFrame.timeStamp);
    110      is(aFrame.finBit, true, "Checking finBit");
    111      is(aFrame.rsvBit1, true, "Checking rsvBit1");
    112      is(aFrame.rsvBit2, false, "Checking rsvBit2");
    113      is(aFrame.rsvBit3, false, "Checking rsvBit3");
    114      is(aFrame.opCode, aFrame.OPCODE_TEXT, "Checking opCode");
    115      is(aFrame.maskBit, true, "Checking maskBit");
    116      ok(!!aFrame.mask, "Checking mask: " + aFrame.mask);
    117      is(aFrame.payload, tests[0].payload, "Checking payload: " + aFrame.payload);
    118    }
    119 
    120    frameSentCounter++;
    121  }
    122 };
    123 
    124 service.addListener(innerId, listener);
    125 ok(true, "Listener added");
    126 
    127 function checkListener() {
    128  service.removeListener(innerId, listener);
    129 
    130  ok(frameReceivedCounter, "We received some frames!");
    131  ok(frameSentCounter, "We sent some frames!");
    132  ok(webSocketCreatedCounter, "We have a create notification");
    133  ok(webSocketOpenedCounter, "We have a open notification");
    134  ok(webSocketMessageAvailableCounter, "We have a messageAvailable notification");
    135  ok(webSocketClosedCounter, "We have a close notification");
    136  SimpleTest.finish();
    137 }
    138 
    139 var ws = new WebSocket(URI, "frame");
    140 ws.onopen = function() {
    141  info("onopen");
    142 
    143  ws.send(tests[0].payload);
    144 }
    145 
    146 ws.onclose = function() {
    147  info("onclose");
    148 }
    149 
    150 ws.onmessage = function(e) {
    151  info("onmessage");
    152  if (tests.length) {
    153    is(e.data, tests[0].payload, "Wrong data");
    154  }
    155 }
    156 
    157 SimpleTest.waitForExplicitFinish();
    158 
    159 </script>
    160 </body>
    161 </html>