tor-browser

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

test_event_screenXY_in_cross_origin_iframe.html (3793B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8">
      3 <title></title>
      4 <script src="/tests/SimpleTest/SimpleTest.js"></script>
      5 <script src="/tests/SimpleTest/EventUtils.js"></script>
      6 <script src="/tests/SimpleTest/paint_listener.js"></script>
      7 <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_utils.js"></script>
      8 <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js"></script>
      9 <iframe width=100></iframe>
     10 <iframe width=100></iframe>
     11 <script>
     12 function getScreenPosition(aElement, aOffsetX, aOffsetY) {
     13  const rect = aElement.getBoundingClientRect();
     14  const x = aOffsetX + window.mozInnerScreenX + rect.left;
     15  const y = aOffsetY + window.mozInnerScreenY + rect.top;
     16  const scale = window.devicePixelRatio;
     17  return [Math.round(x * scale), Math.round(y * scale)];
     18 }
     19 
     20 function waitForMessage(aMsg, aOrigin) {
     21  return new Promise(resolve => {
     22    window.addEventListener("message", function listener(event) {
     23      if (event.data == "ready" && event.origin == aOrigin) {
     24        window.removeEventListener("message", listener);
     25        resolve();
     26      }
     27    });
     28  });
     29 }
     30 
     31 add_task(async () => {
     32  await SimpleTest.promiseFocus();
     33 
     34  const iframes = document.querySelectorAll("iframe");
     35  iframes[0].src = "file_event_screenXY.html";
     36  await waitForMessage("ready", location.origin);
     37 
     38  iframes[1].src = "https://example.com/tests/dom/events/test/file_event_screenXY.html";
     39  await waitForMessage("ready", "https://example.com");
     40 
     41  // Wait for APZ state stable so that mouse event handling APZ works properly
     42  // in out-of-process iframes.
     43  await promiseApzFlushedRepaints();
     44 
     45  const promiseForSameOrigin = new Promise(resolve => {
     46    window.addEventListener("message", event => {
     47      is(event.origin, location.origin, "origin should be the same as parent");
     48      resolve(event.data);
     49    }, { once: true });
     50  });
     51 
     52  // NOTE: synthesizeMouseAtCenter doesn't work for OOP iframes (bug 1528935),
     53  // so we use promiseNativeMouseEvent instead.
     54  const [expectedScreenXInSameOrigin, expectedScreenYInSameOrigin] =
     55    getScreenPosition(iframes[0], 10, 10);
     56  await promiseNativeMouseEvent({
     57    type: "click",
     58    target: iframes[0],
     59    screenX: expectedScreenXInSameOrigin,
     60    screenY: expectedScreenYInSameOrigin,
     61    scale: "inScreenPixels",
     62  });
     63 
     64  const eventInSameOrigin = await promiseForSameOrigin;
     65  is(eventInSameOrigin.screenX, expectedScreenXInSameOrigin,
     66     "event.screenX should be the same");
     67  is(eventInSameOrigin.screenY, expectedScreenYInSameOrigin,
     68     "event.screenY should be the same");
     69 
     70  const [expectedScreenXInCrossOrigin, expectedScreenYInCrossOrigin] =
     71    getScreenPosition(iframes[1], 10, 10);
     72  await promiseNativeMouseEvent({
     73    type: "click",
     74    target: iframes[0],
     75    screenX: expectedScreenXInCrossOrigin,
     76    screenY: expectedScreenYInCrossOrigin,
     77    scale: "inScreenPixels",
     78  });
     79 
     80  const promiseForCrossOrigin = new Promise(resolve => {
     81    window.addEventListener("message", event => {
     82      is(event.origin, "https://example.com", "origin should be example.com");
     83      resolve(event.data);
     84    }, { once: true });
     85  });
     86 
     87  const eventInCrossOrigin = await promiseForCrossOrigin;
     88  is(eventInCrossOrigin.screenX, expectedScreenXInCrossOrigin,
     89     "even.screenX should be the same");
     90  is(eventInCrossOrigin.screenY, expectedScreenYInCrossOrigin,
     91     "even.screenY should be the same");
     92 
     93  is(eventInSameOrigin.screenY, eventInCrossOrigin.screenY,
     94     "event.screenY in both iframes should be the same");
     95  // Sanity checks to make sure client{X,Y} are the same.
     96  is(eventInSameOrigin.clientX, eventInCrossOrigin.clientX,
     97     "event.clientX in both iframes should be the same");
     98  is(eventInSameOrigin.clientY, eventInCrossOrigin.clientY,
     99     "event.clientY in both iframes should be the same");
    100 });
    101 </script>