tor-browser

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

scroll-cross-origin-iframes.html (3078B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <title>Verify that two sibling cross-origin iframes both correctly scroll on MouseWheel events, as per https://crbug.com/675695.</title>
      4 <script src="/common/get-host-info.sub.js"></script>
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="/resources/testdriver.js"></script>
      8 <script src="/resources/testdriver-vendor.js"></script>
      9 <script src="/resources/testdriver-actions.js"></script>
     10 <script src="scroll_support.js"></script>
     11 <body>
     12  <iframe id="target-iframe1"
     13      style="height: 100px; width: 100px; overflow-y: scroll; position: absolute; left: 50px; top: 50px">
     14  </iframe>
     15  <iframe id="target-iframe2"
     16      style="height: 100px; width: 100px; overflow-y: scroll; position: absolute; left: 50px; top: 200px">
     17  </iframe>
     18  <script>
     19    "use strict";
     20 
     21    function waitForFrameLoadAsync(frame) {
     22      return new Promise(async (resolve) => {
     23        frame.addEventListener('load', resolve, { once: true });
     24      });
     25    }
     26 
     27    function waitForMessageAsync(expected_frame_id, expected_command) {
     28      return new Promise((resolve) => {
     29        window.addEventListener('message', (event) => {
     30          assert_equals(event.data.command, expected_command);
     31          assert_equals(event.data.frame_id, expected_frame_id);
     32          resolve(event.data.scrollTop);
     33        }, { once: true });
     34      });
     35    }
     36 
     37    function waitForCrossOriginFrameSetupAsync(frame) {
     38      return new Promise(async (resolve) => {
     39        const setup_ack_waiter = waitForMessageAsync(frame.id, 'setup');
     40        const load_ack_waiter = waitForFrameLoadAsync(frame);
     41 
     42        const host = get_host_info();
     43        frame.src = host.HTTP_NOTSAMESITE_ORIGIN +
     44            "/dom/events/scrolling/scroll-cross-origin-iframes.sub.html";
     45        await load_ack_waiter;
     46        await frame.contentWindow.postMessage({
     47          command: 'setup',
     48          frame_id: frame.id
     49        }, "*");
     50        const scroll_top = await setup_ack_waiter;
     51        resolve(scroll_top);
     52      });
     53    }
     54 
     55    promise_test(async () => {
     56      var frame_map = new Map();
     57      for (const frame of document.querySelectorAll('iframe')) {
     58        const scroll_top_before = await waitForCrossOriginFrameSetupAsync(frame);
     59        frame_map.set(frame.id, scroll_top_before);
     60      }
     61      assert_equals(frame_map.size, 2);
     62 
     63      for (const [frame_id, scroll_top_before] of frame_map) {
     64        const frame = document.getElementById(frame_id);
     65        const scrollend_ack_waiter = waitForMessageAsync(frame_id, 'onscrollend');
     66        await new test_driver.Actions()
     67            .scroll(/*cursor_x=*/0, /*cursor_y=*/0,
     68                    /*delta_x=*/0, /*delta_y=*/50,
     69                    {origin: frame})
     70            .send();
     71        const scroll_top_after = await scrollend_ack_waiter;
     72        assert_greater_than(scroll_top_after, scroll_top_before,
     73                            'Failed to advance scrollTop target');
     74      }
     75    }, "Verify sibling cross-origin iframes can wheel-scroll.");
     76  </script>
     77 </body>