Bug 1892041 - Part 1: Update test262 features. r=spidermonkey-reviewers,dminor
[gecko.git] / dom / base / test / browser_event_source_reconnect_after_disconnect.js
blobe92f5920a28f4426654b584548d5a7dcdc55ca79
1 var { HttpServer } = ChromeUtils.importESModule(
2   "resource://testing-common/httpd.sys.mjs"
3 );
5 function eventSourcePageHandler(metadata, response) {
6   response.setStatusLine(metadata.httpVersion, 200, "OK");
7   response.setHeader("Content-Type", "text/html", false);
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>`;
32   response.write(pageContent);
35 const server = new HttpServer();
36 server.start(-1);
37 const SERVER_PORT = server.identity.primaryPort;
39 registerCleanupFunction(async () => {
40   await server.stop();
41 });
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");
49 server.registerPathHandler("/page", eventSourcePageHandler);
50 server.registerPathHandler("/eventstream", eventStreamHandler);
52 add_task(async function testReconnectAfterDisconnect() {
53   info("Connect to the server to retrieve the EventSource doc");
55   let tab = await BrowserTestUtils.openNewForegroundTab(
56     gBrowser,
57     `http://localhost:${server.identity.primaryPort}/page`
58   );
60   let browser = tab.linkedBrowser;
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       );
73       content.addEventListener(
74         "es-error",
75         function () {
76           resolve("es-error");
77         },
78         { once: true }
79       );
80     });
81   }
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");
87   // Stop the server; we expect an error
88   await server.stop();
90   eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
91   Assert.equal(
92     eventType,
93     "es-error",
94     "EventSource encountered an error after server close"
95   );
97   // Restart the server; the eventSource should automatically reconnect
98   server.start(SERVER_PORT);
100   eventType = await SpecialPowers.spawn(browser, [], contentEventHandler);
101   Assert.equal(
102     eventType,
103     "es-open",
104     "EventSource opened successfully after server restart"
105   );
107   BrowserTestUtils.removeTab(tab);