Disable -webkit-overflow-scrolling CSS attribute on Chromium
[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 #include "GraphicsLayerChromium.h"
47
48 using namespace WebCore;
49 using namespace WebKit;
50
51 namespace {
52
53 class FakeWebViewClient : public WebViewClient {
54 public:
55     virtual WebCompositorOutputSurface* createOutputSurface() OVERRIDE
56     {
57         return Platform::current()->compositorSupport()->createOutputSurfaceFor3D(CompositorFakeWebGraphicsContext3D::create(WebGraphicsContext3D::Attributes()).leakPtr());
58     }
59
60     virtual void initializeLayerTreeView(WebLayerTreeViewClient* client, const WebLayer& rootLayer, const WebLayerTreeView::Settings& settings)
61     {
62         m_layerTreeView = adoptPtr(Platform::current()->compositorSupport()->createLayerTreeView(client, rootLayer, settings));
63         ASSERT(m_layerTreeView);
64     }
65
66     virtual WebLayerTreeView* layerTreeView()
67     {
68         return m_layerTreeView.get();
69     }
70
71 private:
72     OwnPtr<WebLayerTreeView> m_layerTreeView;
73 };
74
75 class MockWebFrameClient : public WebFrameClient {
76 };
77
78 class ScrollingCoordinatorChromiumTest : public testing::Test {
79 public:
80     ScrollingCoordinatorChromiumTest()
81         : m_baseURL("http://www.test.com/")
82     {
83         Platform::current()->compositorSupport()->initialize(0);
84
85         // We cannot reuse FrameTestHelpers::createWebViewAndLoad here because the compositing
86         // settings need to be set before the page is loaded.
87         m_webViewImpl = static_cast<WebViewImpl*>(WebView::create(&m_mockWebViewClient));
88         m_webViewImpl->settings()->setJavaScriptEnabled(true);
89         m_webViewImpl->settings()->setForceCompositingMode(true);
90         m_webViewImpl->settings()->setAcceleratedCompositingEnabled(true);
91         m_webViewImpl->settings()->setAcceleratedCompositingForFixedPositionEnabled(true);
92         m_webViewImpl->settings()->setAcceleratedCompositingForOverflowScrollEnabled(true);
93         m_webViewImpl->settings()->setFixedPositionCreatesStackingContext(true);
94         m_webViewImpl->initializeMainFrame(&m_mockWebFrameClient);
95         m_webViewImpl->resize(IntSize(320, 240));
96     }
97
98     virtual ~ScrollingCoordinatorChromiumTest()
99     {
100         webkit_support::UnregisterAllMockedURLs();
101         m_webViewImpl->close();
102
103         Platform::current()->compositorSupport()->shutdown();
104     }
105
106     void navigateTo(const std::string& url)
107     {
108         FrameTestHelpers::loadFrame(m_webViewImpl->mainFrame(), url);
109         webkit_support::ServeAsynchronousMockedRequests();
110     }
111
112     void registerMockedHttpURLLoad(const std::string& fileName)
113     {
114         URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
115     }
116
117     WebLayer* getRootScrollLayer()
118     {
119         RenderLayerCompositor* compositor = m_webViewImpl->mainFrameImpl()->frame()->contentRenderer()->compositor();
120         ASSERT(compositor);
121         ASSERT(compositor->scrollLayer());
122
123         WebLayer* webScrollLayer = static_cast<WebLayer*>(compositor->scrollLayer()->platformLayer());
124         return webScrollLayer;
125     }
126
127 protected:
128     std::string m_baseURL;
129     MockWebFrameClient m_mockWebFrameClient;
130     FakeWebViewClient m_mockWebViewClient;
131     WebViewImpl* m_webViewImpl;
132 };
133
134 TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
135 {
136     navigateTo("about:blank");
137
138     // Make sure the scrolling coordinator is active.
139     FrameView* frameView = m_webViewImpl->mainFrameImpl()->frameView();
140     Page* page = m_webViewImpl->mainFrameImpl()->frame()->page();
141     ASSERT_TRUE(page->scrollingCoordinator());
142     ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
143
144     // Fast scrolling should be enabled by default.
145     WebLayer* rootScrollLayer = getRootScrollLayer();
146     ASSERT_TRUE(rootScrollLayer->scrollable());
147     ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
148     ASSERT_FALSE(rootScrollLayer->haveWheelEventHandlers());
149 }
150
151 TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingForFixedPosition)
152 {
153     registerMockedHttpURLLoad("fixed-position.html");
154     navigateTo(m_baseURL + "fixed-position.html");
155
156     Page* page = m_webViewImpl->mainFrameImpl()->frame()->page();
157     ASSERT_TRUE(page->scrollingCoordinator()->supportsFixedPositionLayers());
158
159     // Fixed position should not fall back to main thread scrolling.
160     WebLayer* rootScrollLayer = getRootScrollLayer();
161     ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
162
163     // Verify the properties of the fixed position element starting from the RenderObject all the
164     // way to the WebLayer.
165     Element* fixedElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("fixed");
166     ASSERT(fixedElement);
167
168     RenderObject* renderer = fixedElement->renderer();
169     ASSERT_TRUE(renderer->isBoxModelObject());
170     ASSERT_TRUE(renderer->hasLayer());
171
172     RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
173     ASSERT_TRUE(layer->isComposited());
174
175     RenderLayerBacking* layerBacking = layer->backing();
176     WebLayer* webLayer = static_cast<WebLayer*>(layerBacking->graphicsLayer()->platformLayer());
177     ASSERT_TRUE(webLayer->fixedToContainerLayer());
178 }
179
180 TEST_F(ScrollingCoordinatorChromiumTest, nonFastScrollableRegion)
181 {
182     registerMockedHttpURLLoad("non-fast-scrollable.html");
183     navigateTo(m_baseURL + "non-fast-scrollable.html");
184
185     WebLayer* rootScrollLayer = getRootScrollLayer();
186     WebVector<WebRect> nonFastScrollableRegion = rootScrollLayer->nonFastScrollableRegion();
187
188     ASSERT_EQ(1u, nonFastScrollableRegion.size());
189     ASSERT_EQ(WebRect(8, 8, 10, 10), nonFastScrollableRegion[0]);
190 }
191
192 TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
193 {
194     registerMockedHttpURLLoad("wheel-event-handler.html");
195     navigateTo(m_baseURL + "wheel-event-handler.html");
196
197     WebLayer* rootScrollLayer = getRootScrollLayer();
198     ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
199 }
200
201 TEST_F(ScrollingCoordinatorChromiumTest, clippedBodyTest)
202 {
203     registerMockedHttpURLLoad("clipped-body.html");
204     navigateTo(m_baseURL + "clipped-body.html");
205
206     WebLayer* rootScrollLayer = getRootScrollLayer();
207     ASSERT_EQ(0u, rootScrollLayer->nonFastScrollableRegion().size());
208 }
209
210 TEST_F(ScrollingCoordinatorChromiumTest, overflowScrolling)
211 {
212     registerMockedHttpURLLoad("overflow-scrolling.html");
213     navigateTo(m_baseURL + "overflow-scrolling.html");
214
215     // Verify the properties of the accelerated scrolling element starting from the RenderObject
216     // all the way to the WebLayer.
217     Element* scrollableElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
218     ASSERT(scrollableElement);
219
220     RenderObject* renderer = scrollableElement->renderer();
221     ASSERT_TRUE(renderer->isBoxModelObject());
222     ASSERT_TRUE(renderer->hasLayer());
223
224     RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
225     ASSERT_TRUE(layer->usesCompositedScrolling());
226     ASSERT_TRUE(layer->isComposited());
227
228     RenderLayerBacking* layerBacking = layer->backing();
229     ASSERT_TRUE(layerBacking->hasScrollingLayer());
230     ASSERT(layerBacking->scrollingContentsLayer());
231
232     GraphicsLayerChromium* graphicsLayerChromium = static_cast<GraphicsLayerChromium*>(layerBacking->scrollingContentsLayer());
233     ASSERT_EQ(layer, graphicsLayerChromium->scrollableArea());
234
235     WebLayer* webScrollLayer = static_cast<WebLayer*>(layerBacking->scrollingContentsLayer()->platformLayer());
236     ASSERT_TRUE(webScrollLayer->scrollable());
237 }
238
239 } // namespace