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 });