tor-browser

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

browser_event_source_reconnect_after_disconnect.js (3025B)


      1 var { HttpServer } = ChromeUtils.importESModule(
      2  "resource://testing-common/httpd.sys.mjs"
      3 );
      4 
      5 function eventSourcePageHandler(metadata, response) {
      6  response.setStatusLine(metadata.httpVersion, 200, "OK");
      7  response.setHeader("Content-Type", "text/html", false);
      8 
      9  // An HTML page that sets up the EventSource
     10  let pageContent = `
     11    <html>
     12      <body>
     13        <script>
     14          let es = new EventSource("/eventstream");
     15          es.onopen = function() {
     16            console.log("send es_open");
     17            window.dispatchEvent(new CustomEvent('es-open'));
     18          };
     19          es.onmessage = function(err) {
     20            console.log("send es_message");
     21            window.dispatchEvent(new CustomEvent('es-message'));
     22          };
     23          es.onerror = function(err) {
     24            console.log("send es_error");
     25            window.dispatchEvent(new CustomEvent('es-error'));
     26          
     27        };
     28        </script>
     29      </body>
     30    </html>`;
     31 
     32  response.write(pageContent);
     33 }
     34 
     35 const server = new HttpServer();
     36 server.start(-1);
     37 const SERVER_PORT = server.identity.primaryPort;
     38 
     39 registerCleanupFunction(async () => {
     40  await server.stop();
     41 });
     42 
     43 function eventStreamHandler(metadata, response) {
     44  response.setStatusLine(metadata.httpVersion, 200, "OK");
     45  response.setHeader("Content-Type", "text/event-stream", false);
     46  response.write("retry: 500\n");
     47 }
     48 
     49 server.registerPathHandler("/page", eventSourcePageHandler);
     50 server.registerPathHandler("/eventstream", eventStreamHandler);
     51 
     52 add_task(async function testReconnectAfterDisconnect() {
     53  info("Connect to the server to retrieve the EventSource doc");
     54 
     55  let tab = await BrowserTestUtils.openNewForegroundTab(
     56    gBrowser,
     57    `http://localhost:${server.identity.primaryPort}/page`
     58  );
     59 
     60  let browser = tab.linkedBrowser;
     61 
     62  // Define a function to handle events in the content process
     63  async function contentEventHandler() {
     64    return new Promise(resolve => {
     65      content.addEventListener(
     66        "es-open",
     67        function () {
     68          resolve("es-open");
     69        },
     70        { once: true }
     71      );
     72 
     73      content.addEventListener(
     74        "es-error",
     75        function () {
     76          resolve("es-error");
     77        },
     78        { once: true }
     79      );
     80    });
     81  }
     82 
     83  // Execute the event handler in the content process
     84  let eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
     85  Assert.equal(eventType, "es-open", "EventSource opened successfully");
     86 
     87  // Stop the server; we expect an error
     88  await server.stop();
     89 
     90  eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
     91  Assert.equal(
     92    eventType,
     93    "es-error",
     94    "EventSource encountered an error after server close"
     95  );
     96 
     97  // Restart the server; the eventSource should automatically reconnect
     98  server.start(SERVER_PORT);
     99 
    100  eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
    101  Assert.equal(
    102    eventType,
    103    "es-open",
    104    "EventSource opened successfully after server restart"
    105  );
    106 
    107  BrowserTestUtils.removeTab(tab);
    108 });