| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/frame/VisualViewport.h" | 5 #include "core/frame/VisualViewport.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/frame/BrowserControls.h" | 8 #include "core/frame/BrowserControls.h" |
| 9 #include "core/frame/FrameHost.h" | 9 #include "core/frame/FrameHost.h" |
| 10 #include "core/frame/FrameView.h" | 10 #include "core/frame/FrameView.h" |
| (...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 EXPECT_SIZE_EQ(ScrollOffset(0, 0), | 893 EXPECT_SIZE_EQ(ScrollOffset(0, 0), |
| 894 toLocalFrame(webViewImpl()->page()->mainFrame()) | 894 toLocalFrame(webViewImpl()->page()->mainFrame()) |
| 895 ->loader() | 895 ->loader() |
| 896 .currentItem() | 896 .currentItem() |
| 897 ->visualViewportScrollOffset()); | 897 ->visualViewportScrollOffset()); |
| 898 | 898 |
| 899 VisualViewport& visualViewport = | 899 VisualViewport& visualViewport = |
| 900 frame()->page()->frameHost().visualViewport(); | 900 frame()->page()->frameHost().visualViewport(); |
| 901 visualViewport.setScale(2); | 901 visualViewport.setScale(2); |
| 902 | 902 |
| 903 EXPECT_EQ(2, toLocalFrame(webViewImpl()->page()->mainFrame()) | 903 EXPECT_EQ(2, |
| 904 ->loader() | 904 toLocalFrame(webViewImpl()->page()->mainFrame()) |
| 905 .currentItem() | 905 ->loader() |
| 906 ->pageScaleFactor()); | 906 .currentItem() |
| 907 ->pageScaleFactor()); |
| 907 | 908 |
| 908 visualViewport.setLocation(FloatPoint(10, 20)); | 909 visualViewport.setLocation(FloatPoint(10, 20)); |
| 909 | 910 |
| 910 EXPECT_SIZE_EQ(ScrollOffset(10, 20), | 911 EXPECT_SIZE_EQ(ScrollOffset(10, 20), |
| 911 toLocalFrame(webViewImpl()->page()->mainFrame()) | 912 toLocalFrame(webViewImpl()->page()->mainFrame()) |
| 912 ->loader() | 913 ->loader() |
| 913 .currentItem() | 914 .currentItem() |
| 914 ->visualViewportScrollOffset()); | 915 ->visualViewportScrollOffset()); |
| 915 } | 916 } |
| 916 | 917 |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 mouseDownEvent.globalY = 210; | 1158 mouseDownEvent.globalY = 210; |
| 1158 mouseDownEvent.clickCount = 1; | 1159 mouseDownEvent.clickCount = 1; |
| 1159 mouseDownEvent.button = WebMouseEvent::Button::Right; | 1160 mouseDownEvent.button = WebMouseEvent::Button::Right; |
| 1160 | 1161 |
| 1161 // Corresponding release event (Windows shows context menu on release). | 1162 // Corresponding release event (Windows shows context menu on release). |
| 1162 WebMouseEvent mouseUpEvent(mouseDownEvent); | 1163 WebMouseEvent mouseUpEvent(mouseDownEvent); |
| 1163 mouseUpEvent.setType(WebInputEvent::MouseUp); | 1164 mouseUpEvent.setType(WebInputEvent::MouseUp); |
| 1164 | 1165 |
| 1165 WebFrameClient* oldClient = webViewImpl()->mainFrameImpl()->client(); | 1166 WebFrameClient* oldClient = webViewImpl()->mainFrameImpl()->client(); |
| 1166 MockWebFrameClient mockWebFrameClient; | 1167 MockWebFrameClient mockWebFrameClient; |
| 1167 EXPECT_CALL(mockWebFrameClient, showContextMenu(ContextMenuAtLocation( | 1168 EXPECT_CALL(mockWebFrameClient, |
| 1168 mouseDownEvent.x, mouseDownEvent.y))); | 1169 showContextMenu( |
| 1170 ContextMenuAtLocation(mouseDownEvent.x, mouseDownEvent.y))); |
| 1169 | 1171 |
| 1170 // Do a sanity check with no scale applied. | 1172 // Do a sanity check with no scale applied. |
| 1171 webViewImpl()->mainFrameImpl()->setClient(&mockWebFrameClient); | 1173 webViewImpl()->mainFrameImpl()->setClient(&mockWebFrameClient); |
| 1172 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseDownEvent)); | 1174 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseDownEvent)); |
| 1173 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseUpEvent)); | 1175 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseUpEvent)); |
| 1174 | 1176 |
| 1175 Mock::VerifyAndClearExpectations(&mockWebFrameClient); | 1177 Mock::VerifyAndClearExpectations(&mockWebFrameClient); |
| 1176 mouseDownEvent.button = WebMouseEvent::Button::Left; | 1178 mouseDownEvent.button = WebMouseEvent::Button::Left; |
| 1177 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseDownEvent)); | 1179 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseDownEvent)); |
| 1178 | 1180 |
| 1179 // Now pinch zoom into the page and move the visual viewport. The context menu | 1181 // Now pinch zoom into the page and move the visual viewport. The context menu |
| 1180 // should still appear at the location of the event, relative to the WebView. | 1182 // should still appear at the location of the event, relative to the WebView. |
| 1181 VisualViewport& visualViewport = | 1183 VisualViewport& visualViewport = |
| 1182 frame()->page()->frameHost().visualViewport(); | 1184 frame()->page()->frameHost().visualViewport(); |
| 1183 webViewImpl()->setPageScaleFactor(2); | 1185 webViewImpl()->setPageScaleFactor(2); |
| 1184 EXPECT_CALL(mockWebFrameClient, didChangeScrollOffset(_)); | 1186 EXPECT_CALL(mockWebFrameClient, didChangeScrollOffset(_)); |
| 1185 visualViewport.setLocation(FloatPoint(60, 80)); | 1187 visualViewport.setLocation(FloatPoint(60, 80)); |
| 1186 EXPECT_CALL(mockWebFrameClient, showContextMenu(ContextMenuAtLocation( | 1188 EXPECT_CALL(mockWebFrameClient, |
| 1187 mouseDownEvent.x, mouseDownEvent.y))); | 1189 showContextMenu( |
| 1190 ContextMenuAtLocation(mouseDownEvent.x, mouseDownEvent.y))); |
| 1188 | 1191 |
| 1189 mouseDownEvent.button = WebMouseEvent::Button::Right; | 1192 mouseDownEvent.button = WebMouseEvent::Button::Right; |
| 1190 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseDownEvent)); | 1193 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseDownEvent)); |
| 1191 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseUpEvent)); | 1194 webViewImpl()->handleInputEvent(WebCoalescedInputEvent(mouseUpEvent)); |
| 1192 | 1195 |
| 1193 // Reset the old client so destruction can occur naturally. | 1196 // Reset the old client so destruction can occur naturally. |
| 1194 webViewImpl()->mainFrameImpl()->setClient(oldClient); | 1197 webViewImpl()->mainFrameImpl()->setClient(oldClient); |
| 1195 } | 1198 } |
| 1196 | 1199 |
| 1197 // Test that the client is notified if page scroll events. | 1200 // Test that the client is notified if page scroll events. |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 navigateTo(m_baseURL + "content-width-1000.html"); | 1455 navigateTo(m_baseURL + "content-width-1000.html"); |
| 1453 | 1456 |
| 1454 VisualViewport& visualViewport = | 1457 VisualViewport& visualViewport = |
| 1455 frame()->page()->frameHost().visualViewport(); | 1458 frame()->page()->frameHost().visualViewport(); |
| 1456 FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView(); | 1459 FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView(); |
| 1457 | 1460 |
| 1458 visualViewport.setScale(pageScale); | 1461 visualViewport.setScale(pageScale); |
| 1459 EXPECT_SIZE_EQ( | 1462 EXPECT_SIZE_EQ( |
| 1460 IntSize(250, (visualViewportHeight - browserControlsHeight) / pageScale), | 1463 IntSize(250, (visualViewportHeight - browserControlsHeight) / pageScale), |
| 1461 visualViewport.visibleRect().size()); | 1464 visualViewport.visibleRect().size()); |
| 1462 EXPECT_SIZE_EQ(IntSize(1000, layoutViewportHeight - | 1465 EXPECT_SIZE_EQ( |
| 1463 browserControlsHeight / minPageScale), | 1466 IntSize(1000, |
| 1464 frameView.frameRect().size()); | 1467 layoutViewportHeight - browserControlsHeight / minPageScale), |
| 1468 frameView.frameRect().size()); |
| 1465 EXPECT_SIZE_EQ(IntSize(500, visualViewportHeight - browserControlsHeight), | 1469 EXPECT_SIZE_EQ(IntSize(500, visualViewportHeight - browserControlsHeight), |
| 1466 visualViewport.size()); | 1470 visualViewport.size()); |
| 1467 | 1471 |
| 1468 // Scroll all the way to the bottom, hiding the browser controls in the | 1472 // Scroll all the way to the bottom, hiding the browser controls in the |
| 1469 // process. | 1473 // process. |
| 1470 visualViewport.move(ScrollOffset(10000, 10000)); | 1474 visualViewport.move(ScrollOffset(10000, 10000)); |
| 1471 frameView.layoutViewportScrollableArea()->scrollBy(ScrollOffset(10000, 10000), | 1475 frameView.layoutViewportScrollableArea()->scrollBy(ScrollOffset(10000, 10000), |
| 1472 UserScroll); | 1476 UserScroll); |
| 1473 webViewImpl()->browserControls().setShownRatio(0); | 1477 webViewImpl()->browserControls().setShownRatio(0); |
| 1474 | 1478 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 webViewImpl()->browserControls().setShownRatio(1); | 1545 webViewImpl()->browserControls().setShownRatio(1); |
| 1542 visualViewport.move(ScrollOffset(10000, 10000)); | 1546 visualViewport.move(ScrollOffset(10000, 10000)); |
| 1543 frameView.layoutViewportScrollableArea()->scrollBy(ScrollOffset(10000, 10000), | 1547 frameView.layoutViewportScrollableArea()->scrollBy(ScrollOffset(10000, 10000), |
| 1544 UserScroll); | 1548 UserScroll); |
| 1545 | 1549 |
| 1546 EXPECT_SIZE_EQ( | 1550 EXPECT_SIZE_EQ( |
| 1547 IntSize(250, (visualViewportHeight - browserControlsHeight) / pageScale), | 1551 IntSize(250, (visualViewportHeight - browserControlsHeight) / pageScale), |
| 1548 visualViewport.visibleRect().size()); | 1552 visualViewport.visibleRect().size()); |
| 1549 | 1553 |
| 1550 ScrollOffset frameViewExpected( | 1554 ScrollOffset frameViewExpected( |
| 1551 0, contentHeight - | 1555 0, |
| 1552 (layoutViewportHeight - browserControlsHeight / minPageScale)); | 1556 contentHeight - |
| 1557 (layoutViewportHeight - browserControlsHeight / minPageScale)); |
| 1553 ScrollOffset visualViewportExpected = ScrollOffset( | 1558 ScrollOffset visualViewportExpected = ScrollOffset( |
| 1554 750, (layoutViewportHeight - browserControlsHeight / minPageScale - | 1559 750, |
| 1555 visualViewport.visibleRect().height())); | 1560 (layoutViewportHeight - browserControlsHeight / minPageScale - |
| 1561 visualViewport.visibleRect().height())); |
| 1556 | 1562 |
| 1557 EXPECT_SIZE_EQ(visualViewportExpected, visualViewport.getScrollOffset()); | 1563 EXPECT_SIZE_EQ(visualViewportExpected, visualViewport.getScrollOffset()); |
| 1558 EXPECT_SIZE_EQ(frameViewExpected, | 1564 EXPECT_SIZE_EQ(frameViewExpected, |
| 1559 frameView.layoutViewportScrollableArea()->getScrollOffset()); | 1565 frameView.layoutViewportScrollableArea()->getScrollOffset()); |
| 1560 | 1566 |
| 1561 ScrollOffset totalExpected = visualViewportExpected + frameViewExpected; | 1567 ScrollOffset totalExpected = visualViewportExpected + frameViewExpected; |
| 1562 | 1568 |
| 1563 // Resize the widget to match the browser controls adjustment. Ensure that the | 1569 // Resize the widget to match the browser controls adjustment. Ensure that the |
| 1564 // total offset (i.e. what the user sees) doesn't change because of clamping | 1570 // total offset (i.e. what the user sees) doesn't change because of clamping |
| 1565 // the offsets to valid values. | 1571 // the offsets to valid values. |
| 1566 webViewImpl()->resizeWithBrowserControls( | 1572 webViewImpl()->resizeWithBrowserControls( |
| 1567 WebSize(500, visualViewportHeight - browserControlsHeight), 20, true); | 1573 WebSize(500, visualViewportHeight - browserControlsHeight), 20, true); |
| 1568 | 1574 |
| 1569 EXPECT_SIZE_EQ(IntSize(500, visualViewportHeight - browserControlsHeight), | 1575 EXPECT_SIZE_EQ(IntSize(500, visualViewportHeight - browserControlsHeight), |
| 1570 visualViewport.size()); | 1576 visualViewport.size()); |
| 1571 EXPECT_SIZE_EQ( | 1577 EXPECT_SIZE_EQ( |
| 1572 IntSize(250, (visualViewportHeight - browserControlsHeight) / pageScale), | 1578 IntSize(250, (visualViewportHeight - browserControlsHeight) / pageScale), |
| 1573 visualViewport.visibleRect().size()); | 1579 visualViewport.visibleRect().size()); |
| 1574 EXPECT_SIZE_EQ(IntSize(1000, layoutViewportHeight - | 1580 EXPECT_SIZE_EQ( |
| 1575 browserControlsHeight / minPageScale), | 1581 IntSize(1000, |
| 1576 frameView.frameRect().size()); | 1582 layoutViewportHeight - browserControlsHeight / minPageScale), |
| 1583 frameView.frameRect().size()); |
| 1577 EXPECT_SIZE_EQ( | 1584 EXPECT_SIZE_EQ( |
| 1578 totalExpected, | 1585 totalExpected, |
| 1579 visualViewport.getScrollOffset() + | 1586 visualViewport.getScrollOffset() + |
| 1580 frameView.layoutViewportScrollableArea()->getScrollOffset()); | 1587 frameView.layoutViewportScrollableArea()->getScrollOffset()); |
| 1581 } | 1588 } |
| 1582 | 1589 |
| 1583 // Tests that a resize due to browser controls hiding doesn't incorrectly clamp | 1590 // Tests that a resize due to browser controls hiding doesn't incorrectly clamp |
| 1584 // the main frame's scroll offset. crbug.com/428193. | 1591 // the main frame's scroll offset. crbug.com/428193. |
| 1585 TEST_P(VisualViewportTest, TestTopControlHidingResizeDoesntClampMainFrame) { | 1592 TEST_P(VisualViewportTest, TestTopControlHidingResizeDoesntClampMainFrame) { |
| 1586 initializeWithAndroidSettings(); | 1593 initializeWithAndroidSettings(); |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1935 visualViewport.setScale(1); | 1942 visualViewport.setScale(1); |
| 1936 EXPECT_FLOAT_POINT_EQ( | 1943 EXPECT_FLOAT_POINT_EQ( |
| 1937 FloatPoint(314, 273), | 1944 FloatPoint(314, 273), |
| 1938 visualViewport.viewportToRootFrame(FloatPoint(314, 273))); | 1945 visualViewport.viewportToRootFrame(FloatPoint(314, 273))); |
| 1939 EXPECT_FLOAT_POINT_EQ( | 1946 EXPECT_FLOAT_POINT_EQ( |
| 1940 FloatPoint(314, 273), | 1947 FloatPoint(314, 273), |
| 1941 visualViewport.rootFrameToViewport(FloatPoint(314, 273))); | 1948 visualViewport.rootFrameToViewport(FloatPoint(314, 273))); |
| 1942 | 1949 |
| 1943 // At scale = 2. | 1950 // At scale = 2. |
| 1944 visualViewport.setScale(2); | 1951 visualViewport.setScale(2); |
| 1945 EXPECT_FLOAT_POINT_EQ(FloatPoint(55, 75), visualViewport.viewportToRootFrame( | 1952 EXPECT_FLOAT_POINT_EQ( |
| 1946 FloatPoint(110, 150))); | 1953 FloatPoint(55, 75), |
| 1954 visualViewport.viewportToRootFrame(FloatPoint(110, 150))); |
| 1947 EXPECT_FLOAT_POINT_EQ(FloatPoint(110, 150), | 1955 EXPECT_FLOAT_POINT_EQ(FloatPoint(110, 150), |
| 1948 visualViewport.rootFrameToViewport(FloatPoint(55, 75))); | 1956 visualViewport.rootFrameToViewport(FloatPoint(55, 75))); |
| 1949 | 1957 |
| 1950 // At scale = 2 and with the visual viewport offset. | 1958 // At scale = 2 and with the visual viewport offset. |
| 1951 visualViewport.setLocation(FloatPoint(10, 12)); | 1959 visualViewport.setLocation(FloatPoint(10, 12)); |
| 1952 EXPECT_FLOAT_POINT_EQ(FloatPoint(50, 62), visualViewport.viewportToRootFrame( | 1960 EXPECT_FLOAT_POINT_EQ( |
| 1953 FloatPoint(80, 100))); | 1961 FloatPoint(50, 62), |
| 1962 visualViewport.viewportToRootFrame(FloatPoint(80, 100))); |
| 1954 EXPECT_FLOAT_POINT_EQ(FloatPoint(80, 100), | 1963 EXPECT_FLOAT_POINT_EQ(FloatPoint(80, 100), |
| 1955 visualViewport.rootFrameToViewport(FloatPoint(50, 62))); | 1964 visualViewport.rootFrameToViewport(FloatPoint(50, 62))); |
| 1956 | 1965 |
| 1957 // Test points that will cause non-integer values. | 1966 // Test points that will cause non-integer values. |
| 1958 EXPECT_FLOAT_POINT_EQ( | 1967 EXPECT_FLOAT_POINT_EQ( |
| 1959 FloatPoint(50.5, 62.4), | 1968 FloatPoint(50.5, 62.4), |
| 1960 visualViewport.viewportToRootFrame(FloatPoint(81, 100.8))); | 1969 visualViewport.viewportToRootFrame(FloatPoint(81, 100.8))); |
| 1961 EXPECT_FLOAT_POINT_EQ( | 1970 EXPECT_FLOAT_POINT_EQ( |
| 1962 FloatPoint(81, 100.8), | 1971 FloatPoint(81, 100.8), |
| 1963 visualViewport.rootFrameToViewport(FloatPoint(50.5, 62.4))); | 1972 visualViewport.rootFrameToViewport(FloatPoint(50.5, 62.4))); |
| 1964 | 1973 |
| 1965 // Scrolling the main frame should have no effect. | 1974 // Scrolling the main frame should have no effect. |
| 1966 frameView.layoutViewportScrollableArea()->setScrollOffset( | 1975 frameView.layoutViewportScrollableArea()->setScrollOffset( |
| 1967 ScrollOffset(100, 120), ProgrammaticScroll); | 1976 ScrollOffset(100, 120), ProgrammaticScroll); |
| 1968 EXPECT_FLOAT_POINT_EQ(FloatPoint(50, 62), visualViewport.viewportToRootFrame( | 1977 EXPECT_FLOAT_POINT_EQ( |
| 1969 FloatPoint(80, 100))); | 1978 FloatPoint(50, 62), |
| 1979 visualViewport.viewportToRootFrame(FloatPoint(80, 100))); |
| 1970 EXPECT_FLOAT_POINT_EQ(FloatPoint(80, 100), | 1980 EXPECT_FLOAT_POINT_EQ(FloatPoint(80, 100), |
| 1971 visualViewport.rootFrameToViewport(FloatPoint(50, 62))); | 1981 visualViewport.rootFrameToViewport(FloatPoint(50, 62))); |
| 1972 } | 1982 } |
| 1973 | 1983 |
| 1974 // Tests that the window dimensions are available before a full layout occurs. | 1984 // Tests that the window dimensions are available before a full layout occurs. |
| 1975 // More specifically, it checks that the innerWidth and innerHeight window | 1985 // More specifically, it checks that the innerWidth and innerHeight window |
| 1976 // properties will trigger a layout which will cause an update to viewport | 1986 // properties will trigger a layout which will cause an update to viewport |
| 1977 // constraints and a refreshed initial scale. crbug.com/466718 | 1987 // constraints and a refreshed initial scale. crbug.com/466718 |
| 1978 TEST_P(VisualViewportTest, WindowDimensionsOnLoad) { | 1988 TEST_P(VisualViewportTest, WindowDimensionsOnLoad) { |
| 1979 initializeWithAndroidSettings(); | 1989 initializeWithAndroidSettings(); |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2472 " body {" | 2482 " body {" |
| 2473 " margin: 0px;" | 2483 " margin: 0px;" |
| 2474 " }" | 2484 " }" |
| 2475 " div { height:110vh; width: 110vw; }" | 2485 " div { height:110vh; width: 110vw; }" |
| 2476 "</style>" | 2486 "</style>" |
| 2477 "<div></div>", | 2487 "<div></div>", |
| 2478 baseURL); | 2488 baseURL); |
| 2479 } | 2489 } |
| 2480 | 2490 |
| 2481 } // namespace | 2491 } // namespace |
| OLD | NEW |