diff options
Diffstat (limited to 'testing/web-platform/tests/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-cross-document-traversal.html')
-rw-r--r-- | testing/web-platform/tests/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-cross-document-traversal.html | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-cross-document-traversal.html b/testing/web-platform/tests/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-cross-document-traversal.html new file mode 100644 index 0000000000..fc6f92e819 --- /dev/null +++ b/testing/web-platform/tests/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-cross-document-traversal.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Traversal after a same-document navigations</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<!-- + These tests are kind of silly since it's hard to imagine any other result: + same-document navigations are always synchronous so of course back() won't + cancel them. + + Nevertheless they're nice as a basis from which to write corresponding app + history tests, where the consequences aren't as obvious. +--> + +<body> +<script type="module"> +import { createIframe, waitForLoad, delay } from "./resources/helpers.mjs"; + +promise_test(async t => { + const iframe = await createIframe(t); + + // Setup + // Extra delay()s are necessary because if we navigate "inside" the load + // handler (i.e. in a promise reaction for the load handler) then it will + // be a replace navigation. + iframe.contentWindow.location.search = "?1"; + await waitForLoad(iframe); + await delay(t, 0); + iframe.contentWindow.location.search = "?2"; + await waitForLoad(iframe); + await delay(t, 0); + + iframe.contentWindow.location.hash = "#3"; + iframe.contentWindow.history.go(-2); + + assert_equals(iframe.contentWindow.location.search, "?2", "must not go back synchronously (search)"); + assert_equals(iframe.contentWindow.location.hash, "#3", "must not go back synchronously (hash)"); + + await waitForLoad(iframe); + assert_equals(iframe.contentWindow.location.search, "?1", "must go back eventually (search)"); + assert_equals(iframe.contentWindow.location.hash, "", "must go back eventually (hash)"); +}, "fragment navigation then go(-2)"); + +promise_test(async t => { + const iframe = await createIframe(t); + + // Setup + // Extra delay()s are necessary because if we navigate "inside" the load + // handler (i.e. in a promise reaction for the load handler) then it will + // be a replace navigation. + iframe.contentWindow.location.search = "?1"; + await waitForLoad(iframe); + await delay(t, 0); + iframe.contentWindow.location.search = "?2"; + await waitForLoad(iframe); + await delay(t, 0); + + iframe.contentWindow.history.pushState(null, "", "/3"); + iframe.contentWindow.history.go(-2); + + assert_equals(iframe.contentWindow.location.search, "", "must not go back synchronously (search)"); + assert_equals(iframe.contentWindow.location.pathname, "/3", "must not go back synchronously (pathname)"); + + await waitForLoad(iframe); + assert_equals(iframe.contentWindow.location.search, "?1", "must go back eventually (search)"); + assert_equals(iframe.contentWindow.location.pathname, "/common/blank.html", "must go back eventually (pathname)"); + +}, "pushState then go(-2)"); +</script> |