tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>