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>
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
)];
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
);
31 add_task(async () => {
32 await SimpleTest
.promiseFocus();
34 const iframes
= document
.querySelectorAll("iframe");
35 iframes
[0].src
= "file_event_screenXY.html";
36 await
waitForMessage("ready", location
.origin
);
38 iframes
[1].src
= "https://example.com/tests/dom/events/test/file_event_screenXY.html";
39 await
waitForMessage("ready", "https://example.com");
41 // Wait for APZ state stable so that mouse event handling APZ works properly
42 // in out-of-process iframes.
43 await
promiseApzFlushedRepaints();
45 const promiseForSameOrigin
= new Promise(resolve
=> {
46 window
.addEventListener("message", event
=> {
47 is(event
.origin
, location
.origin
, "origin should be the same as parent");
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({
59 screenX
: expectedScreenXInSameOrigin
,
60 screenY
: expectedScreenYInSameOrigin
,
61 scale
: "inScreenPixels",
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");
70 const [expectedScreenXInCrossOrigin
, expectedScreenYInCrossOrigin
] =
71 getScreenPosition(iframes
[1], 10, 10);
72 await
promiseNativeMouseEvent({
75 screenX
: expectedScreenXInCrossOrigin
,
76 screenY
: expectedScreenYInCrossOrigin
,
77 scale
: "inScreenPixels",
80 const promiseForCrossOrigin
= new Promise(resolve
=> {
81 window
.addEventListener("message", event
=> {
82 is(event
.origin
, "https://example.com", "origin should be example.com");
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");
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");