tor-browser

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

test_pointercapture_remove_iframe.html (2371B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--
      4 https://bugzilla.mozilla.org/show_bug.cgi?id=1686037
      5 -->
      6 <head>
      7 <title>Bug 1686037</title>
      8 <script src="/tests/SimpleTest/EventUtils.js"></script>
      9 <script src="/tests/SimpleTest/SimpleTest.js"></script>
     10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     11 <style>
     12 #target {
     13  width: 100px;
     14  height: 100px;
     15  background-color: green;
     16 }
     17 iframe {
     18  width: 400px;
     19  height: 300px;
     20  border: 1px solid blue;
     21 }
     22 </style>
     23 </head>
     24 <body>
     25 <a target="_blank"href="https://bugzilla.mozilla.org/show_bug.cgi?id=1686037">Mozilla Bug 1686037</a>
     26 <div id="target"></div>
     27 <iframe srcdoc="<div style='width: 100px; height: 100px; background-color: blue;'></div>"></iframe>
     28 
     29 <pre id="test">
     30 <script type="text/javascript">
     31 /**
     32 * Test for Bug 1686037
     33 */
     34 function waitForEvent(aTarget, aEventName, aCallback = null) {
     35  return new Promise((aResolve) => {
     36    aTarget.addEventListener(aEventName, async (e) => {
     37      ok(true, `got ${e.type} event on ${e.target}, pointerid: ${e.pointerId}`);
     38      if (aCallback) {
     39        await aCallback(e);
     40      }
     41      aResolve();
     42    }, { once: true });
     43  });
     44 }
     45 
     46 function waitForPointerDownAndSetPointerCapture(aTarget) {
     47  return waitForEvent(aTarget, "pointerdown", async (event) => {
     48    return new Promise((aResolve) => {
     49      aTarget.addEventListener("gotpointercapture", (e) => {
     50        ok(true, `got ${e.type} event on ${e.target}, pointerid: ${e.pointerId}`);
     51        aResolve();
     52      }, { once: true });
     53 
     54      aTarget.setPointerCapture(event.pointerId);
     55    });
     56  });
     57 }
     58 
     59 add_task(async function test_remove_iframe_after_pointer_capture() {
     60  await SimpleTest.promiseFocus();
     61 
     62  let iframe = document.querySelector("iframe");
     63  let iframeWin = iframe.contentWindow;
     64  let targetInIframe = iframe.contentDocument.querySelector("div");
     65  let promise = Promise.all([
     66    waitForPointerDownAndSetPointerCapture(targetInIframe),
     67    waitForEvent(targetInIframe, "pointermove")
     68  ]);
     69  synthesizeTouch(targetInIframe, 10, 10, { type: "touchstart", id: 10 }, iframeWin);
     70  synthesizeTouch(targetInIframe, 11, 11, { type: "touchmove", id: 10 }, iframeWin);
     71  await promise;
     72 
     73  // Intentionally not synthesize touchend event to not trigger implicit releasing
     74  // pointer capture. And iframe removal should trigger pointer capture clean up.
     75  iframe.remove();
     76 });
     77 </script>
     78 </pre>
     79 </body>
     80 </html>