1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/events/test/test_bug822898.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,363 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<html> 1.6 +<!-- 1.7 +https://bugzilla.mozilla.org/show_bug.cgi?id=822898 1.8 +--> 1.9 +<head> 1.10 + <title>Test for Bug 822898</title> 1.11 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.12 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 1.13 +</head> 1.14 +<body> 1.15 +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822898">Mozilla Bug 822898</a> 1.16 +<p id="display"></p> 1.17 +<div id="content" style="display: none"> 1.18 + <iframe id="subFrame"></iframe> 1.19 +</div> 1.20 +<pre id="test"> 1.21 +<script class="testbody" type="application/javascript;version=1.8"> 1.22 + 1.23 +/** Test for Bug 822898 - Pointer* Events **/ 1.24 + 1.25 +let tests = [], testTarget, parent, iframeBody, gOnPointerPropHandled; 1.26 + 1.27 +function nextTest() { 1.28 + if (tests.length) 1.29 + SimpleTest.executeSoon(tests.shift()); 1.30 +} 1.31 + 1.32 +function random() { 1.33 + return Math.floor(Math.random() * 100); 1.34 +} 1.35 + 1.36 +function createTestEventValue(name) { 1.37 + 1.38 + let detail = random(); 1.39 + let screenX = random(); 1.40 + let screenY = random(); 1.41 + let clientX = random(); 1.42 + let clientY = random(); 1.43 + let ctrlKey = random() % 2 ? true : false; 1.44 + let altKey = random() % 2 ? true : false; 1.45 + let shiftKey = random() % 2 ? true : false; 1.46 + let metaKey = random() % 2 ? true : false; 1.47 + let button = random(); 1.48 + let pointerId = random(); 1.49 + 1.50 + return function() { 1.51 + let event = new PointerEvent("pointerdown", { 1.52 + bubbles: true, cancelable: true, view: window, 1.53 + detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, 1.54 + ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, 1.55 + button: button, relatedTarget: null, pointerId: pointerId 1.56 + }); 1.57 + 1.58 + 1.59 + function check(ev) { 1.60 + is(ev.detail, detail, "Correct detail"); 1.61 + is(ev.screenX, screenX, "Correct screenX"); 1.62 + is(ev.screenY, screenY, "Correct screenY"); 1.63 + is(ev.clientX, clientX, "Correct clientX"); 1.64 + is(ev.clientY, clientY, "Correct clientY"); 1.65 + is(ev.ctrlKey, ctrlKey, "Correct ctrlKey"); 1.66 + is(ev.altKey, altKey, "Correct altKey"); 1.67 + is(ev.shiftKey, shiftKey, "Correct shiftKey"); 1.68 + is(ev.metaKey, metaKey, "Correct metaKey"); 1.69 + is(ev.button, button, "Correct buttonArg"); 1.70 + is(ev.pointerId, pointerId, "Correct pointerId"); 1.71 + } 1.72 + 1.73 + for each (let target in [document, window, testTarget, parent]) 1.74 + target.addEventListener(name, check, false); 1.75 + 1.76 + testTarget.dispatchEvent(event); 1.77 + 1.78 + for each (let target in [document, window, testTarget, parent]) 1.79 + target.removeEventListener(name, check, false); 1.80 + 1.81 + 1.82 + nextTest(); 1.83 + } 1.84 +} 1.85 + 1.86 +function getDefaultArgEvent(eventname) { 1.87 + return new PointerEvent(eventname, { 1.88 + bubbles: true, cancelable: true, view: window, 1.89 + detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, 1.90 + ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, 1.91 + button: 0, relatedTarget: null, pointerId: 0 1.92 + }); 1.93 +} 1.94 + 1.95 +function testDefaultArg() { 1.96 + let event = getDefaultArgEvent("pointerdown"); 1.97 + 1.98 + testTarget.addEventListener("pointerdown", function(ev) { 1.99 + testTarget.removeEventListener("pointerdown", arguments.callee, false); 1.100 + is(ev.pointerId, 0, "Correct default pointerId"); 1.101 + }, false); 1.102 + testTarget.dispatchEvent(event); 1.103 + 1.104 + nextTest(); 1.105 +} 1.106 + 1.107 +function testStopPropagation() { 1.108 + let event = getDefaultArgEvent("pointerdown"); 1.109 + 1.110 + let unreachableListener = function () { 1.111 + ok(false, "Event should have been stopped"); 1.112 + } 1.113 + 1.114 + // Capturing phase 1.115 + let captured = false; 1.116 + parent.addEventListener("pointerdown", function() { 1.117 + parent.removeEventListener("pointerdown", arguments.callee, true); 1.118 + captured = true; 1.119 + }, true); // Capturing phase 1.120 + 1.121 + // Bubbling phase 1.122 + parent.addEventListener("pointerdown", unreachableListener, false); 1.123 + 1.124 + testTarget.addEventListener("pointerdown", function(ev) { 1.125 + testTarget.removeEventListener("pointerdown", arguments.callee, false); 1.126 + is(captured, true, "Event should have been captured"); 1.127 + ev.stopPropagation(); 1.128 + }, false); 1.129 + 1.130 + testTarget.dispatchEvent(event); 1.131 + 1.132 + parent.removeEventListener("pointerdown", unreachableListener, false); 1.133 + 1.134 + nextTest(); 1.135 +} 1.136 + 1.137 +function testPreventDefault() { 1.138 + let event = getDefaultArgEvent("pointerdown"); 1.139 + 1.140 + parent.addEventListener("pointerdown", function(ev) { 1.141 + parent.removeEventListener("pointerdown", arguments.callee, false); 1.142 + is(ev.defaultPrevented, true, "preventDefault can be called"); 1.143 + nextTest(); 1.144 + }, false); 1.145 + 1.146 + testTarget.addEventListener("pointerdown", function(ev) { 1.147 + testTarget.removeEventListener("pointerdown", arguments.callee, false); 1.148 + ev.preventDefault(); 1.149 + }, false); 1.150 + 1.151 + testTarget.dispatchEvent(event); 1.152 +} 1.153 + 1.154 +function testBlockPreventDefault() { 1.155 + let event = new PointerEvent("pointerdown", { 1.156 + bubbles: true, cancelable: false, view: window, 1.157 + detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, 1.158 + ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, 1.159 + button: 0, relatedTarget: null, pointerId: 0, pointerType: "pen" 1.160 + }); 1.161 + 1.162 + parent.addEventListener("pointerdown", function(ev) { 1.163 + parent.removeEventListener("pointerdown", arguments.callee, false); 1.164 + is(ev.defaultPrevented, false, "aCancelableArg works"); 1.165 + nextTest(); 1.166 + }, false); 1.167 + 1.168 + testTarget.addEventListener("pointerdown", function(ev) { 1.169 + testTarget.removeEventListener("pointerdown", arguments.callee, false); 1.170 + ev.preventDefault(); 1.171 + }, false); 1.172 + 1.173 + testTarget.dispatchEvent(event); 1.174 +} 1.175 + 1.176 +function testBlockBubbling() { 1.177 + let unreachableListener = function () { 1.178 + ok(false, "aCanBubble doesn't work"); 1.179 + } 1.180 + 1.181 + let event = new PointerEvent("pointerdown", { 1.182 + bubbles: false, cancelable: true, view: window, 1.183 + detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, 1.184 + ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, 1.185 + button: 0, relatedTarget: null, pointerId: 0 1.186 + }); 1.187 + 1.188 + parent.addEventListener("pointerdown", unreachableListener, false); 1.189 + testTarget.dispatchEvent(event); 1.190 + parent.removeEventListener("pointerdown", unreachableListener, false); 1.191 + 1.192 + nextTest(); 1.193 +} 1.194 + 1.195 +function testOnPointerProperty() 1.196 +{ 1.197 + iframeBody.onpointerdown = function (e) { gOnPointerPropHandled["pointerdown"] = true; } 1.198 + iframeBody.onpointerup = function (e) { gOnPointerPropHandled["pointerup"] = true; } 1.199 + iframeBody.onpointermove = function (e) { gOnPointerPropHandled["pointermove"] = true; } 1.200 + iframeBody.onpointerout = function (e) { gOnPointerPropHandled["pointerout"] = true; } 1.201 + iframeBody.onpointerover = function (e) { gOnPointerPropHandled["pointerover"] = true; } 1.202 + iframeBody.onpointerenter = function (e) { gOnPointerPropHandled["pointerenter"] = true; } 1.203 + iframeBody.onpointerleave = function (e) { gOnPointerPropHandled["pointerleave"] = true; } 1.204 + iframeBody.onpointercancel = function (e) { gOnPointerPropHandled["pointercancel"] = true; } 1.205 + 1.206 + iframeBody.dispatchEvent(getDefaultArgEvent("pointerdown")); 1.207 + is(gOnPointerPropHandled['pointerdown'], true, "pointerdown property is performed"); 1.208 + 1.209 + iframeBody.dispatchEvent(getDefaultArgEvent("pointerup")); 1.210 + is(gOnPointerPropHandled['pointerup'], true, "pointerup property is performed"); 1.211 + 1.212 + iframeBody.dispatchEvent(getDefaultArgEvent("pointermove")); 1.213 + is(gOnPointerPropHandled['pointermove'], true, "pointermove property is performed"); 1.214 + 1.215 + iframeBody.dispatchEvent(getDefaultArgEvent("pointerout")); 1.216 + is(gOnPointerPropHandled['pointerout'], true, "pointerout property is performed"); 1.217 + 1.218 + iframeBody.dispatchEvent(getDefaultArgEvent("pointerover")); 1.219 + is(gOnPointerPropHandled['pointerover'], true, "pointerover property is performed"); 1.220 + 1.221 + iframeBody.dispatchEvent(getDefaultArgEvent("pointerenter")); 1.222 + is(gOnPointerPropHandled['pointerenter'], true, "pointerenter property is performed"); 1.223 + 1.224 + iframeBody.dispatchEvent(getDefaultArgEvent("pointerleave")); 1.225 + is(gOnPointerPropHandled['pointerleave'], true, "pointerleave property is performed"); 1.226 + 1.227 + iframeBody.dispatchEvent(getDefaultArgEvent("pointercancel")); 1.228 + is(gOnPointerPropHandled['pointercancel'], true, "pointercancel property is performed"); 1.229 + 1.230 + nextTest(); 1.231 +} 1.232 + 1.233 +function testPointerEventCTORS() 1.234 +{ 1.235 + // TODO: This should go to test_eventctors.html, when PointerEvents enabled by default 1.236 + var receivedEvent; 1.237 + iframeBody.addEventListener("hello", function(e) { receivedEvent = e; }, true); 1.238 + 1.239 + var e; 1.240 + var ex = false; 1.241 + 1.242 + try { 1.243 + e = new PointerEvent(); 1.244 + } catch(exp) { 1.245 + ex = true; 1.246 + } 1.247 + ok(ex, "PointerEvent: First parameter is required!"); 1.248 + ex = false; 1.249 + 1.250 + e = new PointerEvent("hello"); 1.251 + ok(e.type, "hello", "PointerEvent: Wrong event type!"); 1.252 + ok(!e.isTrusted, "PointerEvent: Event shouldn't be trusted!"); 1.253 + ok(!e.bubbles, "PointerEvent: Event shouldn't bubble!"); 1.254 + ok(!e.cancelable, "PointerEvent: Event shouldn't be cancelable!"); 1.255 + iframeBody.dispatchEvent(e); 1.256 + is(receivedEvent, e, "PointerEvent: Wrong event!"); 1.257 + 1.258 + var PointerEventProps = 1.259 + [ { screenX: 0 }, 1.260 + { screenY: 0 }, 1.261 + { clientX: 0 }, 1.262 + { clientY: 0 }, 1.263 + { ctrlKey: false }, 1.264 + { shiftKey: false }, 1.265 + { altKey: false }, 1.266 + { metaKey: false }, 1.267 + { button: 0 }, 1.268 + { buttons: 0 }, 1.269 + { relatedTarget: null }, 1.270 + { pointerId: 0 }, 1.271 + { pointerType: "" } 1.272 + ]; 1.273 + 1.274 + var testPointerProps = 1.275 + [ 1.276 + { screenX: 1 }, 1.277 + { screenY: 2 }, 1.278 + { clientX: 3 }, 1.279 + { clientY: 4 }, 1.280 + { ctrlKey: true }, 1.281 + { shiftKey: true }, 1.282 + { altKey: true }, 1.283 + { metaKey: true }, 1.284 + { button: 5 }, 1.285 + { buttons: 6 }, 1.286 + { relatedTarget: window }, 1.287 + { pointerId: 5 }, 1.288 + { pointerType: "mouse" } 1.289 + ]; 1.290 + 1.291 + var defaultPointerEventValues = {}; 1.292 + for (var i = 0; i < PointerEventProps.length; ++i) { 1.293 + for (prop in PointerEventProps[i]) { 1.294 + ok(prop in e, "PointerEvent: PointerEvent doesn't have property " + prop + "!"); 1.295 + defaultPointerEventValues[prop] = PointerEventProps[i][prop]; 1.296 + } 1.297 + } 1.298 + 1.299 + while (testPointerProps.length) { 1.300 + var p = testPointerProps.shift(); 1.301 + e = new PointerEvent("foo", p); 1.302 + for (var def in defaultPointerEventValues) { 1.303 + if (!(def in p)) { 1.304 + is(e[def], defaultPointerEventValues[def], 1.305 + "PointerEvent: Wrong default value for " + def + "!"); 1.306 + } else { 1.307 + is(e[def], p[def], "PointerEvent: Wrong event init value for " + def + "!"); 1.308 + } 1.309 + } 1.310 + } 1.311 + nextTest(); 1.312 +} 1.313 + 1.314 +function runTests() { 1.315 + SpecialPowers.setBoolPref("dom.w3c_pointer_events.enabled", true); // Enable Pointer Events 1.316 + testTarget = document.getElementById("testTarget"); 1.317 + parent = testTarget.parentNode; 1.318 + gOnPointerPropHandled = new Array; 1.319 + iframeBody = document.getElementById("subFrame").contentWindow.document.body; 1.320 + 1.321 + tests.push(createTestEventValue("pointerdown")); 1.322 + tests.push(createTestEventValue("pointermove")); 1.323 + tests.push(createTestEventValue("pointerup")); 1.324 + 1.325 + tests.push(testDefaultArg); 1.326 + tests.push(testStopPropagation); 1.327 + 1.328 + tests.push(testPreventDefault); 1.329 + tests.push(testBlockPreventDefault); 1.330 + 1.331 + tests.push(testBlockBubbling); 1.332 + tests.push(testOnPointerProperty()); 1.333 + tests.push(testPointerEventCTORS()); 1.334 + 1.335 + tests.push(function() { 1.336 + clearPrefs(); 1.337 + SimpleTest.finish(); 1.338 + }); 1.339 + 1.340 + nextTest(); 1.341 +} 1.342 + 1.343 +function initPrefs() 1.344 +{ 1.345 + SpecialPowers.setBoolPref("dom.w3c_pointer_events.enabled", true); // Enable Pointer Events 1.346 +} 1.347 + 1.348 +function clearPrefs() 1.349 +{ 1.350 + SpecialPowers.clearUserPref("dom.w3c_pointer_events.enabled"); // Disable Pointer Events 1.351 +} 1.352 + 1.353 +window.onload = function () { 1.354 + initPrefs(); 1.355 + SimpleTest.executeSoon(runTests); 1.356 +} 1.357 + 1.358 +SimpleTest.waitForExplicitFinish(); 1.359 + 1.360 +</script> 1.361 +</pre> 1.362 +<div id="parent"> 1.363 + <span id="testTarget" style="border: 1px solid black;">testTarget</span> 1.364 +</div> 1.365 +</body> 1.366 +</html>