Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(317)

Side by Side Diff: third_party/WebKit/Source/web/tests/RootScrollerTest.cpp

Issue 2499853002: Fixed clip resize for document.rootScroller with inertTopControls (Closed)
Patch Set: Fixed issues + Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/BrowserControls.h" 5 #include "core/frame/BrowserControls.h"
6 #include "core/frame/FrameHost.h" 6 #include "core/frame/FrameHost.h"
7 #include "core/frame/FrameView.h" 7 #include "core/frame/FrameView.h"
8 #include "core/frame/RootFrameViewport.h" 8 #include "core/frame/RootFrameViewport.h"
9 #include "core/html/HTMLFrameOwnerElement.h" 9 #include "core/html/HTMLFrameOwnerElement.h"
10 #include "core/layout/LayoutBox.h" 10 #include "core/layout/LayoutBox.h"
11 #include "core/layout/api/LayoutViewItem.h" 11 #include "core/layout/api/LayoutViewItem.h"
12 #include "core/layout/compositing/CompositedLayerMapping.h"
12 #include "core/layout/compositing/PaintLayerCompositor.h" 13 #include "core/layout/compositing/PaintLayerCompositor.h"
13 #include "core/page/Page.h" 14 #include "core/page/Page.h"
14 #include "core/page/scrolling/RootScrollerController.h" 15 #include "core/page/scrolling/RootScrollerController.h"
15 #include "core/page/scrolling/TopDocumentRootScrollerController.h" 16 #include "core/page/scrolling/TopDocumentRootScrollerController.h"
17 #include "core/paint/PaintLayer.h"
16 #include "core/paint/PaintLayerScrollableArea.h" 18 #include "core/paint/PaintLayerScrollableArea.h"
17 #include "platform/testing/URLTestHelpers.h" 19 #include "platform/testing/URLTestHelpers.h"
18 #include "platform/testing/UnitTestHelpers.h" 20 #include "platform/testing/UnitTestHelpers.h"
19 #include "public/platform/Platform.h" 21 #include "public/platform/Platform.h"
20 #include "public/platform/WebURLLoaderMockFactory.h" 22 #include "public/platform/WebURLLoaderMockFactory.h"
21 #include "public/web/WebCache.h" 23 #include "public/web/WebCache.h"
22 #include "public/web/WebConsoleMessage.h" 24 #include "public/web/WebConsoleMessage.h"
23 #include "public/web/WebRemoteFrame.h" 25 #include "public/web/WebRemoteFrame.h"
24 #include "public/web/WebScriptSource.h" 26 #include "public/web/WebScriptSource.h"
25 #include "public/web/WebSettings.h" 27 #include "public/web/WebSettings.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 settings->setMainFrameResizesAreOrientationChanges(true); 84 settings->setMainFrameResizesAreOrientationChanges(true);
83 } 85 }
84 86
85 void registerMockedHttpURLLoad(const std::string& fileName) { 87 void registerMockedHttpURLLoad(const std::string& fileName) {
86 URLTestHelpers::registerMockedURLFromBaseURL( 88 URLTestHelpers::registerMockedURLFromBaseURL(
87 WebString::fromUTF8(m_baseURL.c_str()), 89 WebString::fromUTF8(m_baseURL.c_str()),
88 WebString::fromUTF8(fileName.c_str())); 90 WebString::fromUTF8(fileName.c_str()));
89 } 91 }
90 92
91 void executeScript(const WebString& code) { 93 void executeScript(const WebString& code) {
92 mainWebFrame()->executeScript(WebScriptSource(code)); 94 executeScript(code, *mainWebFrame());
93 mainWebFrame()->view()->updateAllLifecyclePhases(); 95 }
96
97 void executeScript(const WebString& code, WebLocalFrame& frame) {
98 frame.executeScript(WebScriptSource(code));
99 frame.view()->updateAllLifecyclePhases();
94 runPendingTasks(); 100 runPendingTasks();
95 } 101 }
96 102
97 WebViewImpl* webViewImpl() const { return m_helper.webView(); } 103 WebViewImpl* webViewImpl() const { return m_helper.webView(); }
98 104
99 FrameHost& frameHost() const { 105 FrameHost& frameHost() const {
100 return m_helper.webView()->page()->frameHost(); 106 return m_helper.webView()->page()->frameHost();
101 } 107 }
102 108
103 LocalFrame* mainFrame() const { 109 LocalFrame* mainFrame() const {
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 878
873 EXPECT_FALSE( 879 EXPECT_FALSE(
874 childCompositor->rootContentLayer()->platformLayer()->masksToBounds()); 880 childCompositor->rootContentLayer()->platformLayer()->masksToBounds());
875 EXPECT_FALSE( 881 EXPECT_FALSE(
876 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); 882 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds());
877 EXPECT_FALSE( 883 EXPECT_FALSE(
878 childCompositor->containerLayer()->platformLayer()->masksToBounds()); 884 childCompositor->containerLayer()->platformLayer()->masksToBounds());
879 } 885 }
880 } 886 }
881 887
888 // Tests that the clipping layer is resized on the root scroller element even
889 // if the layout height doesn't change.
890 TEST_F(RootScrollerTest, BrowserControlsResizeClippingLayer) {
891 bool oldInertTopControls = RuntimeEnabledFeatures::inertTopControlsEnabled();
892 RuntimeEnabledFeatures::setInertTopControlsEnabled(true);
893
894 initialize("root-scroller.html");
895 Element* container = mainFrame()->document()->getElementById("container");
896
897 {
898 NonThrowableExceptionState exceptionState;
899 mainFrame()->document()->setRootScroller(container, exceptionState);
900
901 mainFrameView()->updateAllLifecyclePhases();
902 ASSERT_EQ(toLayoutBox(container->layoutObject())->clientHeight(), 400);
903
904 GraphicsLayer* clipLayer = toLayoutBox(container->layoutObject())
905 ->layer()
906 ->compositedLayerMapping()
907 ->scrollingLayer();
908 ASSERT_EQ(clipLayer->size().height(), 400);
909 EXPECT_TRUE(toLayoutBox(container->layoutObject())
910 ->layer()
911 ->isGlobalRootScroller());
912 }
913
914 {
915 webViewImpl()->handleInputEvent(
916 generateTouchGestureEvent(WebInputEvent::GestureScrollBegin));
917
918 // Scrolling over the #container DIV should cause the browser controls to
919 // hide.
920 EXPECT_FLOAT_EQ(1, browserControls().shownRatio());
921 webViewImpl()->handleInputEvent(generateTouchGestureEvent(
922 WebInputEvent::GestureScrollUpdate, 0, -browserControls().height()));
923 EXPECT_FLOAT_EQ(0, browserControls().shownRatio());
924
925 webViewImpl()->handleInputEvent(
926 generateTouchGestureEvent(WebInputEvent::GestureScrollEnd));
927
928 webViewImpl()->resizeWithBrowserControls(IntSize(400, 450), 50, false);
929 mainFrameView()->updateAllLifecyclePhases();
chrishtr 2016/11/18 00:37:09 Add a check before this line that the root scrolle
bokan 2016/11/18 22:30:35 Done.
930
931 // Since inert top controls are enabled, the container should not have
932 // resized, however, the clip layer should.
933 EXPECT_EQ(toLayoutBox(container->layoutObject())->clientHeight(), 400);
934 GraphicsLayer* clipLayer = toLayoutBox(container->layoutObject())
935 ->layer()
936 ->compositedLayerMapping()
937 ->scrollingLayer();
938 EXPECT_EQ(clipLayer->size().height(), 450);
939 }
940
941 RuntimeEnabledFeatures::setInertTopControlsEnabled(oldInertTopControls);
942 }
943
944 // Tests that the clipping layer is resized on the root scroller element when
945 // it's an iframe and even if the layout height doesn't change.
946 TEST_F(RootScrollerTest, BrowserControlsResizeClippingLayerIFrame) {
947 bool oldInertTopControls = RuntimeEnabledFeatures::inertTopControlsEnabled();
948 RuntimeEnabledFeatures::setInertTopControlsEnabled(true);
949
950 initialize("root-scroller-iframe.html");
951
952 Element* iframe = mainFrame()->document()->getElementById("iframe");
953 LocalFrame* childFrame =
954 toLocalFrame(toHTMLFrameOwnerElement(iframe)->contentFrame());
955
956 PaintLayerCompositor* childPLC =
957 childFrame->view()->layoutViewItem().compositor();
958
959 // Give the iframe itself scrollable content and make it the root scroller.
960 {
961 NonThrowableExceptionState nonThrow;
962 mainFrame()->document()->setRootScroller(iframe, nonThrow);
963
964 WebLocalFrame* childWebFrame =
965 mainWebFrame()->firstChild()->toWebLocalFrame();
966 executeScript(
967 "document.getElementById('container').style.width = '300%';"
968 "document.getElementById('container').style.height = '300%';",
969 *childWebFrame);
970
971 mainFrameView()->updateAllLifecyclePhases();
972
973 // Some sanity checks to make sure the test is setup correctly.
974 ASSERT_EQ(childFrame->view()->visibleContentSize().height(), 400);
975 ASSERT_EQ(childPLC->containerLayer()->size().height(), 400);
976 ASSERT_EQ(childPLC->rootGraphicsLayer()->size().height(), 400);
977 ASSERT_TRUE(childFrame->view()->layer()->isGlobalRootScroller());
978 }
979
980 {
981 webViewImpl()->handleInputEvent(
982 generateTouchGestureEvent(WebInputEvent::GestureScrollBegin));
983
984 // Scrolling over the #container DIV should cause the browser controls to
985 // hide.
986 EXPECT_FLOAT_EQ(1, browserControls().shownRatio());
987 webViewImpl()->handleInputEvent(generateTouchGestureEvent(
988 WebInputEvent::GestureScrollUpdate, 0, -browserControls().height()));
989 EXPECT_FLOAT_EQ(0, browserControls().shownRatio());
990
991 webViewImpl()->handleInputEvent(
992 generateTouchGestureEvent(WebInputEvent::GestureScrollEnd));
993
994 webViewImpl()->resizeWithBrowserControls(IntSize(400, 450), 50, false);
995 mainFrameView()->updateAllLifecyclePhases();
996
997 // Since inert top controls are enabled, the iframe element should not have
998 // resized, however, its clip layer should resize to reveal content as the
999 // browser controls hide.
1000 EXPECT_EQ(childFrame->view()->visibleContentSize().height(), 400);
1001 EXPECT_EQ(childPLC->containerLayer()->size().height(), 450);
1002 EXPECT_EQ(childPLC->rootGraphicsLayer()->size().height(), 450);
1003 }
1004
1005 RuntimeEnabledFeatures::setInertTopControlsEnabled(oldInertTopControls);
1006 }
1007
882 // Tests that removing the root scroller element from the DOM resets the 1008 // Tests that removing the root scroller element from the DOM resets the
883 // effective root scroller without waiting for any lifecycle events. 1009 // effective root scroller without waiting for any lifecycle events.
884 TEST_F(RootScrollerTest, RemoveRootScrollerFromDom) { 1010 TEST_F(RootScrollerTest, RemoveRootScrollerFromDom) {
885 initialize("root-scroller-iframe.html"); 1011 initialize("root-scroller-iframe.html");
886 1012
887 { 1013 {
888 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( 1014 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
889 mainFrame()->document()->getElementById("iframe")); 1015 mainFrame()->document()->getElementById("iframe"));
890 Element* innerContainer = 1016 Element* innerContainer =
891 iframe->contentDocument()->getElementById("container"); 1017 iframe->contentDocument()->getElementById("container");
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 EXPECT_EQ(mainFrame()->document()->documentElement(), 1053 EXPECT_EQ(mainFrame()->document()->documentElement(),
928 globalController.globalRootScroller()); 1054 globalController.globalRootScroller());
929 EXPECT_EQ( 1055 EXPECT_EQ(
930 mainFrameView()->layoutViewportScrollableArea()->layerForScrolling(), 1056 mainFrameView()->layoutViewportScrollableArea()->layerForScrolling(),
931 globalController.rootScrollerLayer()); 1057 globalController.rootScrollerLayer());
932 } 1058 }
933 1059
934 } // namespace 1060 } // namespace
935 1061
936 } // namespace blink 1062 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698