test_event_screenXY_in_cross_origin_iframe.html (3793B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title></title> 4 <script src="/tests/SimpleTest/SimpleTest.js"></script> 5 <script src="/tests/SimpleTest/EventUtils.js"></script> 6 <script src="/tests/SimpleTest/paint_listener.js"></script> 7 <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_utils.js"></script> 8 <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js"></script> 9 <iframe width=100></iframe> 10 <iframe width=100></iframe> 11 <script> 12 function getScreenPosition(aElement, aOffsetX, aOffsetY) { 13 const rect = aElement.getBoundingClientRect(); 14 const x = aOffsetX + window.mozInnerScreenX + rect.left; 15 const y = aOffsetY + window.mozInnerScreenY + rect.top; 16 const scale = window.devicePixelRatio; 17 return [Math.round(x * scale), Math.round(y * scale)]; 18 } 19 20 function waitForMessage(aMsg, aOrigin) { 21 return new Promise(resolve => { 22 window.addEventListener("message", function listener(event) { 23 if (event.data == "ready" && event.origin == aOrigin) { 24 window.removeEventListener("message", listener); 25 resolve(); 26 } 27 }); 28 }); 29 } 30 31 add_task(async () => { 32 await SimpleTest.promiseFocus(); 33 34 const iframes = document.querySelectorAll("iframe"); 35 iframes[0].src = "file_event_screenXY.html"; 36 await waitForMessage("ready", location.origin); 37 38 iframes[1].src = "https://example.com/tests/dom/events/test/file_event_screenXY.html"; 39 await waitForMessage("ready", "https://example.com"); 40 41 // Wait for APZ state stable so that mouse event handling APZ works properly 42 // in out-of-process iframes. 43 await promiseApzFlushedRepaints(); 44 45 const promiseForSameOrigin = new Promise(resolve => { 46 window.addEventListener("message", event => { 47 is(event.origin, location.origin, "origin should be the same as parent"); 48 resolve(event.data); 49 }, { once: true }); 50 }); 51 52 // NOTE: synthesizeMouseAtCenter doesn't work for OOP iframes (bug 1528935), 53 // so we use promiseNativeMouseEvent instead. 54 const [expectedScreenXInSameOrigin, expectedScreenYInSameOrigin] = 55 getScreenPosition(iframes[0], 10, 10); 56 await promiseNativeMouseEvent({ 57 type: "click", 58 target: iframes[0], 59 screenX: expectedScreenXInSameOrigin, 60 screenY: expectedScreenYInSameOrigin, 61 scale: "inScreenPixels", 62 }); 63 64 const eventInSameOrigin = await promiseForSameOrigin; 65 is(eventInSameOrigin.screenX, expectedScreenXInSameOrigin, 66 "event.screenX should be the same"); 67 is(eventInSameOrigin.screenY, expectedScreenYInSameOrigin, 68 "event.screenY should be the same"); 69 70 const [expectedScreenXInCrossOrigin, expectedScreenYInCrossOrigin] = 71 getScreenPosition(iframes[1], 10, 10); 72 await promiseNativeMouseEvent({ 73 type: "click", 74 target: iframes[0], 75 screenX: expectedScreenXInCrossOrigin, 76 screenY: expectedScreenYInCrossOrigin, 77 scale: "inScreenPixels", 78 }); 79 80 const promiseForCrossOrigin = new Promise(resolve => { 81 window.addEventListener("message", event => { 82 is(event.origin, "https://example.com", "origin should be example.com"); 83 resolve(event.data); 84 }, { once: true }); 85 }); 86 87 const eventInCrossOrigin = await promiseForCrossOrigin; 88 is(eventInCrossOrigin.screenX, expectedScreenXInCrossOrigin, 89 "even.screenX should be the same"); 90 is(eventInCrossOrigin.screenY, expectedScreenYInCrossOrigin, 91 "even.screenY should be the same"); 92 93 is(eventInSameOrigin.screenY, eventInCrossOrigin.screenY, 94 "event.screenY in both iframes should be the same"); 95 // Sanity checks to make sure client{X,Y} are the same. 96 is(eventInSameOrigin.clientX, eventInCrossOrigin.clientX, 97 "event.clientX in both iframes should be the same"); 98 is(eventInSameOrigin.clientY, eventInCrossOrigin.clientY, 99 "event.clientY in both iframes should be the same"); 100 }); 101 </script>