dom/events/test/test_bug967796.html

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/events/test/test_bug967796.html	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,227 @@
     1.4 +<!DOCTYPE HTML>
     1.5 +<html>
     1.6 +<!--
     1.7 +https://bugzilla.mozilla.org/show_bug.cgi?id=967796
     1.8 +-->
     1.9 +<head>
    1.10 +  <title>Test for Bug 967796</title>
    1.11 +  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
    1.12 +  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
    1.13 +  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
    1.14 +</head>
    1.15 +<body>
    1.16 +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=967796">Mozilla Bug 967796</a>
    1.17 +<p id="display"></p>
    1.18 +<div id="content" style="display: none">
    1.19 +
    1.20 +</div>
    1.21 +<pre id="test">
    1.22 +<script type="application/javascript">
    1.23 +
    1.24 +/** Test for Bug 967796 **/
    1.25 +
    1.26 +SpecialPowers.setBoolPref("dom.w3c_pointer_events.enabled", true);      // Enable Pointer Events
    1.27 +
    1.28 +SimpleTest.waitForExplicitFinish();
    1.29 +SimpleTest.waitForFocus(runTests);
    1.30 +var outer;
    1.31 +var middle;
    1.32 +var inner;
    1.33 +var outside;
    1.34 +var container;
    1.35 +var file;
    1.36 +var iframe;
    1.37 +var checkRelatedTarget = false;
    1.38 +var expectedRelatedEnter = null;
    1.39 +var expectedRelatedLeave = null;
    1.40 +var pointerentercount = 0;
    1.41 +var pointerleavecount = 0;
    1.42 +var pointerovercount = 0;
    1.43 +var pointeroutcount = 0;
    1.44 +
    1.45 +function sendPointerEvent(t, elem) {
    1.46 +  var r = elem.getBoundingClientRect();
    1.47 +  synthesizePointer(elem, r.width / 2, r.height / 2, {type: t});
    1.48 +}
    1.49 +
    1.50 +var expectedPointerEnterTargets = [];
    1.51 +var expectedPointerLeaveTargets = [];
    1.52 +
    1.53 +function runTests() {
    1.54 +  outer = document.getElementById("outertest");
    1.55 +  middle = document.getElementById("middletest");
    1.56 +  inner = document.getElementById("innertest");
    1.57 +  outside = document.getElementById("outside");
    1.58 +  container = document.getElementById("container");
    1.59 +  file = document.getElementById("file");
    1.60 +  iframe = document.getElementById("iframe");
    1.61 +
    1.62 +  // Make sure ESM thinks pointer is outside the test elements.
    1.63 +  sendPointerEvent("pointermove", outside);
    1.64 +
    1.65 +  pointerentercount = 0;
    1.66 +  pointerleavecount = 0;
    1.67 +  pointerovercount = 0;
    1.68 +  pointeroutcount = 0;
    1.69 +  checkRelatedTarget = true;
    1.70 +  expectedRelatedEnter = outside;
    1.71 +  expectedRelatedLeave = inner;
    1.72 +  expectedPointerEnterTargets = ["outertest", "middletest", "innertest"];
    1.73 +  sendPointerEvent("pointermove", inner);
    1.74 +  is(pointerentercount, 3, "Unexpected pointerenter event count!");
    1.75 +  is(pointerovercount, 1, "Unexpected pointerover event count!");
    1.76 +  is(pointeroutcount, 0, "Unexpected pointerout event count!");
    1.77 +  is(pointerleavecount, 0, "Unexpected pointerleave event count!");
    1.78 +  expectedRelatedEnter = inner;
    1.79 +  expectedRelatedLeave = outside;
    1.80 +  expectedPointerLeaveTargets = ["innertest", "middletest", "outertest"];
    1.81 +  sendPointerEvent("pointermove", outside);
    1.82 +  is(pointerentercount, 3, "Unexpected pointerenter event count!");
    1.83 +  is(pointerovercount, 1, "Unexpected pointerover event count!");
    1.84 +  is(pointeroutcount, 1, "Unexpected pointerout event count!");
    1.85 +  is(pointerleavecount, 3, "Unexpected pointerleave event count!");
    1.86 +
    1.87 +  // Event handling over native anonymous content.
    1.88 +  var r = file.getBoundingClientRect();
    1.89 +  expectedRelatedEnter = outside;
    1.90 +  expectedRelatedLeave = file;
    1.91 +  synthesizePointer(file, r.width / 6, r.height / 2, {type: "pointermove"});
    1.92 +  is(pointerentercount, 4, "Unexpected pointerenter event count!");
    1.93 +  is(pointerovercount, 2, "Unexpected pointerover event count!");
    1.94 +  is(pointeroutcount, 1, "Unexpected pointerout event count!");
    1.95 +  is(pointerleavecount, 3, "Unexpected pointerleave event count!");
    1.96 +
    1.97 +  // Moving pointer over type="file" shouldn't cause pointerover/out/enter/leave events
    1.98 +  synthesizePointer(file, r.width - (r.width / 6), r.height / 2, {type: "pointermove"});
    1.99 +  is(pointerentercount, 4, "Unexpected pointerenter event count!");
   1.100 +  is(pointerovercount, 2, "Unexpected pointerover event count!");
   1.101 +  is(pointeroutcount, 1, "Unexpected pointerout event count!");
   1.102 +  is(pointerleavecount, 3, "Unexpected pointerleave event count!");
   1.103 +
   1.104 +  expectedRelatedEnter = file;
   1.105 +  expectedRelatedLeave = outside;
   1.106 +  sendPointerEvent("pointermove", outside);
   1.107 +  is(pointerentercount, 4, "Unexpected pointerenter event count!");
   1.108 +  is(pointerovercount, 2, "Unexpected pointerover event count!");
   1.109 +  is(pointeroutcount, 2, "Unexpected pointerout event count!");
   1.110 +  is(pointerleavecount, 4, "Unexpected pointerleave event count!");
   1.111 +
   1.112 +  // Initialize iframe
   1.113 +  iframe.contentDocument.documentElement.style.overflow = "hidden";
   1.114 +  iframe.contentDocument.body.style.margin = "0px";
   1.115 +  iframe.contentDocument.body.style.width = "100%";
   1.116 +  iframe.contentDocument.body.style.height = "100%";
   1.117 +  iframe.contentDocument.body.innerHTML =
   1.118 +    "<div style='width: 100%; height: 50%; border: 1px solid black;'></div>" +
   1.119 +    "<div style='width: 100%; height: 50%; border: 1px solid black;'></div>";
   1.120 +  iframe.contentDocument.body.offsetLeft; // flush
   1.121 +
   1.122 +  iframe.contentDocument.body.firstChild.onpointerenter = penter;
   1.123 +  iframe.contentDocument.body.firstChild.onpointerleave = pleave;
   1.124 +  iframe.contentDocument.body.lastChild.onpointerenter = penter;
   1.125 +  iframe.contentDocument.body.lastChild.onpointerleave = pleave;
   1.126 +  r = iframe.getBoundingClientRect();
   1.127 +  expectedRelatedEnter = outside;
   1.128 +  expectedRelatedLeave = iframe;
   1.129 +  // Move pointer inside the iframe.
   1.130 +  synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointermove"},
   1.131 +                    iframe.contentWindow);
   1.132 +  synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height - (r.height / 4), {type: "pointermove"},
   1.133 +                    iframe.contentWindow);
   1.134 +  is(pointerentercount, 7, "Unexpected pointerenter event count!");
   1.135 +  expectedRelatedEnter = iframe;
   1.136 +  expectedRelatedLeave = outside;
   1.137 +  sendPointerEvent("pointermove", outside);
   1.138 +  is(pointerleavecount, 7, "Unexpected pointerleave event count!");
   1.139 +
   1.140 +  // pointerdown must produce pointerenter event
   1.141 +  expectedRelatedEnter = outside;
   1.142 +  expectedRelatedLeave = iframe;
   1.143 +  // Move pointer inside the iframe.
   1.144 +  synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointerdown"},
   1.145 +                    iframe.contentWindow);
   1.146 +  synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height - (r.height / 4), {type: "pointerdown"},
   1.147 +                    iframe.contentWindow);
   1.148 +  is(pointerentercount, 10, "Unexpected pointerenter event count!");
   1.149 +
   1.150 +  // pointerdown + pointermove must produce single pointerenter event
   1.151 +  expectedRelatedEnter = outside;
   1.152 +  expectedRelatedLeave = iframe;
   1.153 +  synthesizePointer(iframe.contentDocument.body, r.width / 2, r.height / 4, {type: "pointerdown"},
   1.154 +                    iframe.contentWindow);
   1.155 +  synthesizePointer(iframe.contentDocument.body, r.width / 2 + 1, r.height / 4 + 1, {type: "pointermove"},
   1.156 +                    iframe.contentWindow);
   1.157 +  is(pointerentercount, 11, "Unexpected pointerenter event count!");
   1.158 +
   1.159 +  SpecialPowers.clearUserPref("dom.w3c_pointer_events.enabled");      // Disable Pointer Events
   1.160 +
   1.161 +  SimpleTest.finish();
   1.162 +}
   1.163 +
   1.164 +function penter(evt) {
   1.165 +  ++pointerentercount;
   1.166 +  evt.stopPropagation();
   1.167 +  if (expectedPointerEnterTargets.length) {
   1.168 +    var t = expectedPointerEnterTargets.shift();
   1.169 +    is(evt.target.id, t, "Wrong event target!");
   1.170 +  }
   1.171 +  is(evt.bubbles, false, evt.type + " should not bubble!");
   1.172 +  is(evt.cancelable, false, evt.type + " is cancelable!");
   1.173 +  is(evt.target, evt.currentTarget, "Wrong event target!");
   1.174 +  ok(!evt.relatedTarget || evt.target.ownerDocument == evt.relatedTarget.ownerDocument,
   1.175 +     "Leaking nodes to another document?");
   1.176 +  if (checkRelatedTarget && evt.target.ownerDocument == document) {
   1.177 +    is(evt.relatedTarget, expectedRelatedEnter, "Wrong related target (pointerenter)");
   1.178 +  }
   1.179 +}
   1.180 +
   1.181 +function pleave(evt) {
   1.182 +  ++pointerleavecount;
   1.183 +  evt.stopPropagation();
   1.184 +  if (expectedPointerLeaveTargets.length) {
   1.185 +    var t = expectedPointerLeaveTargets.shift();
   1.186 +    is(evt.target.id, t, "Wrong event target!");
   1.187 +  }
   1.188 +  is(evt.bubbles, false, evt.type + " should not bubble!");
   1.189 +  is(evt.cancelable, false, evt.type + " is cancelable!");
   1.190 +  is(evt.target, evt.currentTarget, "Wrong event target!");
   1.191 +  ok(!evt.relatedTarget || evt.target.ownerDocument == evt.relatedTarget.ownerDocument,
   1.192 +     "Leaking nodes to another document?");
   1.193 +  if (checkRelatedTarget && evt.target.ownerDocument == document) {
   1.194 +    is(evt.relatedTarget, expectedRelatedLeave, "Wrong related target (pointerleave)");
   1.195 +  }
   1.196 +}
   1.197 +
   1.198 +function pover(evt) {
   1.199 +  ++pointerovercount;
   1.200 +  evt.stopPropagation();
   1.201 +}
   1.202 +
   1.203 +function pout(evt) {
   1.204 +  ++pointeroutcount;
   1.205 +  evt.stopPropagation();
   1.206 +}
   1.207 +
   1.208 +</script>
   1.209 +</pre>
   1.210 +<div id="container" onpointerenter="penter(event)" onpointerleave="pleave(event)"
   1.211 +                    onpointerout="pout(event)" onpointerover="pover(event)">
   1.212 +  <div id="outside" onpointerout="event.stopPropagation()" onpointerover="event.stopPropagation()">foo</div>
   1.213 +  <div id="outertest" onpointerenter="penter(event)" onpointerleave="pleave(event)"
   1.214 +                      onpointerout="pout(event)" onpointerover="pover(event)">
   1.215 +    <div id="middletest" onpointerenter="penter(event)" onpointerleave="pleave(event)"
   1.216 +                         onpointerout="pout(event)" onpointerover="pover(event)">
   1.217 +      <div id="innertest" onpointerenter="penter(event)" onpointerleave="pleave(event)"
   1.218 +                          onpointerout="pout(event)" onpointerover="pover(event)">foo</div>
   1.219 +    </div>
   1.220 +  </div>
   1.221 +  <input type="file" id="file"
   1.222 +         onpointerenter="penter(event)" onpointerleave="pleave(event)"
   1.223 +         onpointerout="pout(event)" onpointerover="pover(event)">
   1.224 +  <br>
   1.225 +  <iframe id="iframe" width="50px" height="50px"
   1.226 +          onpointerenter="penter(event)" onpointerleave="pleave(event)"
   1.227 +          onpointerout="pout(event)" onpointerover="pover(event)"></iframe>
   1.228 +</div>
   1.229 +</body>
   1.230 +</html>

mercurial