tor-browser

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

helper_fission_checkerboard_severity.html (5456B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5  <meta name="viewport" content="width=device-width,initial-scale=1">
      6  <title>
      7    A test to make sure checkerboard severity isn't reported for non-scrollable
      8    OOP iframe
      9  </title>
     10  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     11  <script src="/tests/SimpleTest/paint_listener.js"></script>
     12  <script src="helper_fission_utils.js"></script>
     13  <script src="apz_test_utils.js"></script>
     14  <script src="apz_test_native_event_utils.js"></script>
     15  <script>
     16 
     17    function getEventPromise(eventName) {
     18      return new Promise(resolve => {
     19        const listener = event => {
     20          if (event.data === eventName) {
     21            window.removeEventListener("message", listener);
     22            resolve();
     23          }
     24        }
     25        window.addEventListener("message", listener);
     26      });
     27    }
     28 
     29    function getClickPromise() {
     30      return new Promise(resolve => {
     31        let listener = event => {
     32          let data = JSON.parse(event.data);
     33          if ("type" in data && data.type === "clicked") {
     34            window.removeEventListener("message", listener);
     35            resolve([data.x, data.y]);
     36          }
     37        };
     38        window.addEventListener("message", listener);
     39      });
     40    }
     41 
     42    function getIframeDisplayport(iframe) {
     43      return SpecialPowers.spawn(iframe, [], () => {
     44        return content.wrappedJSObject.getLastContentDisplayportFor(
     45          "fission_empty_docelement", { expectPainted: false }
     46        );
     47      });
     48    }
     49 
     50    async function installClickListener(iframe) {
     51      let clickListenerReady = getEventPromise("clickListenerReady");
     52      await SpecialPowers.spawn(iframe, [], () => {
     53        const listener = event => {
     54          content.document.removeEventListener("click", listener);
     55          let data = JSON.stringify({
     56            type: "clicked",
     57            x: event.clientX,
     58            y: event.clientY
     59          });
     60          content.window.parent.postMessage(data, "*");
     61        }
     62        content.document.addEventListener("click", listener);
     63        content.window.parent.postMessage("clickListenerReady", "*");
     64      });
     65      await clickListenerReady;
     66    }
     67 
     68    async function test() {
     69      await SpecialPowers.spawnChrome([], () => {
     70        Services.telemetry.getHistogramById("CHECKERBOARD_SEVERITY").clear();
     71      });
     72 
     73      const iframe = document.getElementById("testframe");
     74      await setupCrossOriginIFrame(iframe, "helper_fission_plain.html");
     75 
     76      // Skip for isolate high value configurations
     77      const remoteType = await SpecialPowers.spawn(iframe, [], async () => {
     78        return await SpecialPowers.spawnChrome([], () => {
     79          return windowGlobalParent.domProcess.remoteType;
     80        });
     81      });
     82      if (remoteType === "web") {
     83        is(SpecialPowers.effectiveIsolationStrategy(), SpecialPowers.ISOLATION_STRATEGY.IsolateHighValue);
     84        ok(true, "Skipping this test since the document on example.com got loaded in the same content process");
     85        return;
     86      }
     87 
     88      const [scrollMaxX, scrollMaxY] = await SpecialPowers.spawn(iframe, [], () => {
     89        return [content.window.scrollMaxX, content.window.scrollMaxY];
     90      });
     91      is(scrollMaxX, 0, "The iframe content should not be scrollable");
     92      is(scrollMaxY, 0, "The iframe content should not be scrollable");
     93 
     94      // Since bug 1709460 any visible OOP iframe initially has set the displayport.
     95      let displayport = await getIframeDisplayport(iframe);
     96      is(displayport.width, 400, "displayport.width should be 400");
     97      is(displayport.height, 300, "displayport.height should be 300");
     98 
     99      await installClickListener(iframe);
    100      let clickReceived = getClickPromise();
    101      await synthesizeNativeMouseEventWithAPZ(
    102        { type: "click", target: iframe, offsetX: 10, offsetY: 10 },
    103        () => dump("Finished synthesizing click, waiting for OOPIF message...\n")
    104      );
    105      const [clickX, clickY] = await clickReceived;
    106      dump(`OOPIF click data respsone: (x: ${clickX}, y: ${clickY})\n`);
    107 
    108      // Now the displayport size should have been set.
    109      displayport = await getIframeDisplayport(iframe);
    110      is(displayport.width, 400, "The displayport size should be same as the iframe size");
    111      is(displayport.height, 300, "The displayport size should be same as the iframe size");
    112 
    113      // Wait 100ms to give a chance to deliver the checkerboard event.
    114      SimpleTest.requestFlakyTimeout("No other way to wait for checkerboard severity being set");
    115      await new Promise(resolve => {
    116        setTimeout(resolve, 100);
    117      });
    118 
    119      const hasCheckerboardSeverity = await SpecialPowers.spawnChrome([], () => {
    120        const histograms = Services.telemetry.getSnapshotForHistograms(
    121          "main",
    122          true /* clear the histograms after taking this snapshot*/).parent;
    123        return histograms.hasOwnProperty("CHECKERBOARD_SEVERITY");
    124      });
    125      ok(!hasCheckerboardSeverity, "there should be no checkerboard severity data");
    126    }
    127 
    128    if (!SpecialPowers.Services.appinfo.fissionAutostart) {
    129      ok(true, "This test doesn't need to run with disabling Fission");
    130      subtestDone();
    131    } else {
    132      waitUntilApzStable()
    133        .then(test)
    134        .then(subtestDone, subtestFailed);
    135    }
    136 
    137  </script>
    138  <style>
    139    iframe {
    140      width: 400px;
    141      height: 300px;
    142      border: none;
    143    }
    144  </style>
    145 </head>
    146 <body>
    147  <iframe id="testframe"></iframe>
    148 </body>
    149 </html>