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