test_bug822898.html (10294B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=822898 5 --> 6 <head> 7 <title>Test for Bug 822898</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 10 </head> 11 <body> 12 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822898">Mozilla Bug 822898</a> 13 <p id="display"></p> 14 <div id="content" style="display: none"> 15 <iframe id="subFrame"></iframe> 16 </div> 17 <pre id="test"> 18 <script class="testbody" type="application/javascript"> 19 20 /** Test for Bug 822898 - Pointer* Events */ 21 22 let tests = [], testTarget, parent, iframeBody, gOnPointerPropHandled; 23 24 function nextTest() { 25 if (tests.length) 26 SimpleTest.executeSoon(tests.shift()); 27 } 28 29 function random() { 30 return Math.floor(Math.random() * 100); 31 } 32 33 function createTestEventValue(name) { 34 35 let detail = random(); 36 let screenX = random(); 37 let screenY = random(); 38 let clientX = random(); 39 let clientY = random(); 40 let ctrlKey = !!(random() % 2); 41 let altKey = !!(random() % 2); 42 let shiftKey = !!(random() % 2); 43 let metaKey = !!(random() % 2); 44 let button = random(); 45 let pointerId = random(); 46 47 return function() { 48 let event = new PointerEvent("pointerdown", { 49 bubbles: true, cancelable: true, view: window, 50 detail, screenX, screenY, clientX, clientY, 51 ctrlKey, altKey, shiftKey, metaKey, 52 button, relatedTarget: null, pointerId 53 }); 54 55 56 function check(ev) { 57 is(ev.detail, detail, "Correct detail"); 58 is(ev.screenX, screenX, "Correct screenX"); 59 is(ev.screenY, screenY, "Correct screenY"); 60 is(ev.clientX, clientX, "Correct clientX"); 61 is(ev.clientY, clientY, "Correct clientY"); 62 is(ev.ctrlKey, ctrlKey, "Correct ctrlKey"); 63 is(ev.altKey, altKey, "Correct altKey"); 64 is(ev.shiftKey, shiftKey, "Correct shiftKey"); 65 is(ev.metaKey, metaKey, "Correct metaKey"); 66 is(ev.button, button, "Correct buttonArg"); 67 is(ev.pointerId, pointerId, "Correct pointerId"); 68 } 69 70 for (let target of [document, window, testTarget, parent]) 71 target.addEventListener(name, check); 72 73 testTarget.dispatchEvent(event); 74 75 for (let target of [document, window, testTarget, parent]) 76 target.removeEventListener(name, check); 77 78 79 nextTest(); 80 } 81 } 82 83 function getDefaultArgEvent(eventname) { 84 return new PointerEvent(eventname, { 85 bubbles: true, cancelable: true, view: window, 86 detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, 87 ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, 88 button: 0, relatedTarget: null, pointerId: 0 89 }); 90 } 91 92 function testDefaultArg() { 93 let event = getDefaultArgEvent("pointerdown"); 94 95 testTarget.addEventListener("pointerdown", function(ev) { 96 is(ev.pointerId, 0, "Correct default pointerId"); 97 }, {once: true}); 98 testTarget.dispatchEvent(event); 99 100 nextTest(); 101 } 102 103 function testStopPropagation() { 104 let event = getDefaultArgEvent("pointerdown"); 105 106 let unreachableListener = function () { 107 ok(false, "Event should have been stopped"); 108 } 109 110 // Capturing phase 111 let captured = false; 112 parent.addEventListener("pointerdown", function() { 113 captured = true; 114 }, {capture: true, once: true}); // Capturing phase 115 116 // Bubbling phase 117 parent.addEventListener("pointerdown", unreachableListener); 118 119 testTarget.addEventListener("pointerdown", function(ev) { 120 is(captured, true, "Event should have been captured"); 121 ev.stopPropagation(); 122 }, {once: true}); 123 124 testTarget.dispatchEvent(event); 125 126 parent.removeEventListener("pointerdown", unreachableListener); 127 128 nextTest(); 129 } 130 131 function testPreventDefault() { 132 let event = getDefaultArgEvent("pointerdown"); 133 134 parent.addEventListener("pointerdown", function(ev) { 135 is(ev.defaultPrevented, true, "preventDefault can be called"); 136 nextTest(); 137 }, {once: true}); 138 139 testTarget.addEventListener("pointerdown", function(ev) { 140 ev.preventDefault(); 141 }, {once: true}); 142 143 testTarget.dispatchEvent(event); 144 } 145 146 function testBlockPreventDefault() { 147 let event = new PointerEvent("pointerdown", { 148 bubbles: true, cancelable: false, view: window, 149 detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, 150 ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, 151 button: 0, relatedTarget: null, pointerId: 0, pointerType: "pen" 152 }); 153 154 parent.addEventListener("pointerdown", function(ev) { 155 is(ev.defaultPrevented, false, "aCancelableArg works"); 156 nextTest(); 157 }, {once: true}); 158 159 testTarget.addEventListener("pointerdown", function(ev) { 160 ev.preventDefault(); 161 }, {once: true}); 162 163 testTarget.dispatchEvent(event); 164 } 165 166 function testBlockBubbling() { 167 let unreachableListener = function () { 168 ok(false, "aCanBubble doesn't work"); 169 } 170 171 let event = new PointerEvent("pointerdown", { 172 bubbles: false, cancelable: true, view: window, 173 detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, 174 ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, 175 button: 0, relatedTarget: null, pointerId: 0 176 }); 177 178 parent.addEventListener("pointerdown", unreachableListener); 179 testTarget.dispatchEvent(event); 180 parent.removeEventListener("pointerdown", unreachableListener); 181 182 nextTest(); 183 } 184 185 function testOnPointerProperty() 186 { 187 iframeBody.onpointerdown = function (e) { gOnPointerPropHandled.pointerdown = true; } 188 iframeBody.onpointerup = function (e) { gOnPointerPropHandled.pointerup = true; } 189 iframeBody.onpointermove = function (e) { gOnPointerPropHandled.pointermove = true; } 190 iframeBody.onpointerout = function (e) { gOnPointerPropHandled.pointerout = true; } 191 iframeBody.onpointerover = function (e) { gOnPointerPropHandled.pointerover = true; } 192 iframeBody.onpointerenter = function (e) { gOnPointerPropHandled.pointerenter = true; } 193 iframeBody.onpointerleave = function (e) { gOnPointerPropHandled.pointerleave = true; } 194 iframeBody.onpointercancel = function (e) { gOnPointerPropHandled.pointercancel = true; } 195 196 iframeBody.dispatchEvent(getDefaultArgEvent("pointerdown")); 197 is(gOnPointerPropHandled.pointerdown, true, "pointerdown property is performed"); 198 199 iframeBody.dispatchEvent(getDefaultArgEvent("pointerup")); 200 is(gOnPointerPropHandled.pointerup, true, "pointerup property is performed"); 201 202 iframeBody.dispatchEvent(getDefaultArgEvent("pointermove")); 203 is(gOnPointerPropHandled.pointermove, true, "pointermove property is performed"); 204 205 iframeBody.dispatchEvent(getDefaultArgEvent("pointerout")); 206 is(gOnPointerPropHandled.pointerout, true, "pointerout property is performed"); 207 208 iframeBody.dispatchEvent(getDefaultArgEvent("pointerover")); 209 is(gOnPointerPropHandled.pointerover, true, "pointerover property is performed"); 210 211 iframeBody.dispatchEvent(getDefaultArgEvent("pointerenter")); 212 is(gOnPointerPropHandled.pointerenter, true, "pointerenter property is performed"); 213 214 iframeBody.dispatchEvent(getDefaultArgEvent("pointerleave")); 215 is(gOnPointerPropHandled.pointerleave, true, "pointerleave property is performed"); 216 217 iframeBody.dispatchEvent(getDefaultArgEvent("pointercancel")); 218 is(gOnPointerPropHandled.pointercancel, true, "pointercancel property is performed"); 219 220 nextTest(); 221 } 222 223 function testPointerEventCTORS() 224 { 225 // TODO: This should go to test_eventctors.html, when PointerEvents enabled by default 226 var receivedEvent; 227 iframeBody.addEventListener("hello", function(e) { receivedEvent = e; }, true); 228 229 var e; 230 var ex = false; 231 232 try { 233 e = new PointerEvent(); 234 } catch(exp) { 235 ex = true; 236 } 237 ok(ex, "PointerEvent: First parameter is required!"); 238 ex = false; 239 240 e = new PointerEvent("hello"); 241 is(e.type, "hello", "PointerEvent: Wrong event type!"); 242 ok(!e.isTrusted, "PointerEvent: Event shouldn't be trusted!"); 243 ok(!e.bubbles, "PointerEvent: Event shouldn't bubble!"); 244 ok(!e.cancelable, "PointerEvent: Event shouldn't be cancelable!"); 245 iframeBody.dispatchEvent(e); 246 is(receivedEvent, e, "PointerEvent: Wrong event!"); 247 248 var PointerEventProps = 249 [ { screenX: 0 }, 250 { screenY: 0 }, 251 { clientX: 0 }, 252 { clientY: 0 }, 253 { ctrlKey: false }, 254 { shiftKey: false }, 255 { altKey: false }, 256 { metaKey: false }, 257 { button: 0 }, 258 { buttons: 0 }, 259 { relatedTarget: null }, 260 { pointerId: 0 }, 261 { pointerType: "" } 262 ]; 263 264 var testPointerProps = 265 [ 266 { screenX: 1 }, 267 { screenY: 2 }, 268 { clientX: 3 }, 269 { clientY: 4 }, 270 { ctrlKey: true }, 271 { shiftKey: true }, 272 { altKey: true }, 273 { metaKey: true }, 274 { button: 5 }, 275 { buttons: 6 }, 276 { relatedTarget: window }, 277 { pointerId: 5 }, 278 { pointerType: "mouse" } 279 ]; 280 281 var defaultPointerEventValues = {}; 282 for (var i = 0; i < PointerEventProps.length; ++i) { 283 for (prop in PointerEventProps[i]) { 284 ok(prop in e, "PointerEvent: PointerEvent doesn't have property " + prop + "!"); 285 defaultPointerEventValues[prop] = PointerEventProps[i][prop]; 286 } 287 } 288 289 while (testPointerProps.length) { 290 var p = testPointerProps.shift(); 291 e = new PointerEvent("foo", p); 292 for (var def in defaultPointerEventValues) { 293 if (!(def in p)) { 294 is(e[def], defaultPointerEventValues[def], 295 "PointerEvent: Wrong default value for " + def + "!"); 296 } else { 297 is(e[def], p[def], "PointerEvent: Wrong event init value for " + def + "!"); 298 } 299 } 300 } 301 nextTest(); 302 } 303 304 function runTests() { 305 testTarget = document.getElementById("testTarget"); 306 parent = testTarget.parentNode; 307 gOnPointerPropHandled = new Array; 308 iframeBody = document.getElementById("subFrame").contentWindow.document.body; 309 310 tests.push(createTestEventValue("pointerdown")); 311 tests.push(createTestEventValue("pointermove")); 312 tests.push(createTestEventValue("pointerup")); 313 314 tests.push(testDefaultArg); 315 tests.push(testStopPropagation); 316 317 tests.push(testPreventDefault); 318 tests.push(testBlockPreventDefault); 319 320 tests.push(testBlockBubbling); 321 tests.push(testOnPointerProperty()); 322 tests.push(testPointerEventCTORS()); 323 324 tests.push(function() { 325 SimpleTest.finish(); 326 }); 327 328 nextTest(); 329 } 330 331 window.onload = function() { 332 SimpleTest.executeSoon(runTests); 333 } 334 335 SimpleTest.waitForExplicitFinish(); 336 337 </script> 338 </pre> 339 <div id="parent"> 340 <span id="testTarget" style="border: 1px solid black;">testTarget</span> 341 </div> 342 </body> 343 </html>