scroll-cross-origin-iframes.html (3078B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <title>Verify that two sibling cross-origin iframes both correctly scroll on MouseWheel events, as per https://crbug.com/675695.</title> 4 <script src="/common/get-host-info.sub.js"></script> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="/resources/testdriver.js"></script> 8 <script src="/resources/testdriver-vendor.js"></script> 9 <script src="/resources/testdriver-actions.js"></script> 10 <script src="scroll_support.js"></script> 11 <body> 12 <iframe id="target-iframe1" 13 style="height: 100px; width: 100px; overflow-y: scroll; position: absolute; left: 50px; top: 50px"> 14 </iframe> 15 <iframe id="target-iframe2" 16 style="height: 100px; width: 100px; overflow-y: scroll; position: absolute; left: 50px; top: 200px"> 17 </iframe> 18 <script> 19 "use strict"; 20 21 function waitForFrameLoadAsync(frame) { 22 return new Promise(async (resolve) => { 23 frame.addEventListener('load', resolve, { once: true }); 24 }); 25 } 26 27 function waitForMessageAsync(expected_frame_id, expected_command) { 28 return new Promise((resolve) => { 29 window.addEventListener('message', (event) => { 30 assert_equals(event.data.command, expected_command); 31 assert_equals(event.data.frame_id, expected_frame_id); 32 resolve(event.data.scrollTop); 33 }, { once: true }); 34 }); 35 } 36 37 function waitForCrossOriginFrameSetupAsync(frame) { 38 return new Promise(async (resolve) => { 39 const setup_ack_waiter = waitForMessageAsync(frame.id, 'setup'); 40 const load_ack_waiter = waitForFrameLoadAsync(frame); 41 42 const host = get_host_info(); 43 frame.src = host.HTTP_NOTSAMESITE_ORIGIN + 44 "/dom/events/scrolling/scroll-cross-origin-iframes.sub.html"; 45 await load_ack_waiter; 46 await frame.contentWindow.postMessage({ 47 command: 'setup', 48 frame_id: frame.id 49 }, "*"); 50 const scroll_top = await setup_ack_waiter; 51 resolve(scroll_top); 52 }); 53 } 54 55 promise_test(async () => { 56 var frame_map = new Map(); 57 for (const frame of document.querySelectorAll('iframe')) { 58 const scroll_top_before = await waitForCrossOriginFrameSetupAsync(frame); 59 frame_map.set(frame.id, scroll_top_before); 60 } 61 assert_equals(frame_map.size, 2); 62 63 for (const [frame_id, scroll_top_before] of frame_map) { 64 const frame = document.getElementById(frame_id); 65 const scrollend_ack_waiter = waitForMessageAsync(frame_id, 'onscrollend'); 66 await new test_driver.Actions() 67 .scroll(/*cursor_x=*/0, /*cursor_y=*/0, 68 /*delta_x=*/0, /*delta_y=*/50, 69 {origin: frame}) 70 .send(); 71 const scroll_top_after = await scrollend_ack_waiter; 72 assert_greater_than(scroll_top_after, scroll_top_before, 73 'Failed to advance scrollTop target'); 74 } 75 }, "Verify sibling cross-origin iframes can wheel-scroll."); 76 </script> 77 </body>