dom/events/test/test_bug967796.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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>

mercurial