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