<!doctype html>
<html>
    <head>
        <title>Viewport: page and offset values in iframe</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="/resources/testdriver.js"></script>
        <script src="/resources/testdriver-actions.js"></script>
        <script src="/resources/testdriver-vendor.js"></script>
        <script src="viewport_support.js"></script>
        <style>
          iframe {
            width: 200px;
            height: 300px;
            border: 0;
          }
        </style>
    </head>
    <body>
    <h1>Viewport: Page and offset values in iframe</h1>
    <h4>
        Test Description: This test checks for correct visualViewport values in
        an iframe.
    </h4>
    <iframe></iframe>
    </body>
    <script>
        var iframe = frames[0].window;

        // Add overflow to the iframe so it can scroll.
        iframe.document.body.style.width = "2000px";
        iframe.document.body.style.height = "2000px";
        iframe.scrollTo(1000, 1200);

        promise_test(async t => {
          assert_equals(visualViewport.scale, 1,
              "[PRECONDITION] Start off unzoomed");
          assert_equals(visualViewport.offsetLeft, 0,
              "[PRECONDITION] No offsetLeft to start");
          assert_equals(visualViewport.offsetTop, 0,
              "[PRECONDITION] No offsetTop to start");

          // The iframe's visual viewport isn't yet offset
          assert_equals(iframe.visualViewport.offsetLeft, 0,
              "offsetLeft must be 0");
          assert_equals(iframe.visualViewport.offsetTop, 0,
              "offsetTop must be 0");

          // However, page values should reflect layout viewport scrolling.
          assert_equals(iframe.visualViewport.pageLeft, 1000,
              "pageLeft must reflect location in document.");
          assert_equals(iframe.visualViewport.pageTop, 1200,
              "pageTop must reflect location in document.");

          // Zoom in and pan the viewport to ensure the iframe is independent
          // of the root frame.
          await pinchZoomIn();

          // These values are arbitrary since the amount of pinch-zoom caused
          // by pinchZoomIn will differ but we only care that the iframe's
          // values aren't changed.
          assert_greater_than(visualViewport.scale, 1.2,
              "Pinch zoom must have increased scale");
          assert_greater_than(visualViewport.offsetLeft, 10,
              "Pinch zoom must have offsetLeft visualViewport");
          assert_greater_than(visualViewport.offsetTop, 10,
              "Pinch zoom must have offsetTop visualViewport");

          // The iframe's visualViewport is independent of the root frame's so
          // none of the values should have changed.
          assert_equals(iframe.visualViewport.offsetLeft, 0,
              "After zooming, offsetLeft must remain 0");
          assert_equals(iframe.visualViewport.offsetTop, 0,
              "After zooming, offsetTop must remain 0");
          assert_equals(iframe.visualViewport.pageLeft, 1000,
              "After zooming, pageLeft must reflect location in document.");
          assert_equals(iframe.visualViewport.pageTop, 1200,
              "After zooming, pageTop must reflect location in document.");

          assert_equals(iframe.visualViewport.scale, 1,
              "Iframe's visualViewport must not be scaled");
        }, "VisualViewport page and offset values in iframe");
    </script>
</html>
