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