diff options
Diffstat (limited to 'testing/web-platform/tests/geolocation-API/non-fully-active.https.html')
-rw-r--r-- | testing/web-platform/tests/geolocation-API/non-fully-active.https.html | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/testing/web-platform/tests/geolocation-API/non-fully-active.https.html b/testing/web-platform/tests/geolocation-API/non-fully-active.https.html new file mode 100644 index 0000000000..13853c0ef8 --- /dev/null +++ b/testing/web-platform/tests/geolocation-API/non-fully-active.https.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Geolocation Test: non-fully active document</title> +<link rel="help" href="https://github.com/w3c/geolocation-api/pull/97" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="support.js"></script> +<body></body> +<script> + promise_test(async (t) => { + t.add_cleanup(() => { + return test_driver.set_permission({ name: "geolocation" }, "prompt"); + }); + await test_driver.set_permission({ name: "geolocation" }, "granted"); + + // Create the iframe, wait for it to load... + const iframe = document.createElement("iframe"); + iframe.src = "resources/iframe.html"; + iframe.allow = "geolocation"; + document.body.appendChild(iframe); + + // ...wait for the iframe to load... + await new Promise((resolve) => + iframe.addEventListener("load", resolve, { once: true }) + ); + + // Steal geolocation. + const geo = iframe.contentWindow.navigator.geolocation; + + // No longer fully active. + iframe.remove(); + + // Try to watch a position while not fully active... + const watchError = await new Promise((resolve, reject) => { + const watchId = geo.watchPosition( + reject, // We don't want a position + resolve // We want an error! + ); + // Always return 0. + assert_equals( + watchId, + 0, + "watchId is 0 when document is not fully-active" + ); + // And again, to make sure it's not changing + const watchId2 = geo.watchPosition( + () => {}, + () => {} + ); + assert_equals( + watchId2, + 0, + "watchId remains 0 when document is not fully-active" + ); + }); + + assert_equals( + watchError.code, + GeolocationPositionError.POSITION_UNAVAILABLE, + "watchPosition() returns an error on non-fully-active document" + ); + + // Now try to get current position while not fully active... + const positionError = await new Promise((resolve, reject) => { + geo.getCurrentPosition( + reject, // We don't want a position + resolve // We want an error! + ); + }); + assert_equals( + positionError.code, + GeolocationPositionError.POSITION_UNAVAILABLE, + "getCurrentPosition() calls the errorCallback with POSITION_UNAVAILABLE" + ); + + // Re-attach, and go back to fully active. + document.body.appendChild(iframe); + iframe.contentWindow.opener = window; + await new Promise((resolve) => + iframe.addEventListener("load", resolve, { once: true }) + ); + + // And we are back to fully active. + let watchId; + let position = await new Promise((resolve, reject) => { + watchId = iframe.contentWindow.navigator.geolocation.watchPosition( + resolve, + reject + ); + }); + assert_true(Number.isInteger(watchId), "Expected some number for watchId"); + assert_true(Boolean(position), "Expected a position"); + + // Finally, let's get the position from the reattached document. + position = await new Promise((resolve, reject) => { + iframe.contentWindow.navigator.geolocation.getCurrentPosition( + resolve, + reject + ); + }); + assert_true(Boolean(position), "Expected a position"); + iframe.contentWindow.navigator.geolocation.clearWatch(watchId); + }, "non-fully active document behavior"); +</script> |