15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/page/Page.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/rendering/RenderWidget.h"
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h"
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/testing/URLTestHelpers.h"
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebLayer.h"
385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebLayerPositionConstraint.h"
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebLayerTreeView.h"
405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebUnitTestSupport.h"
41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSettings.h"
42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h"
43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
45f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/tests/FrameTestHelpers.h"
46f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include <gtest/gtest.h>
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScrollingCoordinatorChromiumTest : public testing::Test {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollingCoordinatorChromiumTest()
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_baseURL("http://www.test.com/")
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_helper.initialize(true, 0, &m_mockWebViewClient, &configureSettings);
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webViewImpl()->resize(IntSize(320, 240));
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~ScrollingCoordinatorChromiumTest()
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void navigateTo(const std::string& url)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        FrameTestHelpers::loadFrame(webViewImpl()->mainFrame(), url);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void forceFullCompositingUpdate()
7219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    {
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webViewImpl()->layout();
7419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    }
7519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void registerMockedHttpURLLoad(const std::string& fileName)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebLayer* getRootScrollLayer()
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RenderLayerCompositor* compositor = frame()->contentRenderer()->compositor();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(compositor);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(compositor->scrollLayer());
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        WebLayer* webScrollLayer = compositor->scrollLayer()->platformLayer();
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return webScrollLayer;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebViewImpl* webViewImpl() const { return m_helper.webViewImpl(); }
92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame() const { return m_helper.webViewImpl()->mainFrameImpl()->frame(); }
9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    std::string m_baseURL;
96f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    FrameTestHelpers::TestWebViewClient m_mockWebViewClient;
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private:
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static void configureSettings(WebSettings* settings)
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        settings->setJavaScriptEnabled(true);
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        settings->setAcceleratedCompositingEnabled(true);
1039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        settings->setPreferCompositingToLCDTextEnabled(true);
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FrameTestHelpers::WebViewHelper m_helper;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    navigateTo("about:blank");
11219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure the scrolling coordinator is active.
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FrameView* frameView = frame()->view();
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Page* page = frame()->page();
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_TRUE(page->scrollingCoordinator());
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fast scrolling should be enabled by default.
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebLayer* rootScrollLayer = getRootScrollLayer();
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_TRUE(rootScrollLayer->scrollable());
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_FALSE(rootScrollLayer->haveWheelEventHandlers());
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(ScrollingCoordinatorChromiumTest, fastScrollingCanBeDisabledWithSetting)
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    navigateTo("about:blank");
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    webViewImpl()->settings()->setThreadedScrollingEnabled(false);
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    forceFullCompositingUpdate();
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Make sure the scrolling coordinator is active.
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    FrameView* frameView = frame()->view();
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Page* page = frame()->page();
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT_TRUE(page->scrollingCoordinator());
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Main scrolling should be enabled with the setting override.
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebLayer* rootScrollLayer = getRootScrollLayer();
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT_TRUE(rootScrollLayer->scrollable());
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT_TRUE(rootScrollLayer->shouldScrollOnMainThread());
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
14593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static WebLayer* webLayerFromElement(Element* element)
14693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
14793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!element)
14893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
14993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    RenderObject* renderer = element->renderer();
15093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!renderer || !renderer->isBoxModelObject())
15193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
15293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
15393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!layer)
15493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!layer->hasCompositedLayerMapping())
15693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
157e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMapping();
1581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    GraphicsLayer* graphicsLayer = compositedLayerMapping->mainGraphicsLayer();
15993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!graphicsLayer)
16093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
16193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return graphicsLayer->platformLayer();
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
16393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingForFixedPosition)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    registerMockedHttpURLLoad("fixed-position.html");
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    navigateTo(m_baseURL + "fixed-position.html");
16819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fixed position should not fall back to main thread scrolling.
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebLayer* rootScrollLayer = getRootScrollLayer();
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Document* document = frame()->document();
17593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
17693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("div-tl");
17793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
17893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
17993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
18093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
18193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
18293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(!constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge);
18393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
18493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
18593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("div-tr");
18693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
18793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
18893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
18993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
19093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
19193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge);
19293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
19393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
19493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("div-bl");
19593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
19693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
19793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
19893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
19993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
20093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(!constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge);
20193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
20293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
20393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("div-br");
20493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
20593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
20693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
20793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
20893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
20993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge);
21093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
21193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
21293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("span-tl");
21393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
21493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
21593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
21693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
21793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
21893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(!constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge);
21993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
22093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
22193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("span-tr");
22293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
22393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
22493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
22593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
22693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
22793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge);
22893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
22993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
23093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("span-bl");
23193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
23293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
23393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
23493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
23593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
23693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(!constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge);
23793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
23893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
23993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        Element* element = document->getElementById("span-br");
24093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(element);
24193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayer* layer = webLayerFromElement(element);
24293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(layer);
24393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        WebLayerPositionConstraint constraint = layer->positionConstraint();
24493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedPosition);
24593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_TRUE(constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge);
24693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    registerMockedHttpURLLoad("wheel-event-handler.html");
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    navigateTo(m_baseURL + "wheel-event-handler.html");
25319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebLayer* rootScrollLayer = getRootScrollLayer();
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
259323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, scrollEventHandler)
260323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
261323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    registerMockedHttpURLLoad("scroll-event-handler.html");
262323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    navigateTo(m_baseURL + "scroll-event-handler.html");
263323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    forceFullCompositingUpdate();
264323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
265323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WebLayer* rootScrollLayer = getRootScrollLayer();
266323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    ASSERT_TRUE(rootScrollLayer->haveScrollEventHandlers());
267323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
268323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
269d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, updateEventHandlersDuringTeardown)
270d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
271d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    registerMockedHttpURLLoad("scroll-event-handler-window.html");
272d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    navigateTo(m_baseURL + "scroll-event-handler-window.html");
273d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    forceFullCompositingUpdate();
274d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
275d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Simulate detaching the document from its DOM window. This should not
276d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // cause a crash when the WebViewImpl is closed by the test runner.
277d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    frame()->document()->prepareForDestruction();
278d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
279d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, clippedBodyTest)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    registerMockedHttpURLLoad("clipped-body.html");
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    navigateTo(m_baseURL + "clipped-body.html");
28419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebLayer* rootScrollLayer = getRootScrollLayer();
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_EQ(0u, rootScrollLayer->nonFastScrollableRegion().size());
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, overflowScrolling)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    registerMockedHttpURLLoad("overflow-scrolling.html");
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    navigateTo(m_baseURL + "overflow-scrolling.html");
29419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Verify the properties of the accelerated scrolling element starting from the RenderObject
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // all the way to the WebLayer.
29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* scrollableElement = frame()->document()->getElementById("scrollable");
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(scrollableElement);
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = scrollableElement->renderer();
302f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(renderer->isBox());
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_TRUE(renderer->hasLayer());
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    RenderBox* box = toRenderBox(renderer);
306f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(box->usesCompositedScrolling());
307f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(PaintsIntoOwnBacking, box->layer()->compositingState());
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
309e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CompositedLayerMapping* compositedLayerMapping = box->layer()->compositedLayerMapping();
3101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->hasScrollingLayer());
3111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(compositedLayerMapping->scrollingContentsLayer());
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    GraphicsLayer* graphicsLayer = compositedLayerMapping->scrollingContentsLayer();
314f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(box->layer()->scrollableArea(), graphicsLayer->scrollableArea());
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    WebLayer* webScrollLayer = compositedLayerMapping->scrollingContentsLayer()->platformLayer();
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->scrollable());
318f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->userScrollableHorizontal());
319f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->userScrollableVertical());
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
32153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(ANDROID)
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Now verify we've attached impl-side scrollbars onto the scrollbar layers
3231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->layerForHorizontalScrollbar());
3241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->layerForHorizontalScrollbar()->hasContentsLayer());
3251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->layerForVerticalScrollbar());
3261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->layerForVerticalScrollbar()->hasContentsLayer());
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
330f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, overflowHidden)
331f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
332f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    registerMockedHttpURLLoad("overflow-hidden.html");
333f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    navigateTo(m_baseURL + "overflow-hidden.html");
33419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
335f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
336f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // Verify the properties of the accelerated scrolling element starting from the RenderObject
337f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // all the way to the WebLayer.
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* overflowElement = frame()->document()->getElementById("unscrollable-y");
339f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(overflowElement);
340f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
341f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    RenderObject* renderer = overflowElement->renderer();
342f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(renderer->isBox());
343f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(renderer->hasLayer());
344f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
345f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    RenderBox* box = toRenderBox(renderer);
346f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(box->usesCompositedScrolling());
347f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(PaintsIntoOwnBacking, box->layer()->compositingState());
348f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
349e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CompositedLayerMapping* compositedLayerMapping = box->layer()->compositedLayerMapping();
350f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->hasScrollingLayer());
351f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(compositedLayerMapping->scrollingContentsLayer());
352f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
353f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    GraphicsLayer* graphicsLayer = compositedLayerMapping->scrollingContentsLayer();
354f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(box->layer()->scrollableArea(), graphicsLayer->scrollableArea());
355f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
356f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    WebLayer* webScrollLayer = compositedLayerMapping->scrollingContentsLayer()->platformLayer();
357f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->scrollable());
358f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->userScrollableHorizontal());
359f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_FALSE(webScrollLayer->userScrollableVertical());
360f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    overflowElement = frame()->document()->getElementById("unscrollable-x");
362f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(overflowElement);
363f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
364f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    renderer = overflowElement->renderer();
365f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(renderer->isBox());
366f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(renderer->hasLayer());
367f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
368f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    box = toRenderBox(renderer);
369f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(box->scrollableArea()->usesCompositedScrolling());
370f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(PaintsIntoOwnBacking, box->layer()->compositingState());
371f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
372f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    compositedLayerMapping = box->layer()->compositedLayerMapping();
373f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(compositedLayerMapping->hasScrollingLayer());
374f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(compositedLayerMapping->scrollingContentsLayer());
375f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
376f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    graphicsLayer = compositedLayerMapping->scrollingContentsLayer();
377f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(box->layer()->scrollableArea(), graphicsLayer->scrollableArea());
378f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
379f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    webScrollLayer = compositedLayerMapping->scrollingContentsLayer()->platformLayer();
380f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->scrollable());
381f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_FALSE(webScrollLayer->userScrollableHorizontal());
382f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_TRUE(webScrollLayer->userScrollableVertical());
383f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
384f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, iframeScrolling)
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    registerMockedHttpURLLoad("iframe-scrolling.html");
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    registerMockedHttpURLLoad("iframe-scrolling-inner.html");
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    navigateTo(m_baseURL + "iframe-scrolling.html");
39019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Verify the properties of the accelerated scrolling element starting from the RenderObject
393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // all the way to the WebLayer.
39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* scrollableFrame = frame()->document()->getElementById("scrollable");
395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(scrollableFrame);
396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObject* renderer = scrollableFrame->renderer();
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderer);
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderer->isWidget());
400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderWidget* renderWidget = toRenderWidget(renderer);
402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderWidget);
403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderWidget->widget());
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderWidget->widget()->isFrameView());
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FrameView* innerFrameView = toFrameView(renderWidget->widget());
407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* innerRenderView = innerFrameView->renderView();
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerRenderView);
409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderLayerCompositor* innerCompositor = innerRenderView->compositor();
411f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT_TRUE(innerCompositor->inCompositingMode());
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerCompositor->scrollLayer());
413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    GraphicsLayer* scrollLayer = innerCompositor->scrollLayer();
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_EQ(innerFrameView, scrollLayer->scrollableArea());
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
417521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    WebLayer* webScrollLayer = scrollLayer->platformLayer();
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(webScrollLayer->scrollable());
419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
42053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(ANDROID)
421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Now verify we've attached impl-side scrollbars onto the scrollbar layers
422926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerCompositor->layerForHorizontalScrollbar());
423926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerCompositor->layerForHorizontalScrollbar()->hasContentsLayer());
424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerCompositor->layerForVerticalScrollbar());
425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerCompositor->layerForVerticalScrollbar()->hasContentsLayer());
426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, rtlIframe)
430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    registerMockedHttpURLLoad("rtl-iframe.html");
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    registerMockedHttpURLLoad("rtl-iframe-inner.html");
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    navigateTo(m_baseURL + "rtl-iframe.html");
43419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Verify the properties of the accelerated scrolling element starting from the RenderObject
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // all the way to the WebLayer.
43809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* scrollableFrame = frame()->document()->getElementById("scrollable");
439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(scrollableFrame);
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObject* renderer = scrollableFrame->renderer();
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderer);
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderer->isWidget());
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderWidget* renderWidget = toRenderWidget(renderer);
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderWidget);
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderWidget->widget());
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(renderWidget->widget()->isFrameView());
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
45006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    FrameView* innerFrameView = toFrameView(renderWidget->widget());
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderView* innerRenderView = innerFrameView->renderView();
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerRenderView);
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderLayerCompositor* innerCompositor = innerRenderView->compositor();
455f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT_TRUE(innerCompositor->inCompositingMode());
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(innerCompositor->scrollLayer());
457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    GraphicsLayer* scrollLayer = innerCompositor->scrollLayer();
459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_EQ(innerFrameView, scrollLayer->scrollableArea());
460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
461521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    WebLayer* webScrollLayer = scrollLayer->platformLayer();
462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_TRUE(webScrollLayer->scrollable());
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
46453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int expectedScrollPosition = 958 + (innerFrameView->verticalScrollbar()->isOverlayScrollbar() ? 0 : 15);
46553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT_EQ(expectedScrollPosition, webScrollLayer->scrollPosition().x);
46653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
46753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
46853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)TEST_F(ScrollingCoordinatorChromiumTest, setupScrollbarLayerShouldNotCrash)
46953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
47053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    registerMockedHttpURLLoad("setup_scrollbar_layer_crash.html");
47153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    navigateTo(m_baseURL + "setup_scrollbar_layer_crash.html");
47219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    forceFullCompositingUpdate();
47353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // This test document setup an iframe with scrollbars, then switch to
47453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // an empty document by javascript.
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
478