| <!DOCTYPE html> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script> |
| // All of the rects in this test are in document/page coordinates. |
| function rectFromElement(element) { |
| var rect = {}; |
| rect.left = element.getBoundingClientRect().left + window.scrollX; |
| rect.top = element.getBoundingClientRect().top + window.scrollY; |
| rect.right = element.getBoundingClientRect().right + window.scrollX; |
| rect.bottom = element.getBoundingClientRect().bottom + window.scrollY; |
| return rect; |
| } |
| |
| function visualViewportRect() { |
| var rect = {}; |
| rect.left = window.visualViewport.pageLeft; |
| rect.top = window.visualViewport.pageTop; |
| rect.right = window.visualViewport.pageLeft + window.visualViewport.width; |
| rect.bottom = window.visualViewport.pageTop + window.visualViewport.height; |
| return rect; |
| } |
| |
| function layoutViewportRect() { |
| var rect = {}; |
| rect.left = window.scrollX; |
| rect.top = window.scrollY; |
| rect.right = window.scrollX + window.innerWidth; |
| rect.bottom = window.scrollY + window.innerHeight; |
| return rect; |
| } |
| |
| function isContainedBy(rect1, rect2) { |
| return rect1.left >= rect2.left && rect1.top >= rect2.top && |
| rect1.right <= rect2.right && rect1.bottom <= rect2.bottom; |
| } |
| |
| function runTest() { |
| test( () => { |
| assert_true(typeof(window.internals) !== 'undefined', |
| "This test requires window.internals"); |
| |
| internals.setPageScaleFactor(2.0); |
| const target = document.getElementById("box"); |
| |
| window.scrollTo(0, 0); |
| internals.setVisualViewportOffset(0, 0); |
| assert_false(isContainedBy(rectFromElement(target), |
| visualViewportRect())); |
| assert_false(isContainedBy(rectFromElement(target), |
| layoutViewportRect())); |
| |
| target.scrollIntoView(); |
| assert_true(isContainedBy(rectFromElement(target), visualViewportRect())); |
| assert_true(isContainedBy(rectFromElement(target), layoutViewportRect())); |
| }, "Test that element.scrollIntoView() scrolls the layout viewport and visual viewport."); |
| |
| test( () => { |
| assert_true(typeof(window.internals) !== 'undefined', |
| "This test requires window.internals"); |
| |
| internals.setPageScaleFactor(2.0); |
| const target = document.getElementById("box"); |
| |
| window.scrollTo(0, 0); |
| internals.setVisualViewportOffset(0, 0); |
| assert_false(isContainedBy(rectFromElement(target), |
| visualViewportRect())); |
| assert_false(isContainedBy(rectFromElement(target), |
| layoutViewportRect())); |
| |
| target.scrollIntoViewIfNeeded(); |
| assert_true(isContainedBy(rectFromElement(target), visualViewportRect())); |
| assert_true(isContainedBy(rectFromElement(target), layoutViewportRect())); |
| }, "Test that element.scrollIntoViewIfNeeded() scrolls the layout viewport and visual viewport."); |
| } |
| |
| onload = runTest; |
| </script> |
| |
| <style> |
| body { |
| height: 800px; |
| width: 800px; |
| } |
| #box { |
| background-color: black; |
| top: 700px; |
| left: 100px; |
| height: 40px; |
| width: 40px; |
| position: absolute; |
| } |
| </style> |
| |
| <div id="box"></div> |