Source code
Revision control
Copy as Markdown
Other Tools
<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Ensure the event region override flags work properly</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="/tests/SimpleTest/paint_listener.js"></script>
  <script src="helper_fission_utils.js"></script>
  <script src="apz_test_utils.js"></script>
  <script src="apz_test_native_event_utils.js"></script>
  <script>
    function getEventPromise(eventName) {
      let eventPromise = new Promise(resolve => {
        const listener = event => {
          if (event.data === eventName) {
            dump(`Event Promise, received event: ${event.data}\n`);
            window.removeEventListener("message", listener);
            resolve();
          }
        }
        window.addEventListener("message", listener);
      });
      return eventPromise;
    }
    async function setupIframeListeners(iframe) {
      let listenersReady = getEventPromise("listenersReady");
      SpecialPowers.spawn(iframe, [], () => {
        const { promise, resolve } = Promise.withResolvers();
        content.window.addEventListener("wheel", () => {
          Assert.ok(false, "Iframe: We should not receive a wheel event");
          resolve();
        }, { once: true });
        content.window.addEventListener("scroll", () => {
          Assert.ok(false, "Iframe: We should not receive a scoll event");
          resolve();
        }, { once: true });
        content.window.parent.postMessage("listenersReady", "*");
        return promise;
      });
      await listenersReady;
    }
    async function test() {
      let iframe = document.getElementById("testframe");
      await setupCrossOriginIFrame(iframe, "helper_fission_plain.html");
      await setupIframeListeners(iframe);
      await synthesizeNativeWheel(iframe, 10, 10, 0, -50);
      // Advance a bunch of frames. The only goal here is to ensure enough time
      // passes so that if the OOPIF does scroll, we find out about it via the
      // OOPIF:Scrolled messaging.
      // If we don't wait long enough we might end up finishing the test before
      // that scroll message gets received here, and so we might wrongly pass the
      // test.
      await SpecialPowers.promiseTimeout(0);
      var utils = SpecialPowers.getDOMWindowUtils(window);
      for (var i = 0; i < 5; i++) {
        utils.advanceTimeAndRefresh(16);
      }
      utils.restoreNormalRefresh();
      await promiseOnlyApzControllerFlushed();
    }
    window.onload = async () => {
      await SpecialPowers.spawnChrome([], async () => {
        this.browsingContext.topChromeWindow.addEventListener(
          "wheel",
          e => e.preventDefault(),
          { once: true, passive: false }
        );
        return new Promise(resolve => resolve());
      });
      await SpecialPowers.executeAfterFlushingMessageQueue();
      waitUntilApzStable()
        .then(test)
        .then(subtestDone, subtestFailed);
    };
  </script>
</head>
<body>
  <iframe id="testframe"></iframe>
</body>
</html>