Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
async function promiseMessageEvent(window) {
let event = await new Promise(resolve => {
window.addEventListener("message", resolve, { once: true });
});
return event.data;
}
add_task(async function test_deferred_task_in_window() {
const windowlessBrowser = Services.appShell.createWindowlessBrowser(true);
const { document } = windowlessBrowser;
const messagePromise = promiseMessageEvent(document.defaultView);
let script = document.createElement("script");
script.src = "resource://test/test_DeferredTask_window/test_basics.js";
document.documentElement.append(script);
Assert.equal(
await messagePromise,
"arm_and_wait_should_run",
"Basic operations of DeferredTask should work in a window context"
);
windowlessBrowser.close();
});
add_task(async function test_deferred_task_past_unload() {
const windowlessBrowser = Services.appShell.createWindowlessBrowser(true);
const { document } = windowlessBrowser;
const results = [];
await new Promise(resolve => {
let iframe = document.createElement("iframe");
document.documentElement.append(iframe);
iframe.contentWindow.reportTestResult = msg => results.push(msg);
let script = iframe.contentDocument.createElement("script");
script.src = "resource://test/test_DeferredTask_window/test_iframe.js";
script.onload = () => resolve();
iframe.contentDocument.documentElement.append(script);
});
// The DeferredTask in test_iframe.js have short deadlines. Wait a little bit
// more to see if the script would run and notify us.
await new Promise(r => document.defaultView.setTimeout(r, 100));
// Sanity check: the iframe was removed.
Assert.equal(document.defaultView.frames.length, 0, "Frame was removed");
// As a sanity check we verify that the iframe can send "removing_iframe",
// but other than that we should not get any other message.
Assert.deepEqual(
results,
["removing_iframe"],
"DeferredTask should not run after the window/iframe unloads"
);
windowlessBrowser.close();
});