Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=967796
5 -->
6 <head>
7 <title>Test for Bug 967796</title>
8 <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
9 <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
11 </head>
12 <body>
13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=967796">Mozilla Bug 967796</a>
14 <p id="display"></p>
15 <div id="content" style="display: none">
17 </div>
18 <pre id="test">
19 <script type="application/javascript">
21 /** Test for Bug 967796 **/
23 SpecialPowers.setBoolPref("dom.w3c_pointer_events.enabled", true); // Enable Pointer Events
25 SimpleTest.waitForExplicitFinish();
26 SimpleTest.waitForFocus(runTests);
27 var outer;
28 var middle;
29 var inner;
30 var outside;
31 var container;
32 var file;
33 var iframe;
34 var checkRelatedTarget = false;
35 var expectedRelatedEnter = null;
36 var expectedRelatedLeave = null;
37 var pointerentercount = 0;
38 var pointerleavecount = 0;
39 var pointerovercount = 0;
40 var pointeroutcount = 0;
42 function sendPointerEvent(t, elem) {
43 var r = elem.getBoundingClientRect();
44 synthesizePointer(elem, r.width / 2, r.height / 2, {type: t});
45 }
47 var expectedPointerEnterTargets = [];
48 var expectedPointerLeaveTargets = [];
50 function runTests() {
51 outer = document.getElementById("outertest");
52 middle = document.getElementById("middletest");
53 inner = document.getElementById("innertest");
54 outside = document.getElementById("outside");
55 container = document.getElementById("container");
56 file = document.getElementById("file");
57 iframe = document.getElementById("iframe");
59 // Make sure ESM thinks pointer is outside the test elements.
60 sendPointerEvent("pointermove", outside);
62 pointerentercount = 0;
63 pointerleavecount = 0;
64 pointerovercount = 0;
65 pointeroutcount = 0;
66 checkRelatedTarget = true;
67 expectedRelatedEnter = outside;
68 expectedRelatedLeave = inner;
69 expectedPointerEnterTargets = ["outertest", "middletest", "innertest"];
70 sendPointerEvent("pointermove", inner);
71 is(pointerentercount, 3, "Unexpected pointerenter event count!");
72 is(pointerovercount, 1, "Unexpected pointerover event count!");
73 is(pointeroutcount, 0, "Unexpected pointerout event count!");
74 is(pointerleavecount, 0, "Unexpected pointerleave event count!");
75 expectedRelatedEnter = inner;
76 expectedRelatedLeave = outside;
77 expectedPointerLeaveTargets = ["innertest", "middletest", "outertest"];
78 sendPointerEvent("pointermove", outside);
79 is(pointerentercount, 3, "Unexpected pointerenter event count!");
80 is(pointerovercount, 1, "Unexpected pointerover event count!");
81 is(pointeroutcount, 1, "Unexpected pointerout event count!");
82 is(pointerleavecount, 3, "Unexpected pointerleave event count!");
84 // Event handling over native anonymous content.
85 var r = file.getBoundingClientRect();
86 expectedRelatedEnter = outside;
87 expectedRelatedLeave = file;
88 synthesizePointer(file, r.width / 6, r.height / 2, {type: "pointermove"});
89 is(pointerentercount, 4, "Unexpected pointerenter event count!");
90 is(pointerovercount, 2, "Unexpected pointerover event count!");
91 is(pointeroutcount, 1, "Unexpected pointerout event count!");
92 is(pointerleavecount, 3, "Unexpected pointerleave event count!");
94 // Moving pointer over type="file" shouldn't cause pointerover/out/enter/leave events
95 synthesizePointer(file, r.width - (r.width / 6), r.height / 2, {type: "pointermove"});
96 is(pointerentercount, 4, "Unexpected pointerenter event count!");
97 is(pointerovercount, 2, "Unexpected pointerover event count!");
98 is(pointeroutcount, 1, "Unexpected pointerout event count!");
99 is(pointerleavecount, 3, "Unexpected pointerleave event count!");
101 expectedRelatedEnter = file;
102 expectedRelatedLeave = outside;
103 sendPointerEvent("pointermove", outside);
104 is(pointerentercount, 4, "Unexpected pointerenter event count!");
105 is(pointerovercount, 2, "Unexpected pointerover event count!");
106 is(pointeroutcount, 2, "Unexpected pointerout event count!");
107 is(pointerleavecount, 4, "Unexpected pointerleave event count!");
109 // Initialize iframe
110 iframe.contentDocument.documentElement.style.overflow = "hidden";
111 iframe.contentDocument.body.style.margin = "0px";
112 iframe.contentDocument.body.style.width = "100%";
113 iframe.contentDocument.body.style.height = "100%";
114 iframe.contentDocument.body.innerHTML =
115 "<div style='width: 100%; height: 50%; border: 1px solid black;'></div>" +
116 "<div style='width: 100%; height: 50%; border: 1px solid black;'></div>";
117 iframe.contentDocument.body.offsetLeft; // flush
119 iframe.contentDocument.body.firstChild.onpointerenter = penter;
120 iframe.contentDocument.body.firstChild.onpointerleave = pleave;
121 iframe.contentDocument.body.lastChild.onpointerenter = penter;
122 iframe.contentDocument.body.lastChild.onpointerleave = pleave;
123 r = iframe.getBoundingClientRect();
124 expectedRelatedEnter = outside;
125 expectedRelatedLeave = iframe;
126 // Move pointer inside the iframe.
127 synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointermove"},
128 iframe.contentWindow);
129 synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height - (r.height / 4), {type: "pointermove"},
130 iframe.contentWindow);
131 is(pointerentercount, 7, "Unexpected pointerenter event count!");
132 expectedRelatedEnter = iframe;
133 expectedRelatedLeave = outside;
134 sendPointerEvent("pointermove", outside);
135 is(pointerleavecount, 7, "Unexpected pointerleave event count!");
137 // pointerdown must produce pointerenter event
138 expectedRelatedEnter = outside;
139 expectedRelatedLeave = iframe;
140 // Move pointer inside the iframe.
141 synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointerdown"},
142 iframe.contentWindow);
143 synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height - (r.height / 4), {type: "pointerdown"},
144 iframe.contentWindow);
145 is(pointerentercount, 10, "Unexpected pointerenter event count!");
147 // pointerdown + pointermove must produce single pointerenter event
148 expectedRelatedEnter = outside;
149 expectedRelatedLeave = iframe;
150 synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointerdown"},
151 iframe.contentWindow);
152 synthesizePointer(iframe.contentDocument.body, r.width / 2 + 1, r.height / 4 + 1, {type: "pointermove"},
153 iframe.contentWindow);
154 is(pointerentercount, 11, "Unexpected pointerenter event count!");
156 SpecialPowers.clearUserPref("dom.w3c_pointer_events.enabled"); // Disable Pointer Events
158 SimpleTest.finish();
159 }
161 function penter(evt) {
162 ++pointerentercount;
163 evt.stopPropagation();
164 if (expectedPointerEnterTargets.length) {
165 var t = expectedPointerEnterTargets.shift();
166 is(evt.target.id, t, "Wrong event target!");
167 }
168 is(evt.bubbles, false, evt.type + " should not bubble!");
169 is(evt.cancelable, false, evt.type + " is cancelable!");
170 is(evt.target, evt.currentTarget, "Wrong event target!");
171 ok(!evt.relatedTarget || evt.target.ownerDocument == evt.relatedTarget.ownerDocument,
172 "Leaking nodes to another document?");
173 if (checkRelatedTarget && evt.target.ownerDocument == document) {
174 is(evt.relatedTarget, expectedRelatedEnter, "Wrong related target (pointerenter)");
175 }
176 }
178 function pleave(evt) {
179 ++pointerleavecount;
180 evt.stopPropagation();
181 if (expectedPointerLeaveTargets.length) {
182 var t = expectedPointerLeaveTargets.shift();
183 is(evt.target.id, t, "Wrong event target!");
184 }
185 is(evt.bubbles, false, evt.type + " should not bubble!");
186 is(evt.cancelable, false, evt.type + " is cancelable!");
187 is(evt.target, evt.currentTarget, "Wrong event target!");
188 ok(!evt.relatedTarget || evt.target.ownerDocument == evt.relatedTarget.ownerDocument,
189 "Leaking nodes to another document?");
190 if (checkRelatedTarget && evt.target.ownerDocument == document) {
191 is(evt.relatedTarget, expectedRelatedLeave, "Wrong related target (pointerleave)");
192 }
193 }
195 function pover(evt) {
196 ++pointerovercount;
197 evt.stopPropagation();
198 }
200 function pout(evt) {
201 ++pointeroutcount;
202 evt.stopPropagation();
203 }
205 </script>
206 </pre>
207 <div id="container" onpointerenter="penter(event)" onpointerleave="pleave(event)"
208 onpointerout="pout(event)" onpointerover="pover(event)">
209 <div id="outside" onpointerout="event.stopPropagation()" onpointerover="event.stopPropagation()">foo</div>
210 <div id="outertest" onpointerenter="penter(event)" onpointerleave="pleave(event)"
211 onpointerout="pout(event)" onpointerover="pover(event)">
212 <div id="middletest" onpointerenter="penter(event)" onpointerleave="pleave(event)"
213 onpointerout="pout(event)" onpointerover="pover(event)">
214 <div id="innertest" onpointerenter="penter(event)" onpointerleave="pleave(event)"
215 onpointerout="pout(event)" onpointerover="pover(event)">foo</div>
216 </div>
217 </div>
218 <input type="file" id="file"
219 onpointerenter="penter(event)" onpointerleave="pleave(event)"
220 onpointerout="pout(event)" onpointerover="pover(event)">
221 <br>
222 <iframe id="iframe" width="50px" height="50px"
223 onpointerenter="penter(event)" onpointerleave="pleave(event)"
224 onpointerout="pout(event)" onpointerover="pover(event)"></iframe>
225 </div>
226 </body>
227 </html>