| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>CSSOM View Test: scrollIntoView in iframes</title> |
| <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> |
| <link rel="author" title="Martin Robinson" href="mailto:mrobinson@igalia.com"> |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> |
| <meta name="assert" content="Checks that scrollIntoView inside and iframe can scroll in the parent document if it has the same origin."> |
| |
| <style> |
| .scroller { |
| overflow: hidden; |
| height: 500px; |
| border: solid; |
| } |
| .scroller::before { |
| content: ""; |
| display: block; |
| height: 500px; |
| } |
| .scroller::after { |
| content: ""; |
| display: block; |
| height: 300px; |
| } |
| iframe { |
| height: 1000px; |
| border: none; |
| } |
| </style> |
| |
| <div id="log"></div> |
| |
| <div class="scroller"> |
| <iframe id="same-origin-iframe"></iframe> |
| </div> |
| <div class="scroller"> |
| <iframe id="cross-origin-iframe" sandbox="allow-scripts"></iframe> |
| </div> |
| |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| let sameOriginIframe = document.getElementById("same-origin-iframe"); |
| let crossOriginIframe = document.getElementById("cross-origin-iframe"); |
| let sameOriginWindow = sameOriginIframe.contentWindow; |
| let crossOriginWindow = crossOriginIframe.contentWindow; |
| |
| promise_setup(() => Promise.all([ |
| new Promise(resolve => { |
| sameOriginIframe.addEventListener("load", resolve); |
| sameOriginIframe.src = "support/scrollIntoView-iframes-child.html"; |
| }), |
| new Promise(resolve => { |
| crossOriginIframe.addEventListener("load", resolve); |
| crossOriginIframe.src = "support/scrollIntoView-iframes-child.html"; |
| }) |
| ])); |
| |
| promise_test(async () => { |
| assert_equals(sameOriginWindow.scrollY, 100, "scrollY"); |
| }, "scrollIntoView in same-origin iframe can scroll in inner window"); |
| |
| promise_test(async () => { |
| assert_equals(sameOriginIframe.parentElement.scrollTop, 1200, "scrollTop"); |
| }, "scrollIntoView in same-origin iframe can scroll in parent window"); |
| |
| promise_test(async () => { |
| let scrollY = await new Promise(resolve => { |
| addEventListener("message", event => { |
| if (event.source === crossOriginWindow) { |
| resolve(event.data); |
| } |
| }); |
| crossOriginWindow.postMessage("scrollY", "*"); |
| }); |
| assert_equals(scrollY, 100, "scrollY"); |
| }, "scrollIntoView in cross-origin iframe can scroll in inner window"); |
| |
| promise_test(async () => { |
| assert_equals(crossOriginIframe.parentElement.scrollTop, 0, "scrollTop"); |
| }, "scrollIntoView in cross-origin iframe can't scroll in parent window"); |
| </script> |