Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2015 Google Inc. All rights reserved. | 2 * Copyright (C) 2015 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 724 // Device viewport is 400px and page is width=800 but there's an element | 724 // Device viewport is 400px and page is width=800 but there's an element |
| 725 // that's 1600px wide so the minimum scale is 0.25 to encompass that. | 725 // that's 1600px wide so the minimum scale is 0.25 to encompass that. |
| 726 ASSERT_EQ(0.25f, webView->minimumPageScaleFactor()); | 726 ASSERT_EQ(0.25f, webView->minimumPageScaleFactor()); |
| 727 | 727 |
| 728 // The viewport will match the layout width at scale=0.5 so the height used | 728 // The viewport will match the layout width at scale=0.5 so the height used |
| 729 // for vh should be (300 / 0.5) for the layout height + (100 / 0.5) for top | 729 // for vh should be (300 / 0.5) for the layout height + (100 / 0.5) for top |
| 730 // controls = 800. | 730 // controls = 800. |
| 731 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); | 731 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); |
| 732 } | 732 } |
| 733 | 733 |
| 734 // This tests that the viewport remains anchored when top controls are brought | |
| 735 // in while the document is fully scrolled. This normally causes clamping of the | |
| 736 // visual viewport to keep it bounded by the layout viewport so we're testing | |
| 737 // that the viewport anchoring logic is working to keep the view unchanged. | |
| 738 TEST_F(TopControlsTest, MAYBE(AnchorViewportDuringTopControlsAdjustment)) | |
| 739 { | |
| 740 int contentHeight = 1016; | |
| 741 int layoutViewportHeight = 500; | |
| 742 int visualViewportHeight = 500; | |
| 743 int topControlsHeight = 100; | |
| 744 int pageScale = 2; | |
| 745 int minScale = 1; | |
| 746 | |
| 747 // Initialize with the top controls showing. | |
| 748 WebViewImpl* webView = initialize("large-div.html"); | |
| 749 webViewImpl()->setDefaultPageScaleLimits(minScale, 5); | |
| 750 webView->setTopControlsHeight(topControlsHeight, true); | |
| 751 webView->updateTopControlsState( | |
| 752 WebTopControlsBoth, WebTopControlsShown, false); | |
| 753 webView->topControls().setShownRatio(1); | |
| 754 webView->resize(WebSize(800, layoutViewportHeight)); | |
| 755 webView->updateAllLifecyclePhases(); | |
| 756 | |
| 757 FrameView* view = frame()->view(); | |
| 758 ScrollableArea* rootViewport = frame()->view()->getScrollableArea(); | |
| 759 | |
| 760 int expectedVisualOffset = | |
| 761 ((layoutViewportHeight + topControlsHeight / minScale) * pageScale | |
| 762 - (visualViewportHeight + topControlsHeight)) | |
| 763 / pageScale; | |
| 764 int expectedLayoutOffset = | |
| 765 contentHeight - (layoutViewportHeight + topControlsHeight / minScale); | |
| 766 | |
| 767 // Zoom in to 2X and fully scroll both viewports. | |
| 768 webView->setPageScaleFactor(pageScale); | |
| 769 { | |
| 770 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegi n)); | |
| 771 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpda te, 0, -10000)); | |
| 772 | |
| 773 ASSERT_EQ(0.f, webView->topControls().contentOffset()); | |
| 774 | |
| 775 EXPECT_EQ(expectedVisualOffset, visualViewport().location().y()); | |
| 776 EXPECT_EQ(expectedLayoutOffset, view->layoutViewportScrollableArea()->sc rollPosition().y()); | |
| 777 EXPECT_EQ(expectedVisualOffset + expectedLayoutOffset, rootViewport->scr ollPosition().y()); | |
|
majidvp
2016/04/01 17:09:36
s/expectedVisualOffset + expectedLayoutOffset/expe
bokan
2016/04/05 17:11:40
Done.
| |
| 778 | |
| 779 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollEnd) ); | |
| 780 } | |
| 781 | |
| 782 webView->setTopControlsHeight(topControlsHeight, false); | |
| 783 webView->resize(WebSize(800, 600)); | |
|
majidvp
2016/04/01 17:09:36
600? did you mean layoutViewportHeight + topContro
bokan
2016/04/05 17:11:40
Done.
| |
| 784 webView->updateAllLifecyclePhases(); | |
| 785 | |
| 786 // Commit the top controls resize so that the top controls do not shrink the | |
| 787 // layout size. This should not have moved any of the viewports. | |
| 788 int previousRootOffset = expectedVisualOffset + expectedLayoutOffset; | |
|
majidvp
2016/04/01 17:09:36
You can use expectedRootOffset which should be def
bokan
2016/04/05 17:11:40
Done.
| |
| 789 ASSERT_EQ(expectedVisualOffset, visualViewport().location().y()); | |
| 790 ASSERT_EQ(expectedLayoutOffset, | |
| 791 view->layoutViewportScrollableArea()->scrollPosition().y()); | |
| 792 ASSERT_EQ(previousRootOffset, rootViewport->scrollPosition().y()); | |
| 793 | |
| 794 // Now scroll back up just enough to show the top controls. The top controls | |
| 795 // should shrink both viewports but the layout viewport by a greater amount. | |
| 796 // This means the visual viewport's offset must be clamped to keep it within | |
| 797 // the layout viewport. Make sure we adjust the scroll position to account | |
| 798 // for this and keep the visual viewport at the same location relative to | |
| 799 // the document (i.e. the user shouldn't see a movement). | |
| 800 { | |
| 801 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegi n)); | |
| 802 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpda te, 0, 100)); | |
|
majidvp
2016/04/01 17:09:36
100 is the same as topControlsHeight which may be
bokan
2016/04/05 17:11:40
Changed to 80.
| |
| 803 | |
| 804 visualViewport().clampToBoundaries(); | |
| 805 view->setScrollPosition(view->scrollPosition(), ProgrammaticScroll); | |
|
majidvp
2016/04/01 17:09:36
Why are these clamps required?
bokan
2016/04/05 17:11:40
If we don't run the anchoring logic, the viewport
| |
| 806 | |
| 807 ASSERT_EQ(100.f, webView->topControls().contentOffset()); | |
| 808 EXPECT_EQ(previousRootOffset, rootViewport->scrollPosition().y()); | |
| 809 | |
| 810 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollEnd) ); | |
| 811 } | |
| 812 } | |
| 813 | |
| 734 } // namespace blink | 814 } // namespace blink |
| OLD | NEW |