summaryrefslogtreecommitdiffstats
path: root/layout/base/tests/test_bug607529.html
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--layout/base/tests/test_bug607529.html119
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>