diff options
Diffstat (limited to 'layout/base/tests/test_bug607529.html')
-rw-r--r-- | layout/base/tests/test_bug607529.html | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/layout/base/tests/test_bug607529.html b/layout/base/tests/test_bug607529.html new file mode 100644 index 0000000000..a74aff565c --- /dev/null +++ b/layout/base/tests/test_bug607529.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML> +<html> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=607529 +--> +<head> + <title>Test for Bug 607529</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=607529">Mozilla Bug 607529</a> +<p id="display"></p> +<div id="content" style="display: none"> + +</div> +<pre id="test"> +<script type="application/javascript"> + SimpleTest.waitForExplicitFinish(); + + /* General idea: Open a new window (needed because we don't bfcache + subframes) that uses requestAnimationFrame, navigate it, navigate it + back, and verify that the animations are still running. */ + + function executeTest() { + /** Test for Bug 607529 **/ + var doneOneLoad = false; + var done = false; + var bc = new BroadcastChannel("bug607529"); + var bc_1 = new BroadcastChannel("bug607529_1"); + bc.onmessage = (msgEvent) => { + var msg = msgEvent.data; + isnot(msg, "notcached", "Should never end up not being cached"); + if (msg == "loaded") { + if (!doneOneLoad) { + doneOneLoad = true; + bc.postMessage("navigateToPage"); + } else { + // This is unexpected, but it can happen on Android, probably when + // bfcache gets purged due to memory pressure. Hence, "soft fail" there. + var message = "onload handler shouldn't fire on restore from bfcache"; + if (navigator.appVersion.includes("Android")) { + todo(false, message); + } else { + ok(false, message); + } + // In any case, more messages aren't coming, so finish up. + closeWindowAndFinish(); + } + } + else if (msg == "revived") { + bc.postMessage("report"); + } + else if (msg == "callbackHappened") { + // We might get this message more than once, if the other page queues up + // more than one callbackHappened message before we manage to close it. + // Protect against calling SimpleTest.finish() more than once. + if (!done) { + closeWindowAndFinish(); + done = true; + } + } else if (msg == "closed") { + bc.close(); + bc_1.close(); + SimpleTest.finish(); + } else { + try { + var jsonMsg = JSON.parse(msg); + } catch (ex) { + // In case JSON.parse throws, we pause to print the string that it + // choked on, and then resume throwing the exception. + ok(false, "JSON.parse threw, when passed string '" + jsonMsg + "'"); + throw ex; + } + if (jsonMsg.error) { + window.onerror(jsonMsg.msg, jsonMsg.url, jsonMsg.line); + } + } + } + bc_1.onmessage = (msgEvent) => { + if (msgEvent.data == "goback") { + bc_1.postMessage("navigateBack"); + } + } + function closeWindowAndFinish() { + bc.postMessage("close"); + } + + // If Fission is disabled, the pref is no-op. + SpecialPowers.pushPrefEnv({set: [["fission.bfcacheInParent", true]]}, () => { + window.open("file_bug607529.html", "", "noopener"); + }); + } + + if (isXOrigin) { + // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5) + // Acquire storage access permission here so that the BroadcastChannel used to + // communicate with the opened windows works in xorigin tests. Otherwise, + // the iframe containing this page is isolated from first-party storage access, + // which isolates BroadcastChannel communication. + SpecialPowers.wrap(document).notifyUserGestureActivation(); + SpecialPowers.pushPrefEnv({ + set: [["privacy.partition.always_partition_third_party_non_cookie_storage", false]], + }).then(() => { + SpecialPowers.addPermission("storageAccessAPI", true, window.location.href).then(() => { + SpecialPowers.wrap(document).requestStorageAccess().then(() => { + executeTest(); + }); + }); + }); + } else { + executeTest(); + } + + +</script> +</pre> +</body> +</html> |