Automatic update from web-platform-tests WebKit export of https://bugs.webkit.org/show_bug.cgi?id=315262 -- wpt-commits: a9812674621f276fdd74698c6bbc1068cd5013d0 wpt-pr: 60126
84 lines
2.6 KiB
HTML
84 lines
2.6 KiB
HTML
<!DOCTYPE html>
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<title>Intersection observer with cross-origin iframe and tall viewport</title>
|
|
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984635">
|
|
<style>
|
|
pre, #log {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 200px;
|
|
}
|
|
#iframe {
|
|
width: 160px;
|
|
height: 5100px;
|
|
border: 0;
|
|
outline: 1px solid;
|
|
}
|
|
.spacer {
|
|
height: calc(200vh + 100px);
|
|
}
|
|
</style>
|
|
|
|
<div class="spacer"></div>
|
|
<iframe id="iframe" sandbox="allow-scripts"></iframe>
|
|
<div class="spacer"></div>
|
|
|
|
<script>
|
|
async function queryIframeState() {
|
|
let response = new Promise(resolve => {
|
|
window.addEventListener("message", function(e) {
|
|
resolve(e.data);
|
|
}, { once: true });
|
|
});
|
|
iframe.contentWindow.postMessage({ request: true }, "*");
|
|
let data = await response;
|
|
assert_true(Array.isArray(data.entries), "Expected an array of entries");
|
|
assert_equals(data.entries.length, 1, "Only one entry expected");
|
|
return data.entries[0];
|
|
}
|
|
|
|
async function assertFrameTargetIntersects(expected, msg) {
|
|
let framesToTry = 10;
|
|
let state;
|
|
for (let i = 0; i < framesToTry; ++i) {
|
|
state = await queryIframeState();
|
|
if (state.isIntersecting == expected) {
|
|
break;
|
|
}
|
|
await new Promise(r => requestAnimationFrame(r));
|
|
}
|
|
assert_equals(state.isIntersecting, expected, `Target should be ${expected ? "intersecting" : "not intersecting"} ${msg}`);
|
|
return state;
|
|
}
|
|
|
|
function loadFrame() {
|
|
return new Promise(resolve => {
|
|
// It's possible the iframe finishes loading before the listener is installed.
|
|
// So install it first before loading the iframe (by setting its src)
|
|
|
|
window.addEventListener("message", (e) => {
|
|
assert_equals(e.data, "leafLoaded", "Expected 'leafLoaded' message from the leaf iframe");
|
|
resolve();
|
|
}, { once: true });
|
|
|
|
iframe.src = "http://{{hosts[alt][]}}:{{ports[http][0]}}/intersection-observer/resources/cross-origin-tall-subframe.sub.html?nest=4";
|
|
});
|
|
}
|
|
|
|
onload = () => {
|
|
promise_test(async function() {
|
|
await loadFrame();
|
|
|
|
await assertFrameTargetIntersects(false, "at start");
|
|
iframe.scrollIntoView({ block: "start" });
|
|
await assertFrameTargetIntersects(false, "when frame top visible");
|
|
iframe.scrollIntoView({ block: "end" });
|
|
await assertFrameTargetIntersects(true, "when frame bottom visible");
|
|
iframe.scrollIntoView({ block: "start" });
|
|
await assertFrameTargetIntersects(false, "when frame top visible again");
|
|
});
|
|
}
|
|
</script>
|