summaryrefslogtreecommitdiffstats
path: root/dom/base/test/browser_event_source_reconnect_after_disconnect.js
blob: e92f5920a28f4426654b584548d5a7dcdc55ca79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
var { HttpServer } = ChromeUtils.importESModule(
  "resource://testing-common/httpd.sys.mjs"
);

function eventSourcePageHandler(metadata, response) {
  response.setStatusLine(metadata.httpVersion, 200, "OK");
  response.setHeader("Content-Type", "text/html", false);

  // An HTML page that sets up the EventSource
  let pageContent = `
    <html>
      <body>
        <script>
          let es = new EventSource("/eventstream");
          es.onopen = function() {
            console.log("send es_open");
            window.dispatchEvent(new CustomEvent('es-open'));
          };
          es.onmessage = function(err) {
            console.log("send es_message");
            window.dispatchEvent(new CustomEvent('es-message'));
          };
          es.onerror = function(err) {
            console.log("send es_error");
            window.dispatchEvent(new CustomEvent('es-error'));
          
        };
        </script>
      </body>
    </html>`;

  response.write(pageContent);
}

const server = new HttpServer();
server.start(-1);
const SERVER_PORT = server.identity.primaryPort;

registerCleanupFunction(async () => {
  await server.stop();
});

function eventStreamHandler(metadata, response) {
  response.setStatusLine(metadata.httpVersion, 200, "OK");
  response.setHeader("Content-Type", "text/event-stream", false);
  response.write("retry: 500\n");
}

server.registerPathHandler("/page", eventSourcePageHandler);
server.registerPathHandler("/eventstream", eventStreamHandler);

add_task(async function testReconnectAfterDisconnect() {
  info("Connect to the server to retrieve the EventSource doc");

  let tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    `http://localhost:${server.identity.primaryPort}/page`
  );

  let browser = tab.linkedBrowser;

  // Define a function to handle events in the content process
  async function contentEventHandler() {
    return new Promise(resolve => {
      content.addEventListener(
        "es-open",
        function () {
          resolve("es-open");
        },
        { once: true }
      );

      content.addEventListener(
        "es-error",
        function () {
          resolve("es-error");
        },
        { once: true }
      );
    });
  }

  // Execute the event handler in the content process
  let eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
  Assert.equal(eventType, "es-open", "EventSource opened successfully");

  // Stop the server; we expect an error
  await server.stop();

  eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
  Assert.equal(
    eventType,
    "es-error",
    "EventSource encountered an error after server close"
  );

  // Restart the server; the eventSource should automatically reconnect
  server.start(SERVER_PORT);

  eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
  Assert.equal(
    eventType,
    "es-open",
    "EventSource opened successfully after server restart"
  );

  BrowserTestUtils.removeTab(tab);
});