<!DOCTYPE html>
<meta charset=utf-8>
<meta name="viewport" content="width=device-width,initial-scale=1">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/css/cssom-view/support/scroll-behavior.js"></script>
<script src="./resources/intersection-observer-test-utils.js"></script>
<style>
.spacer {
height: calc(100vh + 100px);
}
</style>
<div class="spacer"></div>
<iframe id="iframe"></iframe>
<script>
promise_test(async t => {
iframe.src = // non secure port.
get_host_info().HTTP_NOTSAMESITE_ORIGIN + "/intersection-observer/resources/nested-cross-origin-child-iframe.sub.html";
await new Promise(resolve => {
window.addEventListener("message", event => {
if (event.data == "ready") {
resolve();
}
}, { once: true });
});
let isIntersecting = false;
window.addEventListener("message", function listener(event) {
if (event.origin == get_host_info().HTTPS_NOTSAMESITE_ORIGIN) {
isIntersecting = event.data;
window.removeEventListener("message", listener);
}
});
await new Promise(resolve => waitForNotification(t, resolve));
await new Promise(resolve => waitForNotification(t, resolve));
assert_false(isIntersecting,
"The target element is not intersecting in all ancestor viewports");
// Scroll the iframe in this document into view, but still the target element
// in the grand child document is out of the child iframe's viewport.
iframe.scrollIntoView({ behavior: "instant" });
await waitForScrollEnd(document.scrollingElement);
assert_false(isIntersecting,
"The target element is not intersecting in all ancestor viewports");
// Now make the target element visible in the child iframe's viewport.
frames[0].postMessage("scroll", "*");
await new Promise(resolve => {
window.addEventListener("message", function listener(event) {
// It's possible that the message from the IntersectionObserver in the
// grand child document (HTTPS_NORSAMESITE_ORIGIN) is delivered ealier
// than scrollEnd message from the child document
// (HTTP_NOTSAMESITE_ORIGIN), so we need to differentiate them.
if (event.origin == get_host_info().HTTP_NOTSAMESITE_ORIGIN &&
event.data == "scrollEnd" ) {
window.removeEventListener("message", listener);
resolve();
}
});
});
await new Promise(resolve => waitForNotification(t, resolve));
assert_true(isIntersecting,
"The target element is now intersecting in all ancestor viewports");
}, "IntersectionObserver with `implicit root` in a nested cross-origin iframe works");
</script>