summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fenced-frame/user-activation.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fenced-frame/user-activation.https.html')
-rw-r--r--testing/web-platform/tests/fenced-frame/user-activation.https.html95
1 files changed, 95 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fenced-frame/user-activation.https.html b/testing/web-platform/tests/fenced-frame/user-activation.https.html
new file mode 100644
index 0000000000..3ca0dca49b
--- /dev/null
+++ b/testing/web-platform/tests/fenced-frame/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_activation = (should_be_active, frame_name) => {
+ if (should_be_active) {
+ assert_true(navigator.userActivation.hasBeenActive,
+ frame_name + " has been activated.");
+ assert_true(navigator.userActivation.isActive,
+ frame_name + " is currently active.");
+ } else {
+ assert_false(navigator.userActivation.hasBeenActive,
+ frame_name + " has not been activated yet.");
+ assert_false(navigator.userActivation.isActive,
+ frame_name + " is not currently active.");
+ }
+};
+
+promise_test(async () => {
+ // This test ensures that user activations (e.g. click events) don't
+ // propagate across fenced frame boundaries. Specifically, activations
+ // are visible through the `navigator.userActivation` object.
+ //
+ // The layout of the page is as follows:
+ // A: top-level frame
+ // B: iframe
+ // C: fencedframe
+ // D: iframe
+ // E: fencedframe
+ //
+ // This order is chosen to test all kinds of fenced tree traversal. We:
+ // - Click in C and check that only C gets activated (not A, B, D, or E)
+ // - Click in A and check that only A, B, and D get activated (not E)
+ // - Click in B and D and check that E wasn't activated
+
+ const B = attachIFrameContext();
+ const C = attachFencedFrameContext();
+ const D = attachIFrameContext();
+ const E = attachFencedFrameContext();
+
+ // Define some helpers to check activations more concisely.
+ const frames = [[B, "B"], [C, "C"], [D, "D"], [E, "E"]];
+ const assert_activations = async (should_be_actives) => {
+ assert_equals(frames.length, should_be_actives.length);
+ for ([i, [frame, frame_name]] of frames.entries()) {
+ await frame.execute(assert_activation, [should_be_actives[i], frame_name]);
+ }
+ };
+
+ // Check that all the frames are inactive before we start.
+ assert_activation(false, "A");
+ await assert_activations([false/*B*/, false/*C*/, false/*D*/, false/*E*/]);
+
+ // Simulate a click in C (the first fenced frame).
+ await click(C.element);
+
+ // Check that only C has been activated.
+ assert_activation(false, "A");
+ await assert_activations([false/*B*/, true/*C*/, false/*D*/, false/*E*/]);
+
+ // Simulate a click in A (the top-level site).
+ await click(document.documentElement);
+
+ // Check that A, B, and D were activated.
+ assert_activation(true, "A");
+ await assert_activations([true/*B*/, true/*C*/, true/*D*/, false/*E*/]);
+
+ // Simulate a click in B and D (the two iframes).
+ await click(B.element);
+ await click(D.element);
+
+ // Check that E has still not been activated.
+ assert_activation(true, "A");
+ await assert_activations([true/*B*/, true/*C*/, true/*D*/, false/*E*/]);
+}, 'user-activation');
+</script>
+</body>