scrollIntoView-iframes.html (2586B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>CSSOM View Test: scrollIntoView in iframes</title> 4 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> 5 <link rel="author" title="Martin Robinson" href="mailto:mrobinson@igalia.com"> 6 <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> 7 <meta name="assert" content="Checks that scrollIntoView inside and iframe can scroll in the parent document if it has the same origin."> 8 9 <style> 10 .scroller { 11 overflow: hidden; 12 height: 500px; 13 border: solid; 14 } 15 .scroller::before { 16 content: ""; 17 display: block; 18 height: 500px; 19 } 20 .scroller::after { 21 content: ""; 22 display: block; 23 height: 300px; 24 } 25 iframe { 26 height: 1000px; 27 border: none; 28 } 29 </style> 30 31 <div id="log"></div> 32 33 <div class="scroller"> 34 <iframe id="same-origin-iframe"></iframe> 35 </div> 36 <div class="scroller"> 37 <iframe id="cross-origin-iframe" sandbox="allow-scripts"></iframe> 38 </div> 39 40 <script src="/resources/testharness.js"></script> 41 <script src="/resources/testharnessreport.js"></script> 42 <script> 43 let sameOriginIframe = document.getElementById("same-origin-iframe"); 44 let crossOriginIframe = document.getElementById("cross-origin-iframe"); 45 let sameOriginWindow = sameOriginIframe.contentWindow; 46 let crossOriginWindow = crossOriginIframe.contentWindow; 47 48 promise_setup(() => Promise.all([ 49 new Promise(resolve => { 50 sameOriginIframe.addEventListener("load", resolve); 51 sameOriginIframe.src = "support/scrollIntoView-iframes-child.html"; 52 }), 53 new Promise(resolve => { 54 crossOriginIframe.addEventListener("load", resolve); 55 crossOriginIframe.src = "support/scrollIntoView-iframes-child.html"; 56 }) 57 ])); 58 59 promise_test(async () => { 60 assert_equals(sameOriginWindow.scrollY, 100, "scrollY"); 61 }, "scrollIntoView in same-origin iframe can scroll in inner window"); 62 63 promise_test(async () => { 64 assert_equals(sameOriginIframe.parentElement.scrollTop, 1200, "scrollTop"); 65 }, "scrollIntoView in same-origin iframe can scroll in parent window"); 66 67 promise_test(async () => { 68 let scrollY = await new Promise(resolve => { 69 addEventListener("message", event => { 70 if (event.source === crossOriginWindow) { 71 resolve(event.data); 72 } 73 }); 74 crossOriginWindow.postMessage("scrollY", "*"); 75 }); 76 assert_equals(scrollY, 100, "scrollY"); 77 }, "scrollIntoView in cross-origin iframe can scroll in inner window"); 78 79 promise_test(async () => { 80 assert_equals(crossOriginIframe.parentElement.scrollTop, 0, "scrollTop"); 81 }, "scrollIntoView in cross-origin iframe can't scroll in parent window"); 82 </script>