Bug 1328501 - Part 2: Add test case. r=smaug

MozReview-Commit-ID: HpsK5HeHRO0

--HG--
extra : rebase_source : d6896ddcb938c377a9e0ca26c70782cf974dad3e
This commit is contained in:
Samael Wang 2017-09-11 18:09:18 +08:00
parent 33a5d73d1a
commit 6ee7658d7e
5 changed files with 115 additions and 0 deletions

View File

@ -36,6 +36,9 @@ support-files =
file_bug852909.png
file_bug1046022.html
file_bug1206879.html
file_bug1328501.html
file_bug1328501_frame.html
file_bug1328501_framescript.js
file_multiple_pushState.html
print_postdata.sjs
test-form_sjis.html
@ -50,6 +53,7 @@ support-files =
[browser_bug1206879.js]
[browser_bug1309900_crossProcessHistoryNavigation.js]
[browser_bug1328501.js]
[browser_bug1347823.js]
[browser_bug134911.js]
[browser_bug234628-1.js]

View File

@ -0,0 +1,38 @@
const HTML_URL = "http://mochi.test:8888/browser/docshell/test/browser/file_bug1328501.html";
const FRAME_URL = "http://mochi.test:8888/browser/docshell/test/browser/file_bug1328501_frame.html";
const FRAME_SCRIPT_URL = "chrome://mochitests/content/browser/docshell/test/browser/file_bug1328501_framescript.js";
add_task(async function testMultiFrameRestore() {
await BrowserTestUtils.withNewTab({gBrowser, url: HTML_URL}, async function(browser) {
// Navigate 2 subframes and load about:blank.
let browserLoaded = BrowserTestUtils.browserLoaded(browser);
await ContentTask.spawn(browser, FRAME_URL, async function(FRAME_URL) {
function frameLoaded(frame) {
frame.contentWindow.location = FRAME_URL;
return new Promise(r => frame.onload = r);
}
let frame1 = content.document.querySelector("#testFrame1");
let frame2 = content.document.querySelector("#testFrame2");
ok(frame1, "check found testFrame1");
ok(frame2, "check found testFrame2");
await frameLoaded(frame1);
await frameLoaded(frame2);
content.location = "dummy_page.html";
});
await browserLoaded;
// Load a frame script to query nsIDOMWindow on "http-on-opening-request",
// which will force about:blank content viewers being created.
browser.messageManager.loadFrameScript(FRAME_SCRIPT_URL, false);
// The frame script also forwards frames-loaded.
let framesLoaded = BrowserTestUtils.waitForMessage(browser.messageManager, "test:frames-loaded");
browser.goBack();
await framesLoaded;
await new Promise(r => setTimeout(r, 1000));
await ContentTask.spawn(browser, FRAME_URL, (FRAME_URL) => {
is(content.document.querySelector("#testFrame1").contentWindow.location.href, FRAME_URL);
is(content.document.querySelector("#testFrame2").contentWindow.location.href, FRAME_URL);
})
})
});

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Page with iframes</title>
<script type="application/javascript">
let promiseResolvers = {
"testFrame1": {},
"testFrame2": {}
}
let promises = [
new Promise(r => promiseResolvers["testFrame1"].resolve = r),
new Promise(r => promiseResolvers["testFrame2"].resolve = r)
];
function frameLoaded(frame) {
promiseResolvers[frame].resolve();
}
Promise.all(promises).then(() => window.dispatchEvent(new Event("frames-loaded")));
</script>
</head>
<body onunload="">
<div>
<iframe id="testFrame1" src="dummy_page.html" onload="frameLoaded(this.id);" ></iframe>
<iframe id="testFrame2" src="dummy_page.html" onload="frameLoaded(this.id);" ></iframe>
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<body>Subframe page for testing</body>
</html>

View File

@ -0,0 +1,42 @@
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
// Forward iframe loaded event.
addEventListener("frames-loaded",
e => sendAsyncMessage("test:frames-loaded"), true, true);
let requestObserver = {
observe(subject, topic, data) {
if (topic == "http-on-opening-request") {
// Get DOMWindow on all child docshells to force about:blank
// content viewers being created.
getChildDocShells().map(ds => {
let window = ds.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsILoadContext)
.associatedWindow;
});
}
},
QueryInterface: XPCOMUtils.generateQI([
Ci.nsIObserver
])
}
Services.obs.addObserver(requestObserver, "http-on-opening-request");
addEventListener("unload", e => {
if (e.target == this) {
Services.obs.removeObserver(requestObserver, "http-on-opening-request");
}
});
function getChildDocShells() {
let docShellsEnum = docShell.getDocShellEnumerator(
Ci.nsIDocShellTreeItem.typeAll,
Ci.nsIDocShell.ENUMERATE_FORWARDS
);
let docShells = [];
while (docShellsEnum.hasMoreElements()) {
let ds = docShellsEnum.getNext();
docShells.push(ds);
}
return docShells;
}