diff options
Diffstat (limited to 'dom/tests/mochitest/bugs/test_bug346659.html')
-rw-r--r-- | dom/tests/mochitest/bugs/test_bug346659.html | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/dom/tests/mochitest/bugs/test_bug346659.html b/dom/tests/mochitest/bugs/test_bug346659.html new file mode 100644 index 0000000000..20684fa32d --- /dev/null +++ b/dom/tests/mochitest/bugs/test_bug346659.html @@ -0,0 +1,207 @@ +<!DOCTYPE HTML> +<html> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=346659 +--> +<head> + <title>Test for Bug 346659</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +</head> +<body> +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=346659">Mozilla Bug 346659</a> +<p id="display"></p> +<div id="content" style="display: none"> + +</div> +<pre id="test"> +<script type="application/javascript"> + +/** Test for Bug 346659 **/ +var numTests = 10; +SimpleTest.requestLongerTimeout(2); // test takes a long time on android and b2g emulators +SimpleTest.waitForExplicitFinish(); + +var wins = []; + +function r(base, tail) { + return base.replace(/\/[^\/]*$/, "/" + tail); +} + +/** + * This function sets up the test according to the data it receives. If the data + * is a JSON string, it will use the object parsed from that to determine how to + * set up the test. + */ +async function handleCmd(evt) { + var cmd; + try { + cmd = JSON.parse(evt.data); + } catch (e) { + // Not json, so it should be a test result. We don't need to set up test. + return false; + } + + if ("load" in cmd) { + var testNum = cmd.load; + + // Set up the testing window property and get necessary information from it. + // We use SpecialPowers.spawn() here since the testing window could be cross + // origin. + var { isOpenerTest, location } = + await SpecialPowers.spawn(wins[testNum], [testNum], testNum => { + var win = content.wrappedJSObject; + win.childWin.x = testNum; + + return { + isOpenerTest: win.childWin.opener == win, + location: content.location.href, + }; + }); + + // Get the test location according to the test. + if (isOpenerTest) { + if ("xsite" in cmd) { + var loc = r(window.location.href, "bug346659-opener-echoer.html?" + testNum); + } else { + var loc = r(location, "bug346659-opener-echoer.html?" + testNum); + } + } else { + if ("xsite" in cmd) { + var loc = r(window.location.href, "bug346659-parent-echoer.html?" + testNum); + } else { + var loc = r(location, "bug346659-parent-echoer.html?" + testNum); + } + } + + // Trigger the loading on the child window of the testing window. + await SpecialPowers.spawn(wins[testNum], [loc], loc => { + content.wrappedJSObject.childWin.location.href = loc; + }); + wins[testNum] = null; + } else if ("write" in cmd) { + var testNum = cmd.write; + + try { + // Set up the test on the testing window. + await SpecialPowers.spawn(wins[testNum], [testNum], testNum => { + var win = content.wrappedJSObject; + win.childWin.x = testNum; + + // Test document.write(). + if (win.childWin.opener == win) { + win.childWin.document.write(` + <script> + window.opener.opener.postMessage("${testNum} - " + window.x, "http://mochi.test:8888/"); + window.opener.close(); + window.close(); + <` + '/script>'); + } else { + win.childWin.document.write(` + <script> + window.parent.opener.postMessage("${testNum} - " + window.x, "http://mochi.test:8888/"); + window.parent.close(); + <` + '/script>'); + } + }); + } catch (e) { + if (e.name != "SecurityError" || e.code != 18) { + throw e; + } + // Security error on cross-site write() is fine + await SpecialPowers.spawn(wins[testNum], [], () => { + var win = content.wrappedJSObject; + if (win.childWin.opener == win) { + win.childWin.close(); + } + }); + + handleTestEnd(); + } + wins[testNum] = null; + } + return true; +} + +async function messageReceiver(evt) { + // First try to detect a load/write command + if (await handleCmd(evt)) { + return; + } + + var testNumber = parseInt(evt.data); + var testResult = evt.data.substring(3 + Math.floor(Math.log(testNumber) * Math.LOG10E + 1)); + + switch (testNumber) { + case 1: + is(testResult, "1", "Props on new window should be preserved when loading"); + break; + case 2: + is(testResult, "2", "Props on new window should be preserved when writing"); + break; + case 3: + is(testResult, "3", "Props on window opened from new window should be preserved when loading"); + break; + case 4: + is(testResult, "4", "Props on window opened from new window should be preserved when writing"); + break; + case 5: + is(testResult, "undefined", "Props on new window's child should go away when loading"); + break; + case 6: + is(testResult, "6", "Props on new window's child should not go away when writing"); + break; + case 7: + is(testResult, "7", "Props on different-domain window opened from different-domain new window can stay"); + break; + case 9: + is(testResult, "undefined", "Props on different-domain new window's child should go away when loading"); + break; + case 11: + is(testResult, "undefined", "Props on same-domain window opened from different-domain new window should go away when loading"); + break; + case 12: + is(testResult, "undefined", "Props on different-domain new window's same-domain child should go away when loading"); + break; + default: + ok(0, "unexpected test number (" + testNumber + ") when data is " + evt.data); + } + + handleTestEnd(); +} + +function handleTestEnd() { + if (!--numTests) { + SimpleTest.finish(); + } +} +window.addEventListener("message", messageReceiver); + +var win = window.open(""); +win.x = 1; +win.location.href = "bug346659-echoer.html"; + +win = window.open(""); +win.x = 2; +win.document.write('<script> window.opener.postMessage("2 - " + window.x, window.location.href); window.close(); </' + 'script>'); + +wins[3] = window.open('bug346659-opener.html?{"load":3}'); +wins[4] = window.open('bug346659-opener.html?{"write":4}'); +wins[5] = window.open('bug346659-parent.html?{"load":5}'); +wins[6] = window.open('bug346659-parent.html?{"write":6}'); + +is(location.host, "mochi.test:8888", "Unexpected host"); + +SpecialPowers.pushPrefEnv({"set": [["dom.security.https_first", false]]}, function() { + var baseurl = window.location.href.replace(/mochi\.test:8888/, "example.com"); + wins[7] = window.open(r(baseurl, 'bug346659-opener.html?{"load":7}')); + wins[9] = window.open(r(baseurl, 'bug346659-parent.html?{"load":9}')); + + wins[11] = window.open(r(baseurl, 'bug346659-opener.html?{"load":11,"xsite":true}')); + wins[12] = window.open(r(baseurl, 'bug346659-parent.html?{"load":12,"xsite":true}')); +}); + +</script> +</pre> +</body> +</html> |