зеркало из https://github.com/mozilla/gecko-dev.git
93 строки
2.6 KiB
JavaScript
93 строки
2.6 KiB
JavaScript
"use strict";
|
|
|
|
/**
|
|
* In this test, we crash an out-of-process iframe and
|
|
* verify that :
|
|
* 1. the "oop-browser-crashed" event is dispatched with
|
|
* the browsing context of the crashed oop subframe.
|
|
* 2. the crashed subframe is now pointing at "about:framecrashed"
|
|
* page.
|
|
*/
|
|
add_task(async function() {
|
|
// Open a new window with fission enabled.
|
|
ok(
|
|
SpecialPowers.useRemoteSubframes,
|
|
"This test only makes sense of we can use OOP iframes."
|
|
);
|
|
|
|
await BrowserTestUtils.withNewTab(
|
|
{
|
|
gBrowser,
|
|
url: "about:blank",
|
|
},
|
|
async browser => {
|
|
let rootBC = browser.browsingContext;
|
|
|
|
// If we load example.com in an injected subframe, we assume that this
|
|
// will load in its own subprocess, which we can then crash.
|
|
let iframeBC = await SpecialPowers.spawn(browser, [], async () => {
|
|
let iframe = content.document.createElement("iframe");
|
|
iframe.setAttribute("src", "http://example.com");
|
|
|
|
content.document.body.appendChild(iframe);
|
|
await ContentTaskUtils.waitForEvent(iframe, "load");
|
|
return iframe.frameLoader.browsingContext;
|
|
});
|
|
|
|
is(iframeBC.parent, rootBC, "oop frame has root as parent");
|
|
|
|
let eventFiredPromise = BrowserTestUtils.waitForEvent(
|
|
browser,
|
|
"oop-browser-crashed"
|
|
);
|
|
|
|
BrowserTestUtils.crashFrame(
|
|
browser,
|
|
true /* shouldShowTabCrashPage */,
|
|
true /* shouldClearMinidumps */,
|
|
iframeBC
|
|
);
|
|
|
|
info("Waiting for oop-browser-crashed event.");
|
|
await eventFiredPromise.then(event => {
|
|
ok(!event.isTopFrame, "should not be reporting top-level frame crash");
|
|
|
|
isnot(
|
|
event.browsingContextId,
|
|
rootBC,
|
|
"top frame browsing context id not expected."
|
|
);
|
|
|
|
is(
|
|
event.browsingContextId,
|
|
iframeBC.id,
|
|
"oop frame browsing context id expected."
|
|
);
|
|
});
|
|
|
|
// The BrowsingContext is re-used, but the window global might still be
|
|
// getting set up at this point, so wait until it's been initialized.
|
|
let {
|
|
subject: windowGlobal,
|
|
} = await BrowserUtils.promiseObserved("window-global-created", wgp =>
|
|
wgp.documentURI.spec.startsWith("about:framecrashed")
|
|
);
|
|
|
|
is(
|
|
windowGlobal,
|
|
iframeBC.currentWindowGlobal,
|
|
"Resolved on expected window global"
|
|
);
|
|
|
|
let newIframeURI = await SpecialPowers.spawn(iframeBC, [], async () => {
|
|
return content.document.documentURI;
|
|
});
|
|
|
|
ok(
|
|
newIframeURI.startsWith("about:framecrashed"),
|
|
"The iframe is now pointing at about:framecrashed"
|
|
);
|
|
}
|
|
);
|
|
});
|