tor-browser

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

file_pointerlock_xorigin_iframe.html (3959B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--https://bugzilla.mozilla.org/show_bug.cgi?id=1662587-->
      4 <head>
      5 <title>Bug 1662587</title>
      6 <script src="/tests/SimpleTest/EventUtils.js"></script>
      7 <script src="/tests/SimpleTest/SimpleTest.js"></script>
      8 <script src="pointerlock_utils.js"></script>
      9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     10 <style>
     11 #target {
     12  width: 100px;
     13  height: 100px;
     14  background-color: green;
     15 }
     16 iframe {
     17  width: 400px;
     18  height: 300px;
     19  border: 1px solid blue;
     20 }
     21 </style>
     22 </head>
     23 <body>
     24 <a target="_blank"href="https://bugzilla.mozilla.org/show_bug.cgi?id=1662587">Mozilla Bug 1662587</a>
     25 <div id="target"></div>
     26 <iframe src="https://example.com/tests/dom/tests/mochitest/pointerlock/iframe_differentDOM.html"></iframe>
     27 
     28 <pre id="test">
     29 <script type="text/javascript">
     30 /**
     31 * Test for Bug 1662587
     32 */
     33 SimpleTest.waitForExplicitFinish();
     34 
     35 async function requestPointerLock(aElement, aExpectError = false) {
     36  let doc = aElement.ownerDocument;
     37  let waitForPointerLockEvent = function() {
     38    return new Promise((aResolve) => {
     39      let eventHandler = function(aEvent) {
     40        is(aEvent.type, aExpectError ? 'pointerlockerror' : 'pointerlockchange',
     41           `got ${aEvent.type}`);
     42        doc.removeEventListener('pointerlockchange', eventHandler);
     43        doc.removeEventListener('pointerlockerror', eventHandler);
     44        aResolve();
     45      };
     46 
     47      doc.addEventListener('pointerlockchange', eventHandler);
     48      doc.addEventListener('pointerlockerror', eventHandler);
     49    });
     50  };
     51 
     52  SpecialPowers.wrap(doc).notifyUserGestureActivation();
     53  aElement.requestPointerLock();
     54  await waitForPointerLockEvent();
     55  is(doc.pointerLockElement, aExpectError ? null : aElement, "target pointer locked");
     56 }
     57 
     58 async function exitPointerLock() {
     59  if (document.pointerLockElement) {
     60    document.exitPointerLock();
     61    await new Promise((aResolve) => {
     62      document.addEventListener("pointerlockchange", (aEvent) => {
     63        ok(true, `got ${aEvent.type}`);
     64        aResolve();
     65      }, { once: true });
     66    });
     67  }
     68  is(document.pointerLockElement, null, "pointer unlocked");
     69 }
     70 
     71 async function start() {
     72  let iframe = document.querySelector("iframe");
     73  let target = document.getElementById("target");
     74  await requestPointerLock(target);
     75 
     76  // Mouse event should be dispatched to locked element.
     77  synthesizeMouse(iframe, 10, 10, { type: "mousemove" });
     78  await new Promise((aResolve) => {
     79    document.addEventListener("mousemove", function(e) {
     80      info("Got mousemove");
     81      ok("movementX" in e, "has movementX");
     82      ok("movementY" in e, "has movementY");
     83      is(e.target, target, "event.target");
     84      aResolve();
     85    }, { once: true });
     86  });
     87 
     88  // Mouse wheel event should be dispatched to locked element.
     89  synthesizeWheel(iframe, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE });
     90  await new Promise((aResolve) => {
     91    document.addEventListener("wheel", function(e) {
     92      info("Got wheel");
     93      is(e.target, target, "event.target");
     94      aResolve();
     95    }, { once: true });
     96  });
     97 
     98  // Pointer lock requested in iframe should be rejected.
     99  let win = iframe.contentWindow;
    100  win.focus()
    101  await SpecialPowers.spawn(win, [], async () => {
    102    info("request pointer lock in xorigin iframe");
    103    content.document.querySelector("input").focus();
    104    SpecialPowers.wrap(content.document).notifyUserGestureActivation();
    105    content.document.body.requestPointerLock();
    106    await new Promise((aResolve) => {
    107      let handler = function(aEvent) {
    108        is(aEvent.type, 'pointerlockerror', `got ${aEvent.type}`);
    109        content.document.onpointerlockchange = null;
    110        content.document.onpointerlockerror = null;
    111        aResolve();
    112      };
    113      content.document.onpointerlockchange = handler;
    114      content.document.onpointerlockerror = handler;
    115    });
    116    content.document.exitPointerLock();
    117  });
    118 
    119  await exitPointerLock();
    120  SimpleTest.finish();
    121 }
    122 </script>
    123 </pre>
    124 </body>
    125 </html>