Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 1 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /html/user-activation/propagation-same-and-cross-origin.sub.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<html>
<head>
<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="resources/utils.js"></script>
</head>
<body>
<h1>Check that cross origin iframes don't get activated</h1>
<p>
Tests that activating a same-origin navigable doesn't activate a cross
origin navigable.
</p>
<ol id="instructions">
<li>Click inside the yellow area.</li>
</ol>
<h1>Same origin</h1>
<iframe id="so-child" width="200" height="50"></iframe>
<h1>Cross origin</h1>
<iframe id="xo-child" width="200" height="50"></iframe>
</body>
<script>
const soChild = document.getElementById("so-child");
const xoChild = document.getElementById("xo-child");
function requestXOReport() {
xoChild.contentWindow.postMessage(
JSON.stringify({ type: "report" }),
"*"
);
return receiveMessage(`child-two-report`);
}
promise_setup(() => {
soChild.src = "./resources/child-one.html";
xoChild.src =
return Promise.all([
receiveMessage("child-one-loaded"),
receiveMessage("child-two-loaded"),
]);
});
promise_test(async (t) => {
const unclickedCrossOrigin = await requestXOReport();
const soActivation = soChild.contentWindow.navigator.userActivation;
assert_false(
navigator.userActivation.isActive,
"top-frame navigator.userActivation.isActive must be false"
);
assert_false(
navigator.userActivation.hasBeenActive,
"top-frame navigator.userActivation.hasBeenActive must be false"
);
assert_false(soActivation.isActive, "child-one isActive must be false");
assert_false(
soActivation.hasBeenActive,
"child-one hasBeenActive must be false"
);
assert_false(
unclickedCrossOrigin.isActive,
"child-two isActive must be false"
);
assert_false(
unclickedCrossOrigin.hasBeenActive,
"child-two hasBeenActive must be false"
);
}, "Check Initial states of user activation are all false");
promise_test(async (t) => {
await test_driver.click(soChild);
const xoActivation = await requestXOReport();
const soActivation = soChild.contentWindow.navigator.userActivation;
assert_true(
navigator.userActivation.isActive,
"top-frame navigator.userActivation.isActive must be true"
);
assert_true(
navigator.userActivation.hasBeenActive,
"top-frame navigator.userActivation.hasBeenActive must be true"
);
assert_true(soActivation.isActive, "child-one isActive must be true");
assert_true(
soActivation.hasBeenActive,
"child-one hasBeenActive must be true"
);
assert_false(xoActivation.isActive, "child-two isActive must be false");
assert_false(
xoActivation.hasBeenActive,
"child-two hasBeenActive must be false"
);
}, "Check that activating a same-origin navigable doesn't activate a cross origin navigable");
promise_test(async (t) => {
await consumeTransientActivation();
const soActivation = soChild.contentWindow.navigator.userActivation;
// Before click...
assert_false(
navigator.userActivation.isActive,
"top-frame navigator.userActivation.isActive must be false"
);
assert_true(
navigator.userActivation.hasBeenActive,
"top-frame navigator.userActivation.hasBeenActive must be true"
);
assert_false(soActivation.isActive, "child-one isActive must be false");
assert_true(
soActivation.hasBeenActive,
"child-one hasBeenActive must be true"
);
const xoActivation = await requestXOReport();
assert_false(xoActivation.isActive, "child-two isActive must be false");
assert_false(
xoActivation.hasBeenActive,
"child-two hasBeenActive must be false"
);
// Click!
const [, xoActivationAfterClick] = await Promise.all([
test_driver.click(xoChild),
receiveMessage("child-two-clicked"),
]);
// After click...
assert_true(
navigator.userActivation.isActive,
"top-frame navigator.userActivation.isActive must be true"
);
assert_true(
navigator.userActivation.hasBeenActive,
"top-frame navigator.userActivation.hasBeenActive must remain true"
);
assert_true(
xoActivationAfterClick.isActive,
"child-two isActive must be true"
);
assert_true(
xoActivationAfterClick.hasBeenActive,
"child-two hasBeenActive must be true"
);
assert_false(soActivation.isActive, "child-one isActive must be false");
assert_true(
soActivation.hasBeenActive,
"child-one hasBeenActive must remain true"
);
}, "Clicking on the cross-origin navigable activates parent navigable.");
</script>
</html>