Fix repaint issues when resizing a window with centered content, for platforms with...
[WebKit-https.git] / Source / WebKit / chromium / tests / ScrollingCoordinatorChromiumTest.cpp
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26
27 #include "ScrollingCoordinator.h"
28
29 #include "CompositorFakeWebGraphicsContext3D.h"
30 #include "FrameTestHelpers.h"
31 #include "RenderLayerBacking.h"
32 #include "RenderLayerCompositor.h"
33 #include "RenderView.h"
34 #include "URLTestHelpers.h"
35 #include "WebCompositorInitializer.h"
36 #include "WebFrameClient.h"
37 #include "WebFrameImpl.h"
38 #include "WebSettings.h"
39 #include "WebViewClient.h"
40 #include "WebViewImpl.h"
41 #include <gtest/gtest.h>
42 #include <public/WebCompositorSupport.h>
43 #include <public/WebLayer.h>
44 #include <webkit/support/webkit_support.h>
45
46 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
47 #include "GraphicsLayerChromium.h"
48 #endif
49
50 using namespace WebCore;
51 using namespace WebKit;
52
53 namespace {
54
55 class MockWebViewClient : public WebViewClient {
56 public:
57     virtual WebCompositorOutputSurface* createOutputSurface() OVERRIDE
58     {
59         return Platform::current()->compositorSupport()->createOutputSurfaceFor3D(CompositorFakeWebGraphicsContext3D::create(WebGraphicsContext3D::Attributes()).leakPtr());
60     }
61 };
62
63 class MockWebFrameClient : public WebFrameClient {
64 };
65
66 class ScrollingCoordinatorChromiumTest : public testing::Test {
67 public:
68     ScrollingCoordinatorChromiumTest()
69         : m_baseURL("http://www.test.com/")
70         , m_webCompositorInitializer(0)
71     {
72         Platform::current()->compositorSupport()->initialize(0);
73
74         // We cannot reuse FrameTestHelpers::createWebViewAndLoad here because the compositing
75         // settings need to be set before the page is loaded.
76         m_webViewImpl = static_cast<WebViewImpl*>(WebView::create(&m_mockWebViewClient));
77         m_webViewImpl->settings()->setJavaScriptEnabled(true);
78         m_webViewImpl->settings()->setForceCompositingMode(true);
79         m_webViewImpl->settings()->setAcceleratedCompositingEnabled(true);
80         m_webViewImpl->settings()->setAcceleratedCompositingForFixedPositionEnabled(true);
81         m_webViewImpl->settings()->setFixedPositionCreatesStackingContext(true);
82         m_webViewImpl->initializeMainFrame(&m_mockWebFrameClient);
83         m_webViewImpl->resize(IntSize(320, 240));
84     }
85
86     virtual ~ScrollingCoordinatorChromiumTest()
87     {
88         webkit_support::UnregisterAllMockedURLs();
89         m_webViewImpl->close();
90
91         Platform::current()->compositorSupport()->shutdown();
92     }
93
94     void navigateTo(const std::string& url)
95     {
96         FrameTestHelpers::loadFrame(m_webViewImpl->mainFrame(), url);
97         webkit_support::ServeAsynchronousMockedRequests();
98     }
99
100     void registerMockedHttpURLLoad(const std::string& fileName)
101     {
102         URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
103     }
104
105     WebLayer* getRootScrollLayer()
106     {
107         RenderLayerCompositor* compositor = m_webViewImpl->mainFrameImpl()->frame()->contentRenderer()->compositor();
108         ASSERT(compositor);
109         ASSERT(compositor->scrollLayer());
110
111         WebLayer* webScrollLayer = static_cast<WebLayer*>(compositor->scrollLayer()->platformLayer());
112         return webScrollLayer;
113     }
114
115 protected:
116     std::string m_baseURL;
117     MockWebFrameClient m_mockWebFrameClient;
118     MockWebViewClient m_mockWebViewClient;
119     WebKitTests::WebCompositorInitializer m_webCompositorInitializer;
120     WebViewImpl* m_webViewImpl;
121 };
122
123 TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
124 {
125     navigateTo("about:blank");
126
127     // Make sure the scrolling coordinator is active.
128     FrameView* frameView = m_webViewImpl->mainFrameImpl()->frameView();
129     Page* page = m_webViewImpl->mainFrameImpl()->frame()->page();
130     ASSERT_TRUE(page->scrollingCoordinator());
131     ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
132
133     // Fast scrolling should be enabled by default.
134     WebLayer* rootScrollLayer = getRootScrollLayer();
135     ASSERT_TRUE(rootScrollLayer->scrollable());
136     ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
137     ASSERT_FALSE(rootScrollLayer->haveWheelEventHandlers());
138 }
139
140 TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingForFixedPosition)
141 {
142     registerMockedHttpURLLoad("fixed-position.html");
143     navigateTo(m_baseURL + "fixed-position.html");
144
145     Page* page = m_webViewImpl->mainFrameImpl()->frame()->page();
146     ASSERT_TRUE(page->scrollingCoordinator()->supportsFixedPositionLayers());
147
148     // Fixed position should not fall back to main thread scrolling.
149     WebLayer* rootScrollLayer = getRootScrollLayer();
150     ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
151
152     // Verify the properties of the fixed position element starting from the RenderObject all the
153     // way to the WebLayer.
154     Element* fixedElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("fixed");
155     ASSERT(fixedElement);
156
157     RenderObject* renderer = fixedElement->renderer();
158     ASSERT_TRUE(renderer->isBoxModelObject());
159     ASSERT_TRUE(renderer->hasLayer());
160
161     RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
162     ASSERT_TRUE(layer->isComposited());
163
164     RenderLayerBacking* layerBacking = layer->backing();
165     WebLayer* webLayer = static_cast<WebLayer*>(layerBacking->graphicsLayer()->platformLayer());
166     ASSERT_TRUE(webLayer->fixedToContainerLayer());
167 }
168
169 TEST_F(ScrollingCoordinatorChromiumTest, nonFastScrollableRegion)
170 {
171     registerMockedHttpURLLoad("non-fast-scrollable.html");
172     navigateTo(m_baseURL + "non-fast-scrollable.html");
173
174     WebLayer* rootScrollLayer = getRootScrollLayer();
175     WebVector<WebRect> nonFastScrollableRegion = rootScrollLayer->nonFastScrollableRegion();
176
177     ASSERT_EQ(1u, nonFastScrollableRegion.size());
178     ASSERT_EQ(WebRect(8, 8, 10, 10), nonFastScrollableRegion[0]);
179 }
180
181 TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
182 {
183     registerMockedHttpURLLoad("wheel-event-handler.html");
184     navigateTo(m_baseURL + "wheel-event-handler.html");
185
186     WebLayer* rootScrollLayer = getRootScrollLayer();
187     ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
188 }
189
190 TEST_F(ScrollingCoordinatorChromiumTest, clippedBodyTest)
191 {
192     registerMockedHttpURLLoad("clipped-body.html");
193     navigateTo(m_baseURL + "clipped-body.html");
194
195     WebLayer* rootScrollLayer = getRootScrollLayer();
196     ASSERT_EQ(0u, rootScrollLayer->nonFastScrollableRegion().size());
197 }
198
199 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
200 TEST_F(ScrollingCoordinatorChromiumTest, touchOverflowScrolling)
201 {
202     registerMockedHttpURLLoad("touch-overflow-scrolling.html");
203     navigateTo(m_baseURL + "touch-overflow-scrolling.html");
204
205     // Verify the properties of the accelerated scrolling element starting from the RenderObject
206     // all the way to the WebLayer.
207     Element* scrollableElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
208     ASSERT(scrollableElement);
209
210     RenderObject* renderer = scrollableElement->renderer();
211     ASSERT_TRUE(renderer->isBoxModelObject());
212     ASSERT_TRUE(renderer->hasLayer());
213
214     RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
215     ASSERT_TRUE(layer->usesCompositedScrolling());
216     ASSERT_TRUE(layer->isComposited());
217
218     RenderLayerBacking* layerBacking = layer->backing();
219     ASSERT_TRUE(layerBacking->hasScrollingLayer());
220     ASSERT(layerBacking->scrollingContentsLayer());
221
222     GraphicsLayerChromium* graphicsLayerChromium = static_cast<GraphicsLayerChromium*>(layerBacking->scrollingContentsLayer());
223     ASSERT_EQ(layer, graphicsLayerChromium->scrollableArea());
224
225     WebLayer* webScrollLayer = static_cast<WebLayer*>(layerBacking->scrollingContentsLayer()->platformLayer());
226     ASSERT_TRUE(webScrollLayer->scrollable());
227 }
228 #endif // ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
229
230 } // namespace