diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents')
81 files changed, 1428 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/001.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/001.html new file mode 100644 index 0000000000..1ef88d3cc1 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/001.html @@ -0,0 +1,15 @@ +<!doctype html> +<title>document.open in unload</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var win; + +t.step(function() { + win = window.open("support/001-1.html"); +}); + +add_completion_callback(function() {win.close()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/002.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/002.html new file mode 100644 index 0000000000..a4e0b243e2 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/002.html @@ -0,0 +1,15 @@ +<!doctype html> +<title>document.open in unload</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var win; + +t.step(function() { + win = window.open("support/002-1.html"); +}); + +add_completion_callback(function() {win.close()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/003.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/003.html new file mode 100644 index 0000000000..d0a19e0ddc --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/003.html @@ -0,0 +1,15 @@ +<!doctype html> +<title>document.open in beforeunload with link</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var win; + +t.step(function() { + win = window.open("support/003-1.html"); +}); + +add_completion_callback(function() {win.close()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/004.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/004.html new file mode 100644 index 0000000000..fca926f652 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/004.html @@ -0,0 +1,15 @@ +<!doctype html> +<title>document.open in beforeunload with button</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var win; + +t.step(function() { + win = window.open("support/004-1.html"); +}); + +add_completion_callback(function() {win.close()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/005.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/005.html new file mode 100644 index 0000000000..c215fb88e7 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/005.html @@ -0,0 +1,15 @@ +<!doctype html> +<title>document.open in pagehide in iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var win; + +t.step(function() { + win = window.open("support/005-1.html"); +}); + +add_completion_callback(function() {win.close()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/base.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/base.html new file mode 100644 index 0000000000..70c07cba4c --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/base.html @@ -0,0 +1,14 @@ +<!doctype html> +Base +<script> +onpagehide = function() { + if(top.base_hide) { + top.base_hide(); + } +} +onpageshow = function() { +if (top.base_show) { + top.base_show(); +} +} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling-1.html new file mode 100644 index 0000000000..6ba1e65740 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling-1.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Support page for beforeunload-canceling.html</title> + +<h1>If this goes away, it navigated</h1> + +<script> +"use strict"; + +window.runTest = (t, { valueToReturn, expectCancelation, setReturnValue, expectedReturnValue, cancel }) => { + window.onbeforeunload = t.step_func(e => { + if (cancel) { + e.preventDefault(); + } + + if (setReturnValue !== undefined) { + e.returnValue = setReturnValue; + } + + return valueToReturn; + }); + + const listener = t.step_func(e => { + top.assert_equals(e.defaultPrevented, expectCancelation, "canceled"); + top.assert_equals(e.returnValue, expectedReturnValue, "returnValue"); + window.onbeforeunload = null; + + t.done(); + }); + + window.addEventListener("beforeunload", listener); + + window.location.href = "about:blank"; +}; +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling.html new file mode 100644 index 0000000000..29a685fa59 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling.html @@ -0,0 +1,222 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>beforeunload return value cancelation behavior</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#the-event-handler-processing-algorithm"> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script> +"use strict"; + +promise_test(t => { + let onbeforeunloadHappened = false; + window.onbeforeunload = t.step_func(() => { + onbeforeunloadHappened = true; + return "cancel me"; + }); + + const eventWatcher = new EventWatcher(t, window, "beforeunload"); + const promise = eventWatcher.wait_for("beforeunload").then(e => { + assert_true(onbeforeunloadHappened, "CustomEvent must be able to trigger the event handler"); + assert_false(e.defaultPrevented, "The event must not have been canceled"); + window.onbeforeunload = null; + }); + + window.dispatchEvent(new CustomEvent("beforeunload")); + + return promise; +}, "Returning a string must not cancel the event: CustomEvent, non-cancelable"); + +promise_test(t => { + let onbeforeunloadHappened = false; + window.onbeforeunload = t.step_func(() => { + onbeforeunloadHappened = true; + return "cancel me"; + }); + + const eventWatcher = new EventWatcher(t, window, "beforeunload"); + const promise = eventWatcher.wait_for("beforeunload").then(e => { + assert_true(onbeforeunloadHappened, "CustomEvent must be able to trigger the event handler"); + assert_false(e.defaultPrevented, "The event must not have been canceled"); + window.onbeforeunload = null; + t.done(); + }); + + window.dispatchEvent(new CustomEvent("beforeunload", { cancelable: true })); + + return promise; +}, "Returning a string must not cancel the event: CustomEvent, cancelable"); + +promise_test(t => { + let onbeforeunloadHappened = false; + window.onbeforeunload = t.step_func(() => { + onbeforeunloadHappened = true; + return false; + }); + + const eventWatcher = new EventWatcher(t, window, "beforeunload"); + const promise = eventWatcher.wait_for("beforeunload").then(e => { + assert_true(onbeforeunloadHappened, "CustomEvent must be able to trigger the event handler"); + assert_false(e.defaultPrevented, "The event must not have been canceled"); + window.onbeforeunload = null; + t.done(); + }); + + window.dispatchEvent(new CustomEvent("beforeunload", { cancelable: true })); + + return promise; +}, "Returning false must not cancel the event, because it's coerced to the DOMString \"false\" which does not cancel " + + "CustomEvents: CustomEvent, cancelable"); + +// This test can be removed if we update the DOM Standard to disallow createEvent("BeforeUnloadEvent"). Browser support +// is inconsistent. https://github.com/whatwg/dom/issues/362 +promise_test(t => { + const eventWatcher = new EventWatcher(t, window, "click"); + const promise = eventWatcher.wait_for("click").then(e => { + assert_false(e.defaultPrevented, "The event must not have been canceled"); + window.onbeforeunload = null; + t.done(); + }); + + const ev = document.createEvent("BeforeUnloadEvent"); + ev.initEvent("click", false, true); + window.dispatchEvent(ev); + + return promise; +}, "Returning a string must not cancel the event: BeforeUnloadEvent with type \"click\", cancelable"); + +const testCases = [ + { + valueToReturn: null, + expectCancelation: false, + expectedReturnValue: "" + }, + { + valueToReturn: undefined, + expectCancelation: false, + expectedReturnValue: "" + }, + { + valueToReturn: "", + expectCancelation: true, + expectedReturnValue: "" + }, + { + valueToReturn: false, + expectCancelation: true, + expectedReturnValue: "false" + }, + { + valueToReturn: true, + expectCancelation: true, + expectedReturnValue: "true" + }, + { + valueToReturn: 0, + expectCancelation: true, + expectedReturnValue: "0" + }, + { + valueToReturn: null, + expectCancelation: false, + setReturnValue: "foo", + expectedReturnValue: "foo" + }, + { + valueToReturn: undefined, + expectCancelation: false, + setReturnValue: "foo", + expectedReturnValue: "foo" + }, + { + valueToReturn: "", + expectCancelation: true, + setReturnValue: "foo", + expectedReturnValue: "foo" + }, + { + valueToReturn: false, + expectCancelation: true, + setReturnValue: "foo", + expectedReturnValue: "foo" + }, + { + valueToReturn: true, + expectCancelation: true, + setReturnValue: "foo", + expectedReturnValue: "foo" + }, + { + valueToReturn: 0, + expectCancelation: true, + setReturnValue: "foo", + expectedReturnValue: "foo" + }, + { + setReturnValue: "", + expectedReturnValue: "", + expectCancelation: false, + }, + { + expectCancelation: true, + expectedReturnValue: "", + cancel: true + }, + { + setReturnValue: "foo", + expectCancelation: true, + expectedReturnValue: "foo", + cancel: true + }, + { + valueToReturn: "foo", + expectedReturnValue: "foo", + expectCancelation: true, + cancel: true + }, + { + valueToReturn: "foo", + setReturnValue: "foo", + expectedReturnValue: "foo", + expectCancelation: true, + cancel: true + }, + { + valueToReturn: true, + setReturnValue: "", + expectedReturnValue: "true", + expectCancelation: true, + cancel: true + } +]; + +var testCaseIndex = 0; +function runNextTest() { + const testCase = testCases[testCaseIndex]; + + const labelAboutReturnValue = testCase.setReturnValue === undefined ? "" : + `; setting returnValue to ${testCase.setReturnValue}`; + + const labelAboutCancel = testCase.cancel === undefined ? "" : + "; calling preventDefault()"; + + const suffixLabels = labelAboutReturnValue + labelAboutCancel; + + async_test(t => { + const iframe = document.createElement("iframe"); + iframe.onload = t.step_func(() => { + iframe.contentWindow.runTest(t, testCase); + if (++testCaseIndex < testCases.length) + runNextTest(); + }); + + iframe.src = "beforeunload-canceling-1.html"; + document.body.appendChild(iframe); + }, `Returning ${testCase.valueToReturn} with a real iframe unloading${suffixLabels}`); +} + +runNextTest(); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-history-back-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-history-back-1.html new file mode 100644 index 0000000000..4403cfa8e9 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-history-back-1.html @@ -0,0 +1,5 @@ +<!doctype html> +001-1 +<script> +addEventListener("beforeunload", function() {top.t.step(function() {top.beforeunload_fired = true})}, false); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-history-back.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-history-back.html new file mode 100644 index 0000000000..5b0415c422 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-history-back.html @@ -0,0 +1,31 @@ +<!doctype html> +<title>beforeunload event fires on history navigation back</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +beforeunload_fired = false; +var t = async_test(); + +var base_count = 0; + +onload = function() {setTimeout(t.step_func(function() { + var iframe = document.getElementsByTagName("iframe")[0] + iframe.onload = t.step_func(function() { + iframe.onload = null; + history.go(-1); + }); + + iframe.src = "beforeunload-on-history-back-1.html"; +}), 100)}; + +base_show = t.step_func(function() { + base_count++; + if (base_count > 1) { + assert_true(beforeunload_fired); + t.done(); + } +}); + +</script> +<iframe src="base.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent-1.html new file mode 100644 index 0000000000..4f239dad1e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent-1.html @@ -0,0 +1,2 @@ +<!doctype html> +<iframe src="beforeunload-on-navigation-of-parent-2.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent-2.html new file mode 100644 index 0000000000..a34b182e70 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent-2.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +addEventListener("beforeunload", function() {parent.parent.beforeunload_fired=true}, false) +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent.html new file mode 100644 index 0000000000..96d49567f3 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-on-navigation-of-parent.html @@ -0,0 +1,31 @@ +<!doctype html> +<title>beforeunload in iframe on navigation of parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +beforeunload_fired = false; +var t = async_test(); + +var base_count = 0; + +onload = function() {setTimeout(t.step_func(function() { + var iframe = document.getElementsByTagName("iframe")[0] + iframe.onload = t.step_func(function() { + iframe.onload = null; + history.go(-1); + }); + + iframe.src = "beforeunload-on-navigation-of-parent-1.html"; +}), 100)}; + +base_show = t.step_func(function() { + base_count++; + if (base_count > 1) { + assert_true(beforeunload_fired); + t.done(); + } +}); + +</script> +<iframe src="base.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-iframe.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-iframe.html new file mode 100644 index 0000000000..212a10c005 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-iframe.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Beforeunload must be gated behind sticky activation: nested browsing context</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<p>If you happen to be running this test as a human, then be sure not to interact with any part of the page; that would invalidate the results! + +<script> +setup({ single_test: true }); + +const iframe = document.createElement('iframe'); +iframe.src = 'support/beforeunload-sticky-start.html'; + +window.onmessage = e => { + assert_equals(e.data, 'navigated successfully'); + + const desiredURL = (new URL('support/beforeunload-sticky-destination.html', location.href)).href; + assert_equals(iframe.contentWindow.location.href, desiredURL); + + done(); +}; + +document.body.append(iframe); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-manual.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-manual.html new file mode 100644 index 0000000000..55612bbfc4 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-manual.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Beforeunload must be gated behind sticky activation: normal top-level browsing context</title> + +<p>This test is manual because we want to test non-popup, non-iframe situations. Sibling files contain automated tests for those situations. + +<p>In three seconds, this document will redirect itself to a new page. The test passes if the redirect succeeds. The test fails if a beforeunload dialog pops up asking for confirmation. + +<p>Be sure not to interact with any part of the page in the meantime. That would invalidate the results. + +<script> +window.onbeforeunload = e => e.preventDefault(); + +setTimeout(() => { + location.href = 'support/beforeunload-sticky-destination.html'; +}, 3000); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-popup.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-popup.html new file mode 100644 index 0000000000..23bf8a440d --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-sticky-activation-popup.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Beforeunload must be gated behind sticky activation: auxiliary browsing context</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<p>If you happen to be running this test as a human, then be sure not to interact with any part of the page; that would invalidate the results! + +<script> +setup({ single_test: true }); + +const w = window.open('support/beforeunload-sticky-start.html'); + +window.onmessage = e => { + assert_equals(e.data, 'navigated successfully'); + + const desiredURL = (new URL('support/beforeunload-sticky-destination.html', location.href)).href; + assert_equals(w.location.href, desiredURL); + + w.close(); + + done(); +}; +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-synchronous.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-synchronous.html new file mode 100644 index 0000000000..6806eaf7a3 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/beforeunload-synchronous.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>beforeunload event is emitted synchronously</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#the-event-handler-processing-algorithm"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +'use strict'; +// "navigate a browsing context" synchronously calls "prompt to unload", which +// synchronously calls "dispatch an event". + +async_test(function(t) { + var iframe = document.createElement('iframe'); + + iframe.onload = t.step_func(function() { + var callCount = 0; + + iframe.contentWindow.onbeforeunload = function() { + callCount += 1; + }; + + iframe.contentWindow.location.href = '/common/blank.html'; + + assert_equals(callCount, 1, 'invoked synchronously exactly once'); + + t.done(); + }); + + document.body.appendChild(iframe); +}); +</script> +</body> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload-1.html new file mode 100644 index 0000000000..b96234fba2 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload-1.html @@ -0,0 +1,10 @@ +<!doctype html> +004-1 +<script> +addEventListener("beforeunload", +function() { +if (top.counter++ < 999) { + location = "navigation-within-beforeunload-2.html?" + top.counter; +} +}, false); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload-2.html new file mode 100644 index 0000000000..2dceaa6d6a --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload-2.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +document.write(location) +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload.html new file mode 100644 index 0000000000..d6ecf5d52f --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/navigation-within-beforeunload.html @@ -0,0 +1,29 @@ +<!doctype html> +<title>Triggering navigation from within beforeunload event</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +beforeunload_fired = false; +var t = async_test(); + +var base_count = 0; +var counter = 0; + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + + iframe.onload = function() { + setTimeout(function() {iframe.contentWindow.location="navigation-within-beforeunload-2.html";}, 100); + // Step 4 of https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigating-across-documents + // doesn't seem to allow navigation within a beforeunload handler, + // so the counter should not go beyond 1. + iframe.onload = t.step_func(function() {assert_equals(counter, 1); t.done()}); + }; + + iframe.src = "navigation-within-beforeunload-1.html?" + Math.random(); + +}, 100)}; + +</script> +<iframe src="base.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/pagehide-on-history-forward-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/pagehide-on-history-forward-1.html new file mode 100644 index 0000000000..a60c20ed80 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/pagehide-on-history-forward-1.html @@ -0,0 +1,2 @@ +<!doctype html> +filler text diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/pagehide-on-history-forward.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/pagehide-on-history-forward.html new file mode 100644 index 0000000000..5e64b5ec66 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/pagehide-on-history-forward.html @@ -0,0 +1,19 @@ +<!doctype html> +<title>pagehide event fires on history navigation forward</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +onload = function() {setTimeout(t.step_func(function() { + var iframe = document.getElementsByTagName("iframe")[0] + + iframe.src = "pagehide-on-history-forward-1.html"; +}), 100)}; + +base_hide = t.step_func(function() { + t.done() +}); +</script> +<iframe src="base.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-closeable.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-closeable.html new file mode 100644 index 0000000000..b94789c40f --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-closeable.html @@ -0,0 +1,23 @@ +<!doctype html> +<title>beforeunload and unload events fire after window.close() in script-closeable browsing context</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +beforeunload_fired = false; +var t = async_test(); + +onload = t.step_func(function() { + window.close(); +}); + +onbeforeunload = t.step_func(function() { + beforeunload_fired = true; +}); + +onunload = t.step_func(function() { + assert_true(beforeunload_fired); + t.done() +}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-uncloseable-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-uncloseable-1.html new file mode 100644 index 0000000000..3a557ce34e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-uncloseable-1.html @@ -0,0 +1,10 @@ +<!doctype html> +script-uncloseable-1 +<script> +onbeforeunload = function() { + parent.beforeunload_fired = true; +}; +onunload = function() { + parent.unload_fired = true; +}; +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-uncloseable.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-uncloseable.html new file mode 100644 index 0000000000..f6a17d740b --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-uncloseable.html @@ -0,0 +1,24 @@ +<!doctype html> +<title>beforeunload and unload events do not fire after window.close() in script-uncloseable browsing context</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var beforeunload_fired = false; +var unload_fired = false; +var t = async_test(); + +onload = t.step_func(function() { + var iframe = document.getElementsByTagName("iframe")[0] + iframe.onload = t.step_func(function() { + iframe.contentWindow.close() + t.step_timeout(function() { + assert_false(beforeunload_fired); + assert_false(unload_fired); + t.done(); + }, 1000); + }); + iframe.src = "prompt-and-unload-script-uncloseable-1.html"; +}); +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001-1.html new file mode 100644 index 0000000000..b68afc49ec --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001-1.html @@ -0,0 +1,10 @@ +<script> +addEventListener("beforeunload", +function() { + parent.events.push("beforeunload"); +}, false); +parent.events.push("before src change"); + +location.href = "001-2.html&pipe=trickle(d2)"; +parent.events.push("after src change"); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001-2.html new file mode 100644 index 0000000000..9da0f9395c --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001-2.html @@ -0,0 +1 @@ +001-2 diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001.html new file mode 100644 index 0000000000..109dcc1393 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/001.html @@ -0,0 +1,14 @@ +<!doctype html> +<title>beforeunload event order</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +events = []; +onload = t.step_func(function() { + assert_array_equals(events, ["before src change", "beforeunload", "after src change"]); + t.done(); +}) +</script> +<iframe src="001-1.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/002-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/002-1.html new file mode 100644 index 0000000000..c5f57375da --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/002-1.html @@ -0,0 +1,7 @@ +<script> +addEventListsner("beforeunload", parent.t.step_func( +function(e) { + parent.do_test(e); +}, false); +location.href = "001-2.html&pipe=trickle(d2)"; +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/002.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/002.html new file mode 100644 index 0000000000..d8f4fc60a9 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/002.html @@ -0,0 +1,20 @@ +<!doctype html> +<title>beforeunload event properties</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +function do_test(e) { + assert_equals(e.type, "beforeunload"); + assert_false(e.bubbles, "bubbles"); + assert_true(e.cancelable, "bubbles"); + assert_equals(e.returnValue, ""); +} + +onload = t.step_func(function() { + t.done(); +}) +</script> +<iframe src="001-1.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/003.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/003.html new file mode 100644 index 0000000000..5683f1b120 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/003.html @@ -0,0 +1,20 @@ +<!doctype html> +<title>beforeunload event in child frame for parent navigation</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +function do_test(e) { + assert_equals(e.type, "beforeunload"); + assert_false(e.bubbles, "bubbles"); + assert_true(e.cancelable, "bubbles"); + assert_equals(e.returnValue, ""); +} + +onload = t.step_func(function() { + t.done(); +}) +</script> +<iframe src="001-1.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004-1.html new file mode 100644 index 0000000000..a3ca82f520 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004-1.html @@ -0,0 +1,28 @@ +<!doctype html> +004-1 +<script> +var handleBeforeUnload = function() { + parent.beforeunload_fired = true; + removeListener(); + setTimeout(function() { + parent.timeout_fired = true; + }, 1000); +} + +var removeListener = function() { + assert_true(window.removeEventListener('beforeunload', handleBeforeUnload, false)); +} + +window.addEventListener('beforeunload', handleBeforeUnload, false); + +onload = function() { + if (!parent.loaded) { + parent.loaded = true; + location="004-2.html?" + Math.random(); + } +} +</script> +// child frame with no onbeforeunload listener. Should leave the parent as unsalvageable. +// Adding the iframe prevents potential implementation bugs where the the recursive steps of #prompt-to-unload-a-document +// would overwrite the salvageable state of the parent. +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004-2.html new file mode 100644 index 0000000000..1a605b1b3d --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004-2.html @@ -0,0 +1,5 @@ +<!doctype html> +004-2 +<script> +onload = function() {setTimeout(parent.t.step_func(function() {parent.start_test(); history.go(-1)}), 100)} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004.html new file mode 100644 index 0000000000..7076a4dd18 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/004.html @@ -0,0 +1,29 @@ +<!doctype html> +<title>salvagable state of document after setting beforeunload listener</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +var loaded = false; +var beforeunload_fired = false; +var timeout_fired = false; + +function start_test() { + step_timeout( + t.step_func(function() { + assert_true(beforeunload_fired); + assert_false(timeout_fired); + t.done() + }), 1000); +} + +onload = function() { + var iframe = document.getElementsByTagName("iframe")[0] + onload = null; + iframe.src="004-1.html?" + Math.random(); +}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-001.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-001.html new file mode 100644 index 0000000000..3b7ef74b71 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-001.html @@ -0,0 +1,9 @@ +<!doctype html> +<title>Prompt when beforeunload is canceled</title> +<script> +addEventListener("beforeunload", +function(e) {e.preventDefault()}, +false); +</script> +<p>When clicking the link below, you should get a prompt asking if you want to unload the document</p> +<a href="next.html">Click here</a> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-002.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-002.html new file mode 100644 index 0000000000..7be8a3301f --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-002.html @@ -0,0 +1,9 @@ +<!doctype html> +<title>Prompt when beforeunload has returnValue set</title> +<script> +addEventListener("beforeunload", +function(e) {e.returnValue = "PASS if you see this"}, +false); +</script> +<p>When clicking the link below, you should get a prompt asking if you want to unload the document</p> +<a href="next.html">Click here</a> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-003.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-003.html new file mode 100644 index 0000000000..ff72b67055 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-003.html @@ -0,0 +1,11 @@ +<!doctype html> +<title>Prompt when beforeunload is canceled</title> +<script> +addEventListener("beforeunload", +function(e) {e.preventDefault()}, +false); +</script> +<p>When clicking the button below, you should get a prompt asking if you want to unload the document</p> +<form method="get" action="next.html"> +<input type="submit" value="Click here"> +</form> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-004.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-004.html new file mode 100644 index 0000000000..a4d2968922 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-004.html @@ -0,0 +1,11 @@ +<!doctype html> +<title>Prompt on form submit</title> +<script> +addEventListener("beforeunload", +function(e) {e.preventDefault()}, +false); +</script> +<p>When clicking the button below, you should get a prompt asking if you want to unload the document</p> +<form method="get" action="next.html"> +<input type="submit" value="Click here"> +</form> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-005.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-005.html new file mode 100644 index 0000000000..71ff0a241d --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-005.html @@ -0,0 +1,22 @@ +<!doctype html> +<title>Event loop pause for beforeunload</title> +<script> +var counter = 0; + +onload = function count() { + document.getElementById("log").textContent = counter++ + setTimeout(count, 200); +} + +addEventListener("beforeunload", +function(e) { + e.preventDefault() +}, +false); +</script> +<ul> +<li>Click on the link below. When the prompt appears the counter at the bottom must stop incrementing. +<li>Opt not to leave the page. The counter must start incrementing again +</ul> +<p><a href="">Click here</a> +<div id="log"></div> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-006.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-006.html new file mode 100644 index 0000000000..dae0340ad9 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/manual-006.html @@ -0,0 +1,9 @@ +<!doctype html> +<title>Prompt when beforeunload returns string value</title> +<script> +addEventListener("beforeunload", +function(e) {return "PASS if you see this"}, +false); +</script> +<p>When clicking the link below, you should get a prompt asking if you want to unload the document</p> +<a href="next.html">Click here</a> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/next.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/next.html new file mode 100644 index 0000000000..38e7cdd5e0 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/prompt/next.html @@ -0,0 +1,2 @@ +<!doctype html> +<p>You should have seen a prompt asking you to unload the previous document diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html new file mode 100644 index 0000000000..2a9cab4aa4 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001-1.html @@ -0,0 +1,23 @@ +<!DOCTYPE HTML> +<script> + t = opener.t; + do_test = t.step_func(function () { + localStorage.test6564729 += '4'; + var d = document; + var e = document.open(); // has no effect (ignore-opens-during-unload > 0) + localStorage.test6564729 += (e == d) ? '5' : 'A [' + e + '] '; + document.write('FAIL - document.write executed and blocked navigation!'); // has no effect (ignore-opens-during-unload > 0) + localStorage.test6564729 += document.body.textContent.match('FAIL') ? 'B' : '6'; + document.close(); // has no effect (no script-created parser) + localStorage.test6564729 += '7'; + }) +onload = t.step_func(function() { + localStorage.test6564729 = '0'; + setTimeout(t.step_func(function() {document.links[0].click()})); +}); +</script> +<body onbeforeunload="localStorage.test6564729 += '1'" + onpagehide="localStorage.test6564729 += '3'" + onunload="do_test()"> +<p><a href="001a.html">Follow this link to run the test.</a> +<p><iframe src="001b.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001a.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001a.html new file mode 100644 index 0000000000..36d4188b9e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001a.html @@ -0,0 +1,7 @@ +<!DOCTYPE HTML> +<script> +opener.t.step(function() { + opener.assert_equals(localStorage.test6564729, '0123456789'); + opener.t.done(); +}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001b.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001b.html new file mode 100644 index 0000000000..eaafc371a1 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/001b.html @@ -0,0 +1,5 @@ +<!DOCTYPE HTML> +<body onbeforeunload="localStorage.test6564729 += '2'" + onpagehide="localStorage.test6564729 += '8'" + onunload="localStorage.test6564729 += '9'"> +<p>Inner frame
\ No newline at end of file diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002-1.html new file mode 100644 index 0000000000..017fbb964c --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002-1.html @@ -0,0 +1,32 @@ +<!DOCTYPE HTML> +<script> + var t = opener.t; + + var do_test = t.step_func(function() { + localStorage.test6564729 += '1'; + var d = document; + // This document's unload not triggered here because `document.open` erases + // all of the document's handlers. However the iframe's event handlers (002b) + // will fire. The `beforeunload` event handler will not fire because this is + // not a navigation resulting from a user interaction. + var e = document.open(); + localStorage.test6564729 += (e == d) ? '8' : 'X'; + var s = 'FAIL if you see this | ' + localStorage.test6564729; + document.write(s); + localStorage.test6564729 += document.body.textContent == s ? '9' : 'x'; + document.close(); + localStorage.test6564729 += 'Z'; + document.body.textContent += ' // ' + localStorage.test6564729; + location = '002a.html'; // unload triggers again here, but they're not registered event listeners any more + }); + +onload = t.step_func(function() { + localStorage.test6564729 = '0'; + setTimeout(function() {document.getElementsByTagName("input")[0].click()}, 100); +}); +</script> +<body onbeforeunload="localStorage.test6564729 += '2'" + onpagehide="localStorage.test6564729 += '4'" + onunload="localStorage.test6564729 += '5'"> +<input type=button value="Activate this button to run the test" onclick="do_test()"> +<p><iframe src="002b.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002a.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002a.html new file mode 100644 index 0000000000..51ff3e37b6 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002a.html @@ -0,0 +1,7 @@ +<!DOCTYPE HTML> +<script> + opener.t.step(function() { + opener.assert_equals(localStorage.test6564729, '016789Z'); + opener.t.done(); + }); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002b.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002b.html new file mode 100644 index 0000000000..d08a7a8add --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/002b.html @@ -0,0 +1,5 @@ +<!DOCTYPE HTML> +<body onbeforeunload="localStorage.test6564729 += '3'" + onpagehide="localStorage.test6564729 += '6'" + onunload="localStorage.test6564729 += '7'"> +<p>Inner frame
\ No newline at end of file diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003-1.html new file mode 100644 index 0000000000..b3a4754b85 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003-1.html @@ -0,0 +1,23 @@ +<!DOCTYPE HTML> +<script> + var t = opener.t; + var do_test = t.step_func(function() { + localStorage.test6564729 += '1'; + var d = document; + var e = document.open(); // has no effect (ignore-opens-during-unload > 0 because we're in beforeunload) + localStorage.test6564729 += (e == d) ? '2' : 'A [' + e + '] '; + document.write('FAIL - document.write executed and blocked navigation!'); // has no effect (ignore-opens-during-unload > 0) + localStorage.test6564729 += document.body.textContent.match('FAIL') ? 'B' : '3'; + document.close(); // has no effect (no script-created parser) + localStorage.test6564729 += '4'; + }) + + onload=t.step_func(function() {localStorage.test6564729 = '0'; setTimeout(t.step_func(function() {document.links[0].click()}), 100)}) + +</script> +<body + onbeforeunload="do_test()" + onpagehide="localStorage.test6564729 += '6'" + onunload="localStorage.test6564729 += '7'"> +<p><a href="003a.html">Follow this link to run the test.</a> +<p><iframe src="003b.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003a.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003a.html new file mode 100644 index 0000000000..5393fa221e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003a.html @@ -0,0 +1,8 @@ +<!DOCTYPE HTML> +<p>FAIL</p> +<script> +opener.t.step(function() { + opener.assert_equals(localStorage.test6564729, '0123456789') + opener.t.done(); +}) +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003b.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003b.html new file mode 100644 index 0000000000..c8f1917b85 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/003b.html @@ -0,0 +1,5 @@ +<!DOCTYPE HTML> +<body onbeforeunload="localStorage.test6564729 += '5'" + onpagehide="localStorage.test6564729 += '8'" + onunload="localStorage.test6564729 += '9'"> +<p>Inner frame
\ No newline at end of file diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004-1.html new file mode 100644 index 0000000000..06aba08af6 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004-1.html @@ -0,0 +1,25 @@ +<!DOCTYPE HTML> +<script> + var t = opener.t; + var do_test = t.step_func(function() { + localStorage.test6564729 += 'B'; + var d = document; + var e = document.open(); // unload triggered here - beforeunload C, D in 004b; pagehide E, unload F, pagehide G in 004b, unload HIJK in 004b + localStorage.test6564729 += (e == d) ? 'L' : 'Y'; + var s = 'FAIL if you see this | ' + localStorage.test6564729; + document.write(s); + localStorage.test6564729 += document.body.textContent == s ? 'M' : 'y'; + document.close(); + localStorage.test6564729 += 'N'; + location = '004a.html'; // unload triggers again here, but they're not registered event listeners any more + }) +onload = t.step_func(function() { + localStorage.test6564729 = 'A'; + setTimeout(t.step_func(function() {document.getElementsByTagName("input")[0].click()}), 100); +}) +</script> +<body onbeforeunload="localStorage.test6564729 += 'C'" + onpagehide="localStorage.test6564729 += 'E'" + onunload="localStorage.test6564729 += 'F'"> +<input type=button value="Activate this button to run the test" onclick="do_test()"> +<p><iframe src="004b.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004a.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004a.html new file mode 100644 index 0000000000..117e2b94ae --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004a.html @@ -0,0 +1,8 @@ +<!DOCTYPE HTML> +<p>FAIL</p> +<script> +opener.t.step(function() { + opener.assert_equals(localStorage.test6564729, 'ABCDEFGHIJKLMN'); + opener.t.done(); +}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004b.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004b.html new file mode 100644 index 0000000000..788937a0b0 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/004b.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<script> + function testRun() { + localStorage.test6564729 += 'H'; + var d = parent.document; + var e = parent.document.open(); // no effect, since that document is already in unload + localStorage.test6564729 += (e == d) ? 'I' : 'X'; + var s = 'FAIL'; + document.write(s); + localStorage.test6564729 += document.body.textContent == s ? 'x' : 'J'; + document.close(); + localStorage.test6564729 += 'K'; + } +</script> +<body onbeforeunload="localStorage.test6564729 += 'D'" + onpagehide="localStorage.test6564729 += 'G'" + onunload="testRun()"> +<p>Inner frame
\ No newline at end of file diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005-1.html new file mode 100644 index 0000000000..7b81a9f115 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005-1.html @@ -0,0 +1,13 @@ +<!DOCTYPE HTML> +<script> +onload = opener.t.step_func(function() { + localStorage.test6564729 = '0' + setTimeout(opener.t.step_func(function() {document.links[0].click()}), 100); +}); +</script> +<body + onbeforeunload="localStorage.test6564729 += '1'" + onpagehide="localStorage.test6564729 += '3'" + onunload="localStorage.test6564729 += '4'"> +<p><a href="005a.html">Follow this link to run the test.</a> +<p><iframe src="005b.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005a.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005a.html new file mode 100644 index 0000000000..5185d3b921 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005a.html @@ -0,0 +1,8 @@ +<!DOCTYPE HTML> +<p>FAIL</p> +<script> +opener.t.step(function() { + opener.assert_equals(localStorage.test6564729, '012345678') + opener.t.done(); +}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005b.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005b.html new file mode 100644 index 0000000000..476e8e38c4 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/005b.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<script> + var t = parent.opener.t; + var do_test = t.step_func(function () { + localStorage.test6564729 += '5'; + var s = 'FAIL: document.open() has canceled the navigation (' + localStorage.test6564729 + ')'; + parent.document.open(); + parent.document.write(s); + parent.document.close(); + localStorage.test6564729 += parent.document.body.textContent.match('FAIL') == s ? 'X' : '6'; + localStorage.test6564729 += '7'; + }); +</script> +<body onbeforeunload="localStorage.test6564729 += '2'" + onpagehide="do_test()" + onunload="localStorage.test6564729 += '8'"> +<p>Inner frame diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/beforeunload-sticky-destination.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/beforeunload-sticky-destination.html new file mode 100644 index 0000000000..2edcf1a43b --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/beforeunload-sticky-destination.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Beforeunload must be gated behind sticky activation: destination page</title> + +<p>If you reached this page without clicking through a confirmation dialog, then the test has passed! + +<script> +if (window.opener) { + window.opener.postMessage('navigated successfully'); +} else if (window.parent) { + window.parent.postMessage('navigated successfully'); +} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/beforeunload-sticky-start.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/beforeunload-sticky-start.html new file mode 100644 index 0000000000..37109feafe --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/support/beforeunload-sticky-start.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Beforeunload must be gated behind sticky activation: start page</title> + +<p>This page will immediately navigate. If a beforeunload dialog pops up, the test fails.</p> + +<script> +window.onbeforeunload = e => e.preventDefault(); +location.href = 'beforeunload-sticky-destination.html'; +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001-1.html new file mode 100644 index 0000000000..74ba43954b --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001-1.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +addEventListener("pagehide", parent.t.step_func(function() {parent.pagehide_fired = true}), false); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001-2.html new file mode 100644 index 0000000000..90e28ab7fb --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001-2.html @@ -0,0 +1,2 @@ +<!doctype html> +Filler diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001.html new file mode 100644 index 0000000000..444a2770c7 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/001.html @@ -0,0 +1,25 @@ +<!doctype html> +<title>pagehide event on unload</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +pagehide_fired = false; +var t = async_test(); + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + + iframe.onload = function() { + setTimeout(function() { + iframe.contentWindow.location="001-2.html"; + }, 100); + iframe.onload = t.step_func(function() {assert_true(pagehide_fired); t.done()}); + }; + + iframe.src = "001-1.html?" + Math.random(); + +}, 100)}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/002-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/002-1.html new file mode 100644 index 0000000000..fd8e2b7262 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/002-1.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +addEventListener("pagehide", parent.t.step_func(parent.do_test()), false); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/002.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/002.html new file mode 100644 index 0000000000..d36011286c --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/002.html @@ -0,0 +1,36 @@ +<!doctype html> +<title>pagehide event properties</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + + iframe.onload = function() { + setTimeout(function() { + iframe.contentWindow.location="001-2.html"; + }, 100); + iframe.onload = t.step_func(function() {t.done()}); + }; + + function do_test(e) { + assert_equals(e.type, "pagehide"); + assert_equals(e.target, iframe.contentDocument); + assert_equals(e.currentTarget, iframe.contentWindow); + + // https://github.com/whatwg/html/issues/6794 + assert_true(e.bubbles, "bubbles"); + assert_true(e.cancelable, "cancelable"); + + assert_true(e.persisted, "persisted"); + } + + iframe.src = "002-1.html?" + Math.random(); + +}, 100)}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/003-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/003-1.html new file mode 100644 index 0000000000..9838c79456 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/003-1.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +addEventListener("unload", parent.t.step_func(function(e) {parent.do_test(e)}), false); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/003.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/003.html new file mode 100644 index 0000000000..97821be484 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/003.html @@ -0,0 +1,33 @@ +<!doctype html> +<title>unload event properties</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); +var do_test; + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + + iframe.onload = function() { + setTimeout(function() { + iframe.contentWindow.location="002-2.html"; + }, 100); + iframe.onload = t.step_func(function() {t.done()}); + }; + + do_test = function(e) { + assert_equals(e.type, "unload"); + assert_equals(e.target, iframe.contentDocument); + assert_equals(e.currentTarget, iframe.contentWindow); + assert_false(e.bubbles, "bubbles"); + assert_false(e.cancelable, "cancelable"); + } + + iframe.src = "003-1.html?" + Math.random(); + +}, 100)}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/004-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/004-1.html new file mode 100644 index 0000000000..5d0497556b --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/004-1.html @@ -0,0 +1,5 @@ +<!doctype html> +<script> +addEventListener("pagehide", function() {parent.events.push("pagehide"); setTimeout(function() {parent.events.push("timeout")}, 0)}, false); +addEventListener("unload", function() {parent.events.push("unload")}, false); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/004.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/004.html new file mode 100644 index 0000000000..301baa3b8e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/004.html @@ -0,0 +1,28 @@ +<!doctype html> +<title>pagehide / unload event order</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +var events = []; + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + + iframe.onload = function() { + setTimeout(function() { + iframe.contentWindow.location="001-2.html"; + }, 100); + iframe.onload = t.step_func(function() { + assert_array_equals(events, ["pagehide", "unload"]) + t.done()}); + }; + + iframe.src = "004-1.html?" + Math.random(); + +}, 100)}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006-1.html new file mode 100644 index 0000000000..bc2e10bdc3 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006-1.html @@ -0,0 +1,23 @@ +<!doctype html> +006-1 +<script> +onpagehide = function() { + onpagehide = null; + setTimeout(function() { + parent.t.unreached_func('setTimeout survived navigatoin'); + }, 1000); +} +if (parent.loaded) { + setTimeout(function() { parent.t.done(); }, 2000); +} +onload = function() { + if (!parent.loaded) { + parent.loaded = true; + setTimeout(parent.t.step_func( + function() { + location="006-2.html?" + Math.random(); + } + ), 100); + } +} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006-2.html new file mode 100644 index 0000000000..52365e55d8 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006-2.html @@ -0,0 +1,5 @@ +<!doctype html> +006-2 +<script> +onload = function() {setTimeout(parent.t.step_func(function() {history.go(-1)}), 100)} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006.html new file mode 100644 index 0000000000..c9e4d68a10 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/006.html @@ -0,0 +1,18 @@ +<!doctype html> +<title>salvagable state of document after setting pagehide listener</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +var loaded = false; + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + onload = null; + iframe.src="006-1.html?" + Math.random(); +}, 100)}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007-1.html new file mode 100644 index 0000000000..ed19f4498a --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007-1.html @@ -0,0 +1,21 @@ +<!doctype html> +007-1 +<script> +onunload = function() { + onunload = null; + parent.unload_fired = true; + setTimeout(function() { + parent.timeout_fired = true; + }, 100); +} +onload = function() { + if (!parent.loaded) { + parent.loaded = true; + setTimeout(parent.t.step_func( + function() { + location="007-2.html?" + Math.random(); + } + ), 100); + } +} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007-2.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007-2.html new file mode 100644 index 0000000000..f74cd1e67e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007-2.html @@ -0,0 +1,5 @@ +<!doctype html> +007-2 +<script> +onload = function() {setTimeout(parent.t.step_func(function() {parent.start_test(); history.go(-1)}), 100)} +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007.html new file mode 100644 index 0000000000..4a2fed5fac --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/007.html @@ -0,0 +1,28 @@ +<!doctype html> +<title>salvagable state of document after setting unload listener</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test(); + +var loaded = false; +var unload_fired = false; +var timeout_fired = false; + +function start_test() { + step_timeout(t.step_func(function() { + assert_true(unload_fired); + assert_false(timeout_fired); + t.done() + }), 1000); +} + +onload = function() {setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0] + onload = null; + iframe.src="007-1.html?" + Math.random(); +}, 100)}; + +</script> +<iframe></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/008-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/008-1.html new file mode 100644 index 0000000000..29de29c911 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/008-1.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +onpagehide = parent.t.step_func(function() {parent.t.done()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/008.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/008.html new file mode 100644 index 0000000000..015507d817 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/008.html @@ -0,0 +1,16 @@ +<!doctype html> +<title>pagehide IDL attribute</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var iframe; +var t = async_test(); +onload = function() { + setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0]; + iframe.src="about:blank"; + }, 100) +}; +</script> +<iframe src="008-1.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/009-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/009-1.html new file mode 100644 index 0000000000..d69a05914a --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/009-1.html @@ -0,0 +1,4 @@ +<!doctype html> +<script> +onunload = parent.t.step_func(function() {parent.t.done()}); +</script> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/009.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/009.html new file mode 100644 index 0000000000..0e93e04701 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/009.html @@ -0,0 +1,16 @@ +<!doctype html> +<title>unload IDL attribute</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var iframe; +var t = async_test(); +onload = function() { + setTimeout(function() { + var iframe = document.getElementsByTagName("iframe")[0]; + iframe.src="about:blank"; + }, 100) +} +</script> +<iframe src="009-1.html"></iframe> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/pagehide-manual-1.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/pagehide-manual-1.html new file mode 100644 index 0000000000..3da0a0de3e --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/pagehide-manual-1.html @@ -0,0 +1,2 @@ +<!doctype html> +<p>Now go back. PASS should be displayed after a short pause diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/pagehide-manual.html b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/pagehide-manual.html new file mode 100644 index 0000000000..ba34c3087f --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/pagehide-manual.html @@ -0,0 +1,5 @@ +<!doctype html> +<title>Document salvagable state after setting pagehide handler</title> +<script>onpagehide = function() {setTimeout(function(){document.body.innerHTML = "PASS"}, 100)}</script> +<p>Click the link below then navigate back to this page. Shortly after returning you should see the text "PASS"</p> +<p><a href="pagehide-manual-1.html">Click here</a> diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.js b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.js new file mode 100644 index 0000000000..65b4e533f6 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.js @@ -0,0 +1,34 @@ +// META: title=Unload runs in main frame when navigating cross-origin. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js + +promise_test(async t => { + const rcHelper = new RemoteContextHelper(); + + const rc1 = await rcHelper.addWindow(); + + t.add_cleanup(() => localStorage.removeItem('unload')); + + // Initialize storage and add "unload" event handler. + await rc1.executeScript(() => { + localStorage.setItem('unload', 'not yet'); + addEventListener('unload', () => { + localStorage.setItem('unload', 'ran'); + }); + }); + + // Navigate away. + const rc2 = await rc1.navigateToNew( + {extraRemoteContextConfig: {origin: 'HTTP_REMOTE_ORIGIN'}}); + + // Navigate back. + await rc2.historyBack(); + + // Test that the unload handler wrote to storage. + // Running it in the remote context after going back should ensure that the + // navigation (and therefore the unload handler) has completed. + assert_equals( + await rc1.executeScript(() => localStorage.getItem('unload')), 'ran'); +}); diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.js b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.js new file mode 100644 index 0000000000..5a95455c4c --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.js @@ -0,0 +1,33 @@ +// META: title=Unload runs in main frame when navigating same-origin. +// META: script=/common/dispatcher/dispatcher.js +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js + +promise_test(async t => { + const rcHelper = new RemoteContextHelper(); + + const rc1 = await rcHelper.addWindow(); + + t.add_cleanup(() => localStorage.removeItem('unload')); + + // Initialize storage and add "unload" event handler. + await rc1.executeScript(() => { + localStorage.setItem('unload', 'not yet'); + addEventListener('unload', () => { + localStorage.setItem('unload', 'ran'); + }); + }); + + // Navigate away. + const rc2 = await rc1.navigateToNew(); + + // Navigate back. + await rc2.historyBack(); + + // Test that the unload handler wrote to storage. + // Running it in the remote context after going back should ensure that the + // navigation (and therefore the unload handler) has completed. + assert_equals( + await rc1.executeScript(() => localStorage.getItem('unload')), 'ran'); +}); |