Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / web / tests / ScrollingCoordinatorChromiumTest.cpp
index 46af633..cdf1a04 100644 (file)
 
 #include "core/page/scrolling/ScrollingCoordinator.h"
 
-#include <gtest/gtest.h>
-#include "FrameTestHelpers.h"
-#include "URLTestHelpers.h"
-#include "WebFrameClient.h"
-#include "WebFrameImpl.h"
-#include "WebSettings.h"
-#include "WebViewClient.h"
-#include "WebViewImpl.h"
-#include "core/platform/graphics/GraphicsLayer.h"
-#include "core/rendering/CompositedLayerMapping.h"
-#include "core/rendering/RenderLayerCompositor.h"
+#include "core/page/Page.h"
+#include "core/rendering/RenderPart.h"
 #include "core/rendering/RenderView.h"
+#include "core/rendering/compositing/CompositedLayerMapping.h"
+#include "core/rendering/compositing/RenderLayerCompositor.h"
+#include "core/testing/URLTestHelpers.h"
+#include "platform/graphics/GraphicsLayer.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebLayer.h"
 #include "public/platform/WebLayerPositionConstraint.h"
 #include "public/platform/WebLayerTreeView.h"
 #include "public/platform/WebUnitTestSupport.h"
+#include "public/web/WebSettings.h"
+#include "public/web/WebViewClient.h"
+#include "web/WebLocalFrameImpl.h"
+#include "web/WebViewImpl.h"
+#include "web/tests/FrameTestHelpers.h"
+#include <gtest/gtest.h>
 
-using namespace WebCore;
-using namespace WebKit;
+using namespace blink;
 
 namespace {
 
-class FakeWebViewClient : public WebViewClient {
-public:
-    virtual void initializeLayerTreeView()
-    {
-        m_layerTreeView = adoptPtr(Platform::current()->unitTestSupport()->createLayerTreeViewForTesting(WebUnitTestSupport::TestViewTypeUnitTest));
-        ASSERT(m_layerTreeView);
-    }
-
-    virtual WebLayerTreeView* layerTreeView()
-    {
-        return m_layerTreeView.get();
-    }
-
-private:
-    OwnPtr<WebLayerTreeView> m_layerTreeView;
-};
-
-class MockWebFrameClient : public WebFrameClient {
-};
-
 class ScrollingCoordinatorChromiumTest : public testing::Test {
 public:
     ScrollingCoordinatorChromiumTest()
         : m_baseURL("http://www.test.com/")
     {
-        // We cannot reuse FrameTestHelpers::createWebViewAndLoad here because the compositing
-        // settings need to be set before the page is loaded.
-        m_mainFrame = WebFrame::create(&m_mockWebFrameClient);
-        m_webViewImpl = toWebViewImpl(WebView::create(&m_mockWebViewClient));
-        m_webViewImpl->settings()->setJavaScriptEnabled(true);
-        m_webViewImpl->settings()->setForceCompositingMode(true);
-        m_webViewImpl->settings()->setAcceleratedCompositingEnabled(true);
-        m_webViewImpl->settings()->setAcceleratedCompositingForFixedPositionEnabled(true);
-        m_webViewImpl->settings()->setAcceleratedCompositingForOverflowScrollEnabled(true);
-        m_webViewImpl->settings()->setAcceleratedCompositingForScrollableFramesEnabled(true);
-        m_webViewImpl->settings()->setCompositedScrollingForFramesEnabled(true);
-        m_webViewImpl->settings()->setFixedPositionCreatesStackingContext(true);
-        m_webViewImpl->setMainFrame(m_mainFrame);
-        m_webViewImpl->resize(IntSize(320, 240));
+        m_helper.initialize(true, 0, &m_mockWebViewClient, &configureSettings);
+        webViewImpl()->resize(IntSize(320, 240));
     }
 
     virtual ~ScrollingCoordinatorChromiumTest()
     {
         Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
-        m_webViewImpl->close();
-        m_mainFrame->close();
     }
 
     void navigateTo(const std::string& url)
     {
-        FrameTestHelpers::loadFrame(m_webViewImpl->mainFrame(), url);
-        Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+        FrameTestHelpers::loadFrame(webViewImpl()->mainFrame(), url);
     }
 
     void forceFullCompositingUpdate()
     {
-        RenderLayerCompositor* compositor = m_webViewImpl->mainFrameImpl()->frame()->contentRenderer()->compositor();
-        compositor->updateCompositingLayers(CompositingUpdateFinishAllDeferredWork);
+        webViewImpl()->layout();
     }
 
     void registerMockedHttpURLLoad(const std::string& fileName)
@@ -116,7 +80,7 @@ public:
 
     WebLayer* getRootScrollLayer()
     {
-        RenderLayerCompositor* compositor = m_webViewImpl->mainFrameImpl()->frame()->contentRenderer()->compositor();
+        RenderLayerCompositor* compositor = frame()->contentRenderer()->compositor();
         ASSERT(compositor);
         ASSERT(compositor->scrollLayer());
 
@@ -124,12 +88,27 @@ public:
         return webScrollLayer;
     }
 
+    WebViewImpl* webViewImpl() const { return m_helper.webViewImpl(); }
+    LocalFrame* frame() const { return m_helper.webViewImpl()->mainFrameImpl()->frame(); }
+
 protected:
     std::string m_baseURL;
-    MockWebFrameClient m_mockWebFrameClient;
-    FakeWebViewClient m_mockWebViewClient;
-    WebViewImpl* m_webViewImpl;
-    WebFrame* m_mainFrame;
+    FrameTestHelpers::TestWebViewClient m_mockWebViewClient;
+
+private:
+    static void configureSettings(WebSettings* settings)
+    {
+        settings->setJavaScriptEnabled(true);
+        settings->setAcceleratedCompositingEnabled(true);
+        settings->setPreferCompositingToLCDTextEnabled(true);
+    }
+
+    FrameTestHelpers::WebViewHelper m_helper;
+};
+
+class GraphicsLayerForScrollTesting : public GraphicsLayer {
+public:
+    virtual WebLayer* contentsLayer() const { return GraphicsLayer::contentsLayer(); }
 };
 
 TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
@@ -138,8 +117,8 @@ TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
     forceFullCompositingUpdate();
 
     // Make sure the scrolling coordinator is active.
-    FrameView* frameView = m_webViewImpl->mainFrameImpl()->frameView();
-    Page* page = m_webViewImpl->mainFrameImpl()->frame()->page();
+    FrameView* frameView = frame()->view();
+    Page* page = frame()->page();
     ASSERT_TRUE(page->scrollingCoordinator());
     ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
 
@@ -150,6 +129,24 @@ TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
     ASSERT_FALSE(rootScrollLayer->haveWheelEventHandlers());
 }
 
+TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingCanBeDisabledWithSetting)
+{
+    navigateTo("about:blank");
+    webViewImpl()->settings()->setThreadedScrollingEnabled(false);
+    forceFullCompositingUpdate();
+
+    // Make sure the scrolling coordinator is active.
+    FrameView* frameView = frame()->view();
+    Page* page = frame()->page();
+    ASSERT_TRUE(page->scrollingCoordinator());
+    ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
+
+    // Main scrolling should be enabled with the setting override.
+    WebLayer* rootScrollLayer = getRootScrollLayer();
+    ASSERT_TRUE(rootScrollLayer->scrollable());
+    ASSERT_TRUE(rootScrollLayer->shouldScrollOnMainThread());
+}
+
 static WebLayer* webLayerFromElement(Element* element)
 {
     if (!element)
@@ -160,9 +157,9 @@ static WebLayer* webLayerFromElement(Element* element)
     RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
     if (!layer)
         return 0;
-    CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMapping();
-    if (!compositedLayerMapping)
+    if (!layer->hasCompositedLayerMapping())
         return 0;
+    CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMapping();
     GraphicsLayer* graphicsLayer = compositedLayerMapping->mainGraphicsLayer();
     if (!graphicsLayer)
         return 0;
@@ -179,7 +176,7 @@ TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingForFixedPosition)
     WebLayer* rootScrollLayer = getRootScrollLayer();
     ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
 
-    Document* document = m_webViewImpl->mainFrameImpl()->frame()->document();
+    Document* document = frame()->document();
     {
         Element* element = document->getElementById("div-tl");
         ASSERT_TRUE(element);
@@ -254,27 +251,35 @@ TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingForFixedPosition)
     }
 }
 
-TEST_F(ScrollingCoordinatorChromiumTest, nonFastScrollableRegion)
+TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
 {
-    registerMockedHttpURLLoad("non-fast-scrollable.html");
-    navigateTo(m_baseURL + "non-fast-scrollable.html");
+    registerMockedHttpURLLoad("wheel-event-handler.html");
+    navigateTo(m_baseURL + "wheel-event-handler.html");
     forceFullCompositingUpdate();
 
     WebLayer* rootScrollLayer = getRootScrollLayer();
-    WebVector<WebRect> nonFastScrollableRegion = rootScrollLayer->nonFastScrollableRegion();
-
-    ASSERT_EQ(1u, nonFastScrollableRegion.size());
-    ASSERT_EQ(WebRect(8, 8, 10, 10), nonFastScrollableRegion[0]);
+    ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
 }
 
-TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
+TEST_F(ScrollingCoordinatorChromiumTest, scrollEventHandler)
 {
-    registerMockedHttpURLLoad("wheel-event-handler.html");
-    navigateTo(m_baseURL + "wheel-event-handler.html");
+    registerMockedHttpURLLoad("scroll-event-handler.html");
+    navigateTo(m_baseURL + "scroll-event-handler.html");
     forceFullCompositingUpdate();
 
     WebLayer* rootScrollLayer = getRootScrollLayer();
-    ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
+    ASSERT_TRUE(rootScrollLayer->haveScrollEventHandlers());
+}
+
+TEST_F(ScrollingCoordinatorChromiumTest, updateEventHandlersDuringTeardown)
+{
+    registerMockedHttpURLLoad("scroll-event-handler-window.html");
+    navigateTo(m_baseURL + "scroll-event-handler-window.html");
+    forceFullCompositingUpdate();
+
+    // Simulate detaching the document from its DOM window. This should not
+    // cause a crash when the WebViewImpl is closed by the test runner.
+    frame()->document()->prepareForDestruction();
 }
 
 TEST_F(ScrollingCoordinatorChromiumTest, clippedBodyTest)
@@ -295,7 +300,7 @@ TEST_F(ScrollingCoordinatorChromiumTest, overflowScrolling)
 
     // Verify the properties of the accelerated scrolling element starting from the RenderObject
     // all the way to the WebLayer.
-    Element* scrollableElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+    Element* scrollableElement = frame()->document()->getElementById("scrollable");
     ASSERT(scrollableElement);
 
     RenderObject* renderer = scrollableElement->renderer();
@@ -335,7 +340,7 @@ TEST_F(ScrollingCoordinatorChromiumTest, overflowHidden)
 
     // Verify the properties of the accelerated scrolling element starting from the RenderObject
     // all the way to the WebLayer.
-    Element* overflowElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("unscrollable-y");
+    Element* overflowElement = frame()->document()->getElementById("unscrollable-y");
     ASSERT(overflowElement);
 
     RenderObject* renderer = overflowElement->renderer();
@@ -358,7 +363,7 @@ TEST_F(ScrollingCoordinatorChromiumTest, overflowHidden)
     ASSERT_TRUE(webScrollLayer->userScrollableHorizontal());
     ASSERT_FALSE(webScrollLayer->userScrollableVertical());
 
-    overflowElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("unscrollable-x");
+    overflowElement = frame()->document()->getElementById("unscrollable-x");
     ASSERT(overflowElement);
 
     renderer = overflowElement->renderer();
@@ -391,19 +396,19 @@ TEST_F(ScrollingCoordinatorChromiumTest, iframeScrolling)
 
     // Verify the properties of the accelerated scrolling element starting from the RenderObject
     // all the way to the WebLayer.
-    Element* scrollableFrame = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+    Element* scrollableFrame = frame()->document()->getElementById("scrollable");
     ASSERT_TRUE(scrollableFrame);
 
     RenderObject* renderer = scrollableFrame->renderer();
     ASSERT_TRUE(renderer);
-    ASSERT_TRUE(renderer->isWidget());
+    ASSERT_TRUE(renderer->isRenderPart());
 
-    RenderWidget* renderWidget = toRenderWidget(renderer);
-    ASSERT_TRUE(renderWidget);
-    ASSERT_TRUE(renderWidget->widget());
-    ASSERT_TRUE(renderWidget->widget()->isFrameView());
+    RenderPart* renderPart = toRenderPart(renderer);
+    ASSERT_TRUE(renderPart);
+    ASSERT_TRUE(renderPart->widget());
+    ASSERT_TRUE(renderPart->widget()->isFrameView());
 
-    FrameView* innerFrameView = toFrameView(renderWidget->widget());
+    FrameView* innerFrameView = toFrameView(renderPart->widget());
     RenderView* innerRenderView = innerFrameView->renderView();
     ASSERT_TRUE(innerRenderView);
 
@@ -435,19 +440,19 @@ TEST_F(ScrollingCoordinatorChromiumTest, rtlIframe)
 
     // Verify the properties of the accelerated scrolling element starting from the RenderObject
     // all the way to the WebLayer.
-    Element* scrollableFrame = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+    Element* scrollableFrame = frame()->document()->getElementById("scrollable");
     ASSERT_TRUE(scrollableFrame);
 
     RenderObject* renderer = scrollableFrame->renderer();
     ASSERT_TRUE(renderer);
-    ASSERT_TRUE(renderer->isWidget());
+    ASSERT_TRUE(renderer->isRenderPart());
 
-    RenderWidget* renderWidget = toRenderWidget(renderer);
-    ASSERT_TRUE(renderWidget);
-    ASSERT_TRUE(renderWidget->widget());
-    ASSERT_TRUE(renderWidget->widget()->isFrameView());
+    RenderPart* renderPart = toRenderPart(renderer);
+    ASSERT_TRUE(renderPart);
+    ASSERT_TRUE(renderPart->widget());
+    ASSERT_TRUE(renderPart->widget()->isFrameView());
 
-    FrameView* innerFrameView = toFrameView(renderWidget->widget());
+    FrameView* innerFrameView = toFrameView(renderPart->widget());
     RenderView* innerRenderView = innerFrameView->renderView();
     ASSERT_TRUE(innerRenderView);
 
@@ -462,8 +467,7 @@ TEST_F(ScrollingCoordinatorChromiumTest, rtlIframe)
     ASSERT_TRUE(webScrollLayer->scrollable());
 
     int expectedScrollPosition = 958 + (innerFrameView->verticalScrollbar()->isOverlayScrollbar() ? 0 : 15);
-    ASSERT_EQ(expectedScrollPosition, webScrollLayer->scrollPosition().x);
-    ASSERT_EQ(expectedScrollPosition, webScrollLayer->maxScrollPosition().width);
+    ASSERT_EQ(expectedScrollPosition, webScrollLayer->scrollPositionDouble().x);
 }
 
 TEST_F(ScrollingCoordinatorChromiumTest, setupScrollbarLayerShouldNotCrash)
@@ -475,4 +479,32 @@ TEST_F(ScrollingCoordinatorChromiumTest, setupScrollbarLayerShouldNotCrash)
     // an empty document by javascript.
 }
 
+#if OS(MACOSX)
+TEST_F(ScrollingCoordinatorChromiumTest, DISABLED_setupScrollbarLayerShouldSetScrollLayerOpaque)
+#else
+TEST_F(ScrollingCoordinatorChromiumTest, setupScrollbarLayerShouldSetScrollLayerOpaque)
+#endif
+{
+    registerMockedHttpURLLoad("wide_document.html");
+    navigateTo(m_baseURL + "wide_document.html");
+    forceFullCompositingUpdate();
+
+    FrameView* frameView = frame()->view();
+    ASSERT_TRUE(frameView);
+
+    GraphicsLayerForScrollTesting* scrollbarGraphicsLayer = static_cast<GraphicsLayerForScrollTesting*>(frameView->layerForHorizontalScrollbar());
+    ASSERT_TRUE(scrollbarGraphicsLayer);
+
+    WebLayer* platformLayer = scrollbarGraphicsLayer->platformLayer();
+    ASSERT_TRUE(platformLayer);
+
+    WebLayer* contentsLayer = scrollbarGraphicsLayer->contentsLayer();
+    ASSERT_TRUE(contentsLayer);
+
+    // After scrollableAreaScrollbarLayerDidChange,
+    // if the main frame's scrollbarLayer is opaque,
+    // contentsLayer should be opaque too.
+    ASSERT_EQ(platformLayer->opaque(), contentsLayer->opaque());
+}
+
 } // namespace