- Revision
- 101785
- Author
- [email protected]
- Date
- 2011-12-02 04:34:42 -0800 (Fri, 02 Dec 2011)
Log Message
[chromium] Make CCInputHandler scrolling stateful
https://bugs.webkit.org/show_bug.cgi?id=73345
This change makes the scrolling part of CCInputHandler stateful by
replacing scrollRootLayer() with scrollBegin(), scrollBy() and
scrollEnd(). This is done in preparation for scrollable sublayers.
Specifically, scrollBegin() will allow CCLayerTreeHostImpl to perform
input event hit testing to find the layer to be scrolled.
Patch by Sami Kyostila <[email protected]> on 2011-12-02
Reviewed by Steve Block.
Source/WebCore:
Tested in CCLayerTreeHostImplTest.
* platform/graphics/chromium/cc/CCInputHandler.h:
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::CCLayerTreeHostImpl):
(WebCore::CCLayerTreeHostImpl::currentTimeMs):
(WebCore::CCLayerTreeHostImpl::setNeedsRedraw):
(WebCore::findInnermostScrollableLayerAtPoint):
(WebCore::CCLayerTreeHostImpl::scrollBegin):
(WebCore::CCLayerTreeHostImpl::scrollBy):
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
Source/WebKit/chromium:
* src/WebCompositorImpl.cpp:
(WebKit::WebCompositorImpl::handleInputEvent):
* tests/CCLayerTreeHostImplTest.cpp:
(WebKit::TEST_F):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (101784 => 101785)
--- trunk/Source/WebCore/ChangeLog 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebCore/ChangeLog 2011-12-02 12:34:42 UTC (rev 101785)
@@ -1,3 +1,28 @@
+2011-12-02 Sami Kyostila <[email protected]>
+
+ [chromium] Make CCInputHandler scrolling stateful
+ https://bugs.webkit.org/show_bug.cgi?id=73345
+
+ This change makes the scrolling part of CCInputHandler stateful by
+ replacing scrollRootLayer() with scrollBegin(), scrollBy() and
+ scrollEnd(). This is done in preparation for scrollable sublayers.
+ Specifically, scrollBegin() will allow CCLayerTreeHostImpl to perform
+ input event hit testing to find the layer to be scrolled.
+
+ Reviewed by Steve Block.
+
+ Tested in CCLayerTreeHostImplTest.
+
+ * platform/graphics/chromium/cc/CCInputHandler.h:
+ * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+ (WebCore::CCLayerTreeHostImpl::CCLayerTreeHostImpl):
+ (WebCore::CCLayerTreeHostImpl::currentTimeMs):
+ (WebCore::CCLayerTreeHostImpl::setNeedsRedraw):
+ (WebCore::findInnermostScrollableLayerAtPoint):
+ (WebCore::CCLayerTreeHostImpl::scrollBegin):
+ (WebCore::CCLayerTreeHostImpl::scrollBy):
+ * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
+
2011-12-02 Kentaro Hara <[email protected]>
Use the [Supplemental] IDL for webaudio attributes in Chromium
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCInputHandler.h (101784 => 101785)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCInputHandler.h 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCInputHandler.h 2011-12-02 12:34:42 UTC (rev 101785)
@@ -45,7 +45,26 @@
public:
virtual double currentTimeMs() const = 0;
virtual void setNeedsRedraw() = 0;
- virtual void scrollRootLayer(const IntSize&) = 0;
+
+ enum ScrollStatus { ScrollFailed, ScrollStarted, ScrollIgnored };
+
+ // Attempt to start scrolling a layer at a given point in window
+ // coordinates. Returns ScrollStarted if the layer at the coordinates can
+ // be scrolled, ScrollFailed if the scroll event should instead be
+ // delegated to the main thread, or ScrollIgnored if there is nothing to
+ // be scrolled at the given coordinates.
+ virtual ScrollStatus scrollBegin(const IntPoint&) = 0;
+
+ // Scroll the layer selected with scrollBegin(). If there is no room to
+ // move the layer in the requested direction, its first ancestor layer that
+ // can be scrolled will be moved instead. Should only be called if
+ // scrollBegin() returned ScrollStarted.
+ virtual void scrollBy(const IntSize&) = 0;
+
+ // Stop scrolling the layer selected with scrollBegin(). Should only be
+ // called if scrollBegin() returned ScrollStarted.
+ virtual void scrollEnd() = 0;
+
virtual bool haveWheelEventHandlers() = 0;
virtual void pinchGestureBegin() = 0;
virtual void pinchGestureUpdate(float magnifyDelta, const IntPoint& anchor) = 0;
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (101784 => 101785)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp 2011-12-02 12:34:42 UTC (rev 101785)
@@ -296,9 +296,18 @@
m_client->setNeedsRedrawOnImplThread();
}
-void CCLayerTreeHostImpl::scrollRootLayer(const IntSize& scrollDelta)
+CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::scrollBegin(const IntPoint&)
{
- TRACE_EVENT("CCLayerTreeHostImpl::scrollRootLayer", this, 0);
+ // TODO: Check for scrollable sublayers.
+ if (!m_scrollLayerImpl || !m_scrollLayerImpl->scrollable())
+ return ScrollIgnored;
+
+ return ScrollStarted;
+}
+
+void CCLayerTreeHostImpl::scrollBy(const IntSize& scrollDelta)
+{
+ TRACE_EVENT("CCLayerTreeHostImpl::scrollBy", this, 0);
if (!m_scrollLayerImpl)
return;
@@ -307,6 +316,10 @@
m_client->setNeedsRedrawOnImplThread();
}
+void CCLayerTreeHostImpl::scrollEnd()
+{
+}
+
bool CCLayerTreeHostImpl::haveWheelEventHandlers()
{
return m_haveWheelEventHandlers;
@@ -335,8 +348,8 @@
FloatSize move = prevScaleAnchor - newScaleAnchor;
- scrollRootLayer(roundedIntSize(move));
-
+ m_scrollLayerImpl->scrollBy(roundedIntSize(move));
+ m_client->setNeedsCommitOnImplThread();
m_client->setNeedsRedrawOnImplThread();
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h (101784 => 101785)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h 2011-12-02 12:34:42 UTC (rev 101785)
@@ -61,7 +61,9 @@
// CCInputHandlerTarget implementation
virtual double currentTimeMs() const;
virtual void setNeedsRedraw();
- virtual void scrollRootLayer(const IntSize&);
+ virtual CCInputHandlerClient::ScrollStatus scrollBegin(const IntPoint&);
+ virtual void scrollBy(const IntSize&);
+ virtual void scrollEnd();
virtual bool haveWheelEventHandlers();
virtual void pinchGestureBegin();
virtual void pinchGestureUpdate(float, const IntPoint&);
Modified: trunk/Source/WebKit/chromium/ChangeLog (101784 => 101785)
--- trunk/Source/WebKit/chromium/ChangeLog 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebKit/chromium/ChangeLog 2011-12-02 12:34:42 UTC (rev 101785)
@@ -1,3 +1,21 @@
+2011-12-02 Sami Kyostila <[email protected]>
+
+ [chromium] Make CCInputHandler scrolling stateful
+ https://bugs.webkit.org/show_bug.cgi?id=73345
+
+ This change makes the scrolling part of CCInputHandler stateful by
+ replacing scrollRootLayer() with scrollBegin(), scrollBy() and
+ scrollEnd(). This is done in preparation for scrollable sublayers.
+ Specifically, scrollBegin() will allow CCLayerTreeHostImpl to perform
+ input event hit testing to find the layer to be scrolled.
+
+ Reviewed by Steve Block.
+
+ * src/WebCompositorImpl.cpp:
+ (WebKit::WebCompositorImpl::handleInputEvent):
+ * tests/CCLayerTreeHostImplTest.cpp:
+ (WebKit::TEST_F):
+
2011-12-02 Pavel Feldman <[email protected]>
Web Inspector [chromium]: provisional fix for interactive ui tests
Modified: trunk/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp (101784 => 101785)
--- trunk/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp 2011-12-02 12:34:42 UTC (rev 101785)
@@ -118,9 +118,19 @@
if (event.type == WebInputEvent::MouseWheel && !m_inputHandlerClient->haveWheelEventHandlers()) {
const WebMouseWheelEvent& wheelEvent = *static_cast<const WebMouseWheelEvent*>(&event);
- m_inputHandlerClient->scrollRootLayer(IntSize(-wheelEvent.deltaX, -wheelEvent.deltaY));
- m_client->didHandleInputEvent();
- return;
+ CCInputHandlerClient::ScrollStatus scrollStatus = m_inputHandlerClient->scrollBegin(IntPoint(wheelEvent.x, wheelEvent.y));
+ switch (scrollStatus) {
+ case CCInputHandlerClient::ScrollStarted:
+ m_inputHandlerClient->scrollBy(IntSize(-wheelEvent.deltaX, -wheelEvent.deltaY));
+ m_inputHandlerClient->scrollEnd();
+ m_client->didHandleInputEvent();
+ return;
+ case CCInputHandlerClient::ScrollIgnored:
+ m_client->didNotHandleInputEvent(false /* sendToWidget */);
+ return;
+ case CCInputHandlerClient::ScrollFailed:
+ break;
+ }
}
m_client->didNotHandleInputEvent(true /* sendToWidget */);
}
Modified: trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp (101784 => 101785)
--- trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp 2011-12-02 12:34:11 UTC (rev 101784)
+++ trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp 2011-12-02 12:34:42 UTC (rev 101785)
@@ -153,7 +153,9 @@
root->setScrollPosition(IntPoint(0, 0));
root->setMaxScrollPosition(IntSize(100, 100));
m_hostImpl->setRootLayer(root);
- m_hostImpl->scrollRootLayer(IntSize(0, 10));
+ EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(0, 0)), CCInputHandlerClient::ScrollStarted);
+ m_hostImpl->scrollBy(IntSize(0, 10));
+ m_hostImpl->scrollEnd();
EXPECT_TRUE(m_didRequestRedraw);
EXPECT_TRUE(m_didRequestCommit);
}