[chromium] Wire up scrollable sublayers in ScrollingCoordinatorChromium
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Sep 2012 17:25:42 +0000 (17:25 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Sep 2012 17:25:42 +0000 (17:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=95679

Patch by Sami Kyostila <skyostil@chromium.org> on 2012-09-05
Reviewed by James Robinson.

Source/Platform:

Introduce WebLayerScrollClient for getting notified about scroll events targeting a WebLayer.

* Platform.gypi:
* chromium/public/WebLayer.h:
(WebKit):
(WebLayer):
* chromium/public/WebLayerScrollClient.h:

Source/WebCore:

Implement scrollable sublayers in ScrollingCoordinatorChromium and introduce a
WebLayerScrollClient which is notified of scroll events on its associated
scroll layer. GraphicsLayerChromium uses it to apply scroll events targeted to
its platform layer to a ScrollableArea, i.e., the RenderLayer corresponding to
the scrollable element.

Tests: GraphicsLayerChromiumTest.applyScrollToScrollableArea
       WebLayerTest.ScrollClient

* platform/graphics/chromium/GraphicsLayerChromium.cpp:
(WebCore::GraphicsLayerChromium::GraphicsLayerChromium):
(WebCore::GraphicsLayerChromium::didScroll):
(WebCore):
* platform/graphics/chromium/GraphicsLayerChromium.h:
(WebCore):
(WebCore::GraphicsLayerChromium::setScrollableArea):
(WebCore::GraphicsLayerChromium::scrollableArea):
(GraphicsLayerChromium):
* platform/graphics/chromium/LayerChromium.cpp:
* platform/graphics/chromium/LayerChromium.h:
(WebKit):
(WebCore):
(WebCore::LayerChromium::setLayerScrollClient):
(LayerChromium):

Source/WebKit/chromium:

Introduce WebLayerScrollClient for getting notified about scroll events targeting a WebLayer.

* src/WebLayerImpl.cpp:
(WebKit::WebLayerImpl::setMaxScrollPosition):
(WebKit):
(WebKit::WebLayerImpl::setScrollClient):
(WebKit::WebLayerImpl::scrollBy):
* src/WebLayerImpl.h:
(WebLayerImpl):
* tests/CCLayerTreeHostTest.cpp:
* tests/GraphicsLayerChromiumTest.cpp:
(MockScrollableArea):
(WebKit):
(WebKit::TEST_F):
* tests/WebLayerTest.cpp:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@127605 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
Source/Platform/ChangeLog
Source/Platform/Platform.gypi
Source/Platform/chromium/public/WebLayer.h
Source/Platform/chromium/public/WebLayerScrollClient.h [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp
Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp
Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.h
Source/WebCore/platform/graphics/chromium/LayerChromium.cpp
Source/WebCore/platform/graphics/chromium/LayerChromium.h
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/WebLayerImpl.cpp
Source/WebKit/chromium/src/WebLayerImpl.h
Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp
Source/WebKit/chromium/tests/GraphicsLayerChromiumTest.cpp
Source/WebKit/chromium/tests/WebLayerTest.cpp

index 049a400..eb33a37 100644 (file)
@@ -1,3 +1,18 @@
+2012-09-05  Sami Kyostila  <skyostil@chromium.org>
+
+        [chromium] Wire up scrollable sublayers in ScrollingCoordinatorChromium
+        https://bugs.webkit.org/show_bug.cgi?id=95679
+
+        Reviewed by James Robinson.
+
+        Introduce WebLayerScrollClient for getting notified about scroll events targeting a WebLayer.
+
+        * Platform.gypi:
+        * chromium/public/WebLayer.h:
+        (WebKit):
+        (WebLayer):
+        * chromium/public/WebLayerScrollClient.h:
+
 2012-09-04  Kenichi Ishibashi  <bashi@chromium.org>
 
         [Chromium] Attempt to fix build failure on Win
index baeb944..dce153a 100644 (file)
@@ -79,6 +79,7 @@
             'chromium/public/WebImageLayer.h',
             'chromium/public/WebIOSurfaceLayer.h',
             'chromium/public/WebLayer.h',
+            'chromium/public/WebLayerScrollClient.h',
             'chromium/public/WebLayerTreeView.h',
             'chromium/public/WebLayerTreeViewClient.h',
             'chromium/public/WebLocalizedString.h',
index 9bdeb4c..1bff7ef 100644 (file)
@@ -40,6 +40,7 @@ class SkMatrix44;
 namespace WebKit {
 class WebAnimationDelegate;
 class WebFilterOperations;
+class WebLayerScrollClient;
 class WebTransformationMatrix;
 struct WebFloatPoint;
 struct WebFloatRect;
@@ -165,6 +166,9 @@ public:
 
     // Scrolling
     virtual void setScrollPosition(WebPoint) = 0;
+    virtual WebPoint scrollPosition() const = 0;
+
+    virtual void setMaxScrollPosition(WebSize) = 0;
     virtual void setScrollable(bool) = 0;
     virtual void setHaveWheelEventHandlers(bool) = 0;
     virtual void setShouldScrollOnMainThread(bool) = 0;
@@ -172,6 +176,13 @@ public:
     virtual void setIsContainerForFixedPositionLayers(bool) = 0;
     virtual void setFixedToContainerLayer(bool) = 0;
 
+    // The scroll client is notified when the scroll position of the WebLayer
+    // changes. Only a single scroll client can be set for a WebLayer at a time.
+    // The WebLayer does not take ownership of the scroll client, and it is the
+    // responsibility of the client to reset the layer's scroll client before
+    // deleting the scroll client.
+    virtual void setScrollClient(WebLayerScrollClient*) = 0;
+
     // Forces this layer to use a render surface. There is no benefit in doing
     // so, but this is to facilitate benchmarks and tests.
     virtual void setForceRenderSurface(bool) = 0;
diff --git a/Source/Platform/chromium/public/WebLayerScrollClient.h b/Source/Platform/chromium/public/WebLayerScrollClient.h
new file mode 100644 (file)
index 0000000..8504a34
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebLayerScrollClient_h
+#define WebLayerScrollClient_h
+
+namespace WebKit {
+
+// A client that is notified of scrolling on a WebLayer.
+class WebLayerScrollClient {
+public:
+    virtual void didScroll() = 0;
+protected:
+    virtual ~WebLayerScrollClient() { }
+};
+
+} // namespace WebKit
+
+#endif // WebLayerScrollClient_h
index 7aeafa7..7421815 100644 (file)
@@ -1,3 +1,35 @@
+2012-09-05  Sami Kyostila  <skyostil@chromium.org>
+
+        [chromium] Wire up scrollable sublayers in ScrollingCoordinatorChromium
+        https://bugs.webkit.org/show_bug.cgi?id=95679
+
+        Reviewed by James Robinson.
+
+        Implement scrollable sublayers in ScrollingCoordinatorChromium and introduce a
+        WebLayerScrollClient which is notified of scroll events on its associated
+        scroll layer. GraphicsLayerChromium uses it to apply scroll events targeted to
+        its platform layer to a ScrollableArea, i.e., the RenderLayer corresponding to
+        the scrollable element.
+
+        Tests: GraphicsLayerChromiumTest.applyScrollToScrollableArea
+               WebLayerTest.ScrollClient
+
+        * platform/graphics/chromium/GraphicsLayerChromium.cpp:
+        (WebCore::GraphicsLayerChromium::GraphicsLayerChromium):
+        (WebCore::GraphicsLayerChromium::didScroll):
+        (WebCore):
+        * platform/graphics/chromium/GraphicsLayerChromium.h:
+        (WebCore):
+        (WebCore::GraphicsLayerChromium::setScrollableArea):
+        (WebCore::GraphicsLayerChromium::scrollableArea):
+        (GraphicsLayerChromium):
+        * platform/graphics/chromium/LayerChromium.cpp:
+        * platform/graphics/chromium/LayerChromium.h:
+        (WebKit):
+        (WebCore):
+        (WebCore::LayerChromium::setLayerScrollClient):
+        (LayerChromium):
+
 2012-09-05  Peter Rybin  <peter.rybin@gmail.com>
 
         Web Inspector: CodeGeneratorInspector.py: support asynchronous command implementation
index bc79aa8..2f55bef 100644 (file)
@@ -246,9 +246,18 @@ void ScrollingCoordinator::setLayerIsFixedToContainerLayer(GraphicsLayer* layer,
         scrollableLayer->setFixedToContainerLayer(enable);
 }
 
-void ScrollingCoordinator::scrollableAreaScrollLayerDidChange(ScrollableArea*, GraphicsLayer*)
+void ScrollingCoordinator::scrollableAreaScrollLayerDidChange(ScrollableArea* scrollableArea, GraphicsLayer* scrollLayer)
 {
-    // FIXME: Implement.
+    if (!scrollLayer)
+        return;
+    GraphicsLayerChromium* layer = static_cast<GraphicsLayerChromium*>(scrollLayer);
+    layer->setScrollableArea(scrollableArea);
+
+    if (WebLayer* webLayer = scrollLayer->platformLayer()) {
+        webLayer->setScrollable(true);
+        webLayer->setScrollPosition(scrollableArea->scrollPosition());
+        webLayer->setMaxScrollPosition(IntSize(scrollableArea->scrollSize(HorizontalScrollbar), scrollableArea->scrollSize(VerticalScrollbar)));
+    }
 }
 
 }
index a18a3f9..0d7289e 100644 (file)
@@ -54,6 +54,7 @@
 #include "NativeImageSkia.h"
 #include "PlatformContextSkia.h"
 #include "PlatformString.h"
+#include "ScrollableArea.h"
 #include "SkMatrix44.h"
 #include "SystemTime.h"
 #include <public/Platform.h>
@@ -90,6 +91,7 @@ GraphicsLayerChromium::GraphicsLayerChromium(GraphicsLayerClient* client)
     , m_contentsLayerHasBackgroundColor(false)
     , m_inSetChildren(false)
     , m_pageScaleChanged(false)
+    , m_scrollableArea(0)
 {
     m_opaqueRectTrackingContentLayerDelegate = adoptPtr(new OpaqueRectTrackingContentLayerDelegate(this));
 
@@ -99,6 +101,7 @@ GraphicsLayerChromium::GraphicsLayerChromium(GraphicsLayerClient* client)
         m_layer = adoptPtr(WebContentLayer::create(m_opaqueRectTrackingContentLayerDelegate.get()));
 
     m_layer->layer()->setDrawsContent(m_drawsContent && m_contentsVisible);
+    m_layer->layer()->setScrollClient(this);
     if (client)
         deviceOrPageScaleFactorChanged();
     updateDebugIndicators();
@@ -907,6 +910,12 @@ void GraphicsLayerChromium::notifyAnimationFinished(double)
     // Do nothing.
 }
 
+void GraphicsLayerChromium::didScroll()
+{
+    if (m_scrollableArea)
+        m_scrollableArea->scrollToOffsetWithoutAnimation(IntPoint(m_layer->layer()->scrollPosition()));
+}
+
 } // namespace WebCore
 
 #endif // USE(ACCELERATED_COMPOSITING)
index ee9a39e..1b815e9 100644 (file)
 #include <public/WebContentLayer.h>
 #include <public/WebImageLayer.h>
 #include <public/WebLayer.h>
+#include <public/WebLayerScrollClient.h>
 #include <wtf/HashMap.h>
 
 namespace WebCore {
 
-class LayerChromium;
 class Path;
+class ScrollableArea;
 
 class LinkHighlightClient {
 public:
@@ -58,7 +59,7 @@ protected:
     virtual ~LinkHighlightClient() { }
 };
 
-class GraphicsLayerChromium : public GraphicsLayer, public GraphicsContextPainter, public WebKit::WebAnimationDelegate {
+class GraphicsLayerChromium : public GraphicsLayer, public GraphicsContextPainter, public WebKit::WebAnimationDelegate, public WebKit::WebLayerScrollClient {
 public:
     GraphicsLayerChromium(GraphicsLayerClient*);
     virtual ~GraphicsLayerChromium();
@@ -134,6 +135,9 @@ public:
     virtual void setDebugBorder(const Color&, float borderWidth);
     virtual void deviceOrPageScaleFactorChanged();
 
+    void setScrollableArea(ScrollableArea* scrollableArea) { m_scrollableArea = scrollableArea; }
+    ScrollableArea* scrollableArea() const { return m_scrollableArea; }
+
     // GraphicsContextPainter implementation.
     virtual void paint(GraphicsContext&, const IntRect& clip) OVERRIDE;
 
@@ -141,6 +145,9 @@ public:
     virtual void notifyAnimationStarted(double startTime) OVERRIDE;
     virtual void notifyAnimationFinished(double finishTime) OVERRIDE;
 
+    // WebLayerScrollClient implementation.
+    virtual void didScroll() OVERRIDE;
+
     WebKit::WebContentLayer* contentLayer() const { return m_layer.get(); }
 
     // Exposed for tests.
@@ -200,6 +207,8 @@ private:
 
     typedef HashMap<String, int> AnimationIdMap;
     AnimationIdMap m_animationIdMap;
+
+    ScrollableArea* m_scrollableArea;
 };
 
 } // namespace WebCore
index 4e7fa74..34a1730 100644 (file)
@@ -42,6 +42,8 @@
 #include "TextStream.h"
 
 #include <public/WebAnimationDelegate.h>
+#include <public/WebLayerScrollClient.h>
+#include <public/WebSize.h>
 
 using namespace std;
 using WebKit::WebTransformationMatrix;
@@ -91,7 +93,7 @@ LayerChromium::LayerChromium()
     , m_screenSpaceTransformIsAnimating(false)
     , m_contentsScale(1.0)
     , m_layerAnimationDelegate(0)
-    , m_layerScrollDelegate(0)
+    , m_layerScrollClient(0)
 {
     if (m_layerId < 0) {
         s_nextLayerId = 1;
@@ -395,6 +397,8 @@ void LayerChromium::setScrollPosition(const IntPoint& scrollPosition)
     if (m_scrollPosition == scrollPosition)
         return;
     m_scrollPosition = scrollPosition;
+    if (m_layerScrollClient)
+        m_layerScrollClient->didScroll();
     setNeedsCommit();
 }
 
@@ -439,13 +443,6 @@ void LayerChromium::setNonFastScrollableRegion(const Region& region)
     setNeedsCommit();
 }
 
-void LayerChromium::scrollBy(const IntSize& scrollDelta)
-{
-    setScrollPosition(scrollPosition() + scrollDelta);
-    if (m_layerScrollDelegate)
-        m_layerScrollDelegate->didScroll(scrollDelta);
-}
-
 void LayerChromium::setDrawCheckerboardForMissingTiles(bool checkerboard)
 {
     if (m_drawCheckerboardForMissingTiles == checkerboard)
index 2e541ee..9761e7c 100644 (file)
@@ -54,6 +54,7 @@
 
 namespace WebKit {
 class WebAnimationDelegate;
+class WebLayerScrollClient;
 }
 
 namespace WebCore {
@@ -68,15 +69,6 @@ class ScrollbarLayerChromium;
 struct CCAnimationEvent;
 struct CCRenderingStats;
 
-// Delegate for handling scroll input for a LayerChromium.
-class LayerChromiumScrollDelegate {
-public:
-    virtual void didScroll(const IntSize&) = 0;
-
-protected:
-    virtual ~LayerChromiumScrollDelegate() { }
-};
-
 // Base class for composited layers. Special layer types are derived from
 // this class.
 class LayerChromium : public RefCounted<LayerChromium>, public CCLayerAnimationControllerClient {
@@ -175,8 +167,7 @@ public:
     const Region& nonFastScrollableRegion() { return m_nonFastScrollableRegion; }
     void setNonFastScrollableRegion(const Region&);
     void setNonFastScrollableRegionChanged() { m_nonFastScrollableRegionChanged = true; }
-    void setLayerScrollDelegate(LayerChromiumScrollDelegate* layerScrollDelegate) { m_layerScrollDelegate = layerScrollDelegate; }
-    void scrollBy(const IntSize&);
+    void setLayerScrollClient(WebKit::WebLayerScrollClient* layerScrollClient) { m_layerScrollClient = layerScrollClient; }
 
     void setDrawCheckerboardForMissingTiles(bool);
     bool drawCheckerboardForMissingTiles() const { return m_drawCheckerboardForMissingTiles; }
@@ -396,7 +387,7 @@ private:
     float m_contentsScale;
 
     WebKit::WebAnimationDelegate* m_layerAnimationDelegate;
-    LayerChromiumScrollDelegate* m_layerScrollDelegate;
+    WebKit::WebLayerScrollClient* m_layerScrollClient;
 };
 
 void sortLayers(Vector<RefPtr<LayerChromium> >::iterator, Vector<RefPtr<LayerChromium> >::iterator, void*);
index 08474a1..4026ee8 100644 (file)
@@ -658,7 +658,7 @@ void CCLayerTreeHost::applyScrollAndScale(const CCScrollAndScaleSet& info)
         if (layer == rootScrollLayer)
             rootScrollDelta += info.scrolls[i].scrollDelta;
         else
-            layer->scrollBy(info.scrolls[i].scrollDelta);
+            layer->setScrollPosition(layer->scrollPosition() + info.scrolls[i].scrollDelta);
     }
     if (!rootScrollDelta.isZero() || info.pageScaleDelta != 1)
         m_client->applyScrollAndScale(rootScrollDelta, info.pageScaleDelta);
index 55ee641..1b4bf4f 100644 (file)
@@ -1,3 +1,26 @@
+2012-09-05  Sami Kyostila  <skyostil@chromium.org>
+
+        [chromium] Wire up scrollable sublayers in ScrollingCoordinatorChromium
+        https://bugs.webkit.org/show_bug.cgi?id=95679
+
+        Reviewed by James Robinson.
+
+        Introduce WebLayerScrollClient for getting notified about scroll events targeting a WebLayer.
+
+        * src/WebLayerImpl.cpp:
+        (WebKit::WebLayerImpl::setMaxScrollPosition):
+        (WebKit):
+        (WebKit::WebLayerImpl::setScrollClient):
+        (WebKit::WebLayerImpl::scrollBy):
+        * src/WebLayerImpl.h:
+        (WebLayerImpl):
+        * tests/CCLayerTreeHostTest.cpp:
+        * tests/GraphicsLayerChromiumTest.cpp:
+        (MockScrollableArea):
+        (WebKit):
+        (WebKit::TEST_F):
+        * tests/WebLayerTest.cpp:
+
 2012-09-05  Ilya Tikhonovsky  <loislo@chromium.org>
 
         Web Inspector: NMI: extract MemoryObjectType constants from MemoryInstrumentation.
index 3a316df..85f9b4d 100644 (file)
@@ -355,6 +355,16 @@ void WebLayerImpl::setScrollPosition(WebPoint position)
     m_layer->setScrollPosition(position);
 }
 
+WebPoint WebLayerImpl::scrollPosition() const
+{
+    return m_layer->scrollPosition();
+}
+
+void WebLayerImpl::setMaxScrollPosition(WebSize maxScrollPosition)
+{
+    m_layer->setMaxScrollPosition(maxScrollPosition);
+}
+
 void WebLayerImpl::setScrollable(bool scrollable)
 {
     m_layer->setScrollable(scrollable);
@@ -391,6 +401,11 @@ void WebLayerImpl::setFixedToContainerLayer(bool enable)
     m_layer->setFixedToContainerLayer(enable);
 }
 
+void WebLayerImpl::setScrollClient(WebLayerScrollClient* scrollClient)
+{
+    m_layer->setLayerScrollClient(scrollClient);
+}
+
 LayerChromium* WebLayerImpl::layer() const
 {
     return m_layer.get();
index e34addc..6739fd5 100644 (file)
@@ -94,12 +94,15 @@ public:
     virtual void transferAnimationsTo(WebLayer*) OVERRIDE;
     virtual void setForceRenderSurface(bool) OVERRIDE;
     virtual void setScrollPosition(WebPoint) OVERRIDE;
+    virtual WebPoint scrollPosition() const OVERRIDE;
+    virtual void setMaxScrollPosition(WebSize) OVERRIDE;
     virtual void setScrollable(bool) OVERRIDE;
     virtual void setHaveWheelEventHandlers(bool) OVERRIDE;
     virtual void setShouldScrollOnMainThread(bool) OVERRIDE;
     virtual void setNonFastScrollableRegion(const WebVector<WebRect>&) OVERRIDE;
     virtual void setIsContainerForFixedPositionLayers(bool) OVERRIDE;
     virtual void setFixedToContainerLayer(bool) OVERRIDE;
+    virtual void setScrollClient(WebLayerScrollClient*) OVERRIDE;
 
     WebCore::LayerChromium* layer() const;
 
index 596eeca..5219302 100644 (file)
@@ -41,6 +41,8 @@
 #include "FakeWebCompositorOutputSurface.h"
 #include <gmock/gmock.h>
 #include <public/Platform.h>
+#include <public/WebLayerScrollClient.h>
+#include <public/WebSize.h>
 #include <wtf/MainThread.h>
 #include <wtf/OwnArrayPtr.h>
 
@@ -2212,7 +2214,7 @@ private:
 
 SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestLayerAddedWithAnimation)
 
-class CCLayerTreeHostTestScrollChildLayer : public CCLayerTreeHostTest, public LayerChromiumScrollDelegate {
+class CCLayerTreeHostTestScrollChildLayer : public CCLayerTreeHostTest, public WebLayerScrollClient {
 public:
     CCLayerTreeHostTestScrollChildLayer()
         : m_scrollAmount(2, 1)
@@ -2235,7 +2237,7 @@ public:
         m_rootScrollLayer->setMaxScrollPosition(IntSize(100, 100));
         m_layerTreeHost->rootLayer()->addChild(m_rootScrollLayer);
         m_childLayer = ContentLayerChromium::create(&m_mockDelegate);
-        m_childLayer->setLayerScrollDelegate(this);
+        m_childLayer->setLayerScrollClient(this);
         m_childLayer->setBounds(IntSize(50, 50));
         m_childLayer->setIsDrawable(true);
         m_childLayer->setScrollable(true);
@@ -2248,9 +2250,9 @@ public:
         postSetNeedsCommitToMainThread();
     }
 
-    virtual void didScroll(const IntSize& scrollDelta) OVERRIDE
+    virtual void didScroll() OVERRIDE
     {
-        m_reportedScrollAmount = scrollDelta;
+        m_finalScrollPosition = m_childLayer->scrollPosition();
     }
 
     virtual void applyScrollAndScale(const IntSize& scrollDelta, float) OVERRIDE
@@ -2280,12 +2282,12 @@ public:
 
     virtual void afterTest() OVERRIDE
     {
-        EXPECT_EQ(m_scrollAmount, m_reportedScrollAmount);
+        EXPECT_EQ(IntPoint(m_scrollAmount), m_finalScrollPosition);
     }
 
 private:
     const IntSize m_scrollAmount;
-    IntSize m_reportedScrollAmount;
+    IntPoint m_finalScrollPosition;
     MockContentLayerChromiumClient m_mockDelegate;
     RefPtr<LayerChromium> m_childLayer;
     RefPtr<LayerChromium> m_rootScrollLayer;
index 9e2fbcb..43dd7ae 100644 (file)
@@ -33,6 +33,7 @@
 #include "GraphicsLayer.h"
 #include "Matrix3DTransformOperation.h"
 #include "RotateTransformOperation.h"
+#include "ScrollableArea.h"
 #include "TranslateTransformOperation.h"
 #include "WebLayerTreeViewTestCommon.h"
 #include <gtest/gtest.h>
@@ -126,4 +127,38 @@ TEST_F(GraphicsLayerChromiumTest, shouldStartWithCorrectContentsScale)
     EXPECT_EQ(2, m_graphicsLayer->contentsScale());
 }
 
+class FakeScrollableArea : public ScrollableArea {
+public:
+    virtual bool isActive() const OVERRIDE { return false; }
+    virtual int scrollSize(ScrollbarOrientation) const OVERRIDE { return 0; }
+    virtual int scrollPosition(Scrollbar*) const OVERRIDE { return 0; }
+    virtual bool isScrollCornerVisible() const OVERRIDE { return false; }
+    virtual IntRect scrollCornerRect() const OVERRIDE { return IntRect(); }
+    virtual int visibleWidth() const OVERRIDE { return 0; }
+    virtual int visibleHeight() const OVERRIDE { return 0; }
+    virtual IntSize contentsSize() const OVERRIDE { return IntSize(); }
+    virtual bool isOnActivePage() const OVERRIDE { return false; }
+    virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE { return 0; }
+    virtual IntRect scrollableAreaBoundingBox() const OVERRIDE { return IntRect(); }
+    virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE { }
+    virtual void invalidateScrollCornerRect(const IntRect&) OVERRIDE { }
+
+    virtual void setScrollOffset(const IntPoint& scrollOffset) OVERRIDE { m_scrollPosition = scrollOffset; }
+    virtual IntPoint scrollPosition() const OVERRIDE { return m_scrollPosition; }
+
+private:
+    IntPoint m_scrollPosition;
+};
+
+TEST_F(GraphicsLayerChromiumTest, applyScrollToScrollableArea)
+{
+    FakeScrollableArea scrollableArea;
+    m_graphicsLayer->setScrollableArea(&scrollableArea);
+
+    WebPoint scrollPosition(7, 9);
+    m_platformLayer->setScrollPosition(scrollPosition);
+
+    EXPECT_EQ(scrollPosition, WebPoint(scrollableArea.scrollPosition()));
+}
+
 } // namespace
index 80a1031..7732edf 100644 (file)
@@ -34,6 +34,7 @@
 #include <public/WebExternalTextureLayer.h>
 #include <public/WebFloatPoint.h>
 #include <public/WebFloatRect.h>
+#include <public/WebLayerScrollClient.h>
 #include <public/WebLayerTreeView.h>
 #include <public/WebLayerTreeViewClient.h>
 #include <public/WebRect.h>
@@ -172,4 +173,28 @@ TEST_F(WebLayerTest, Client)
     EXPECT_FALSE(contentLayer->layer()->drawsContent());
 }
 
+class MockScrollClient : public WebLayerScrollClient {
+public:
+    MOCK_METHOD0(didScroll, void());
+};
+
+TEST_F(WebLayerTest, notifyScrollClient)
+{
+    MockScrollClient scrollClient;
+
+    EXPECT_CALL(scrollClient, didScroll()).Times(0);
+    m_rootLayer->setScrollClient(&scrollClient);
+    Mock::VerifyAndClearExpectations(&scrollClient);
+
+    EXPECT_CALL(scrollClient, didScroll()).Times(1);
+    m_rootLayer->setScrollPosition(WebPoint(14, 19));
+    Mock::VerifyAndClearExpectations(&scrollClient);
+
+    EXPECT_CALL(scrollClient, didScroll()).Times(0);
+    m_rootLayer->setScrollPosition(WebPoint(14, 19));
+    Mock::VerifyAndClearExpectations(&scrollClient);
+
+    m_rootLayer->setScrollClient(0);
+}
+
 }