| <!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> |