summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fenced-frame/consume-user-activation.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fenced-frame/consume-user-activation.https.html')
-rw-r--r--testing/web-platform/tests/fenced-frame/consume-user-activation.https.html95
1 files changed, 95 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fenced-frame/consume-user-activation.https.html b/testing/web-platform/tests/fenced-frame/consume-user-activation.https.html
new file mode 100644
index 0000000000..e4ad20d17b
--- /dev/null
+++ b/testing/web-platform/tests/fenced-frame/consume-user-activation.https.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<title>Test that user activation propagation is fenced.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="resources/utils.js"></script>
+
+<body>
+<script>
+// Simulate a click in frame context `frame`.
+async function click(frame) {
+ var actions = new test_driver.Actions();
+ await actions.pointerMove(0, 0, {origin: frame})
+ .pointerDown()
+ .pointerUp()
+ .send();
+}
+
+assert_activations = (sticky_activation, transient_activation, frame_name) => {
+ if (sticky_activation) {
+ assert_true(navigator.userActivation.hasBeenActive,
+ frame_name + " has been activated.");
+ } else {
+ assert_false(navigator.userActivation.hasBeenActive,
+ frame_name + " has not been activated yet.");
+ }
+ if (transient_activation) {
+ assert_true(navigator.userActivation.isActive,
+ frame_name + " is currently active.");
+ } else {
+ assert_false(navigator.userActivation.isActive,
+ frame_name + " is not currently active.");
+ }
+};
+
+promise_test(async () => {
+ // This test checks that consumption of transient user activations is
+ // fenced, i.e. that when the top-level embedder and a fenced frame are
+ // both active, and one of them performs an operation that consumes
+ // transient user activation (sets `navigator.userActivation.isActive`
+ // to `false`), it doesn't affect the other frame.
+
+ // Given a top-level frame A and fenced frame B, the structure of the
+ // test is as follows:
+ // - Activate both A and B with a click
+ // - Consume A's transient user activation with `window.open`
+ // - Check that A is inactive and B is active
+ // - Reactivate A with a click
+ // - Consume B's transient user activation with `window.open`
+ // - Check that A is active and B is inactive
+
+ const B = attachFencedFrameContext();
+
+ // Check that both frames are inactive after loading.
+ assert_activations(false, false, "A");
+ await B.execute(assert_activations, [false, false, "B"]);
+
+ // Send a click to activate the top-level frame, and check user activation.
+ await click(document.documentElement);
+ assert_activations(true, true, "A");
+ await B.execute(assert_activations, [false, false, "B"]);
+
+ // Send a click to activate the fenced frame, and check user activation.
+ await click(B.element);
+ assert_activations(true, true, "A");
+ await B.execute(assert_activations, [true, true, "B"]);
+
+ // Open a window to consume the top-level transient user activation.
+ window.open('about:blank');
+
+ // Check that it consumed the navigation in only the top-level frame.
+ assert_activations(true, false, "A");
+ await B.execute(assert_activations, [true, true, "B"]);
+
+ // Reactivate this frame and check the user activation status.
+ await click(document.documentElement);
+ assert_activations(true, true, "A");
+ await B.execute(assert_activations, [true, true, "B"]);
+
+ // Open a window in the fenced frame to consume its transient activation.
+ await B.execute(() => {
+ window.open('about:blank');
+ });
+
+ // Check that B's transient user activation was consumed.
+ assert_activations(true, true, "A");
+ await B.execute(assert_activations, [true, false, "B"]);
+
+}, 'user-activation');
+</script>
+</body>