tor-browser

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

loaf-pointer-without-render-iframe.html (1913B)


      1 <!DOCTYPE HTML>
      2 <meta charset=utf-8>
      3 <title>Long Animation Frame Timing: Pointer events without render in an iframe</title>
      4 <meta name="timeout" content="long">
      5 <script src=/resources/testdriver.js></script>
      6 <script src=/resources/testdriver-actions.js></script>
      7 <script src=/resources/testdriver-vendor.js></script>
      8 <script src="/resources/testharness.js"></script>
      9 <script src="/resources/testharnessreport.js"></script>
     10 <script src="resources/utils.js"></script>
     11 <body>
     12 <script>
     13 const BUSY_DURATION = 60;
     14 function event_handler() {
     15  busy_wait(BUSY_DURATION);
     16 }
     17 
     18 function click_iframe(iframe) {
     19  return new test_driver.Actions()
     20    .pointerMove(10, 10, {origin: iframe})
     21    .pointerDown()
     22    .pointerUp()
     23    .send();
     24 }
     25 
     26 promise_test(async t => {
     27  const iframe = document.createElement("iframe");
     28  iframe.src = "resources/long-pointerdown.html"
     29  t.add_cleanup(() => iframe.remove());
     30  document.body.append(iframe);
     31  await new Promise(resolve => iframe.addEventListener("load", resolve));
     32  iframe.focus();
     33  await click_iframe(iframe);
     34  await new Promise(resolve => requestAnimationFrame(() => resolve()));
     35  await new Promise(resolve => t.step_timeout(resolve, 0));
     36  const loaf_promise = new Promise(resolve => {
     37    function on_message(event) {
     38      resolve(event.data);
     39    }
     40 
     41    addEventListener("message", on_message);
     42    t.add_cleanup(() => removeEventListener("message", on_message));
     43 
     44    new PerformanceObserver(entries => {
     45      for (const e of entries.getEntries())
     46        if (entries.getEntries().some(
     47          e => !e.renderStart && e.scripts.some(script => script.invoker === "BODY.onpointerdown")))
     48          resolve("MAIN");
     49      }).observe({type: "long-animation-frame"});
     50    });
     51 
     52    await click_iframe(iframe);
     53 
     54  assert_equals(await loaf_promise, "FRAME");
     55 }, "Input events in iframes that don't cause a render should only create LoAF for the iframe")
     56 </script>
     57 </body>