+2012-02-08 Sadrul Habib Chowdhury <sadrul@chromium.org>
+
+ Add support for pinch gesture processing in the MT compositor.
+ https://bugs.webkit.org/show_bug.cgi?id=77804
+
+ Reviewed by James Robinson.
+
+ * public/WebInputEvent.h:
+ * src/WebCompositorInputHandlerImpl.cpp:
+ (WebKit::WebCompositorInputHandlerImpl::WebCompositorInputHandlerImpl):
+ (WebKit::WebCompositorInputHandlerImpl::handleInputEvent):
+ * src/WebCompositorInputHandlerImpl.h:
+ (WebCompositorInputHandlerImpl):
+ * src/WebInputEventConversion.cpp:
+ (WebKit::PlatformGestureEventBuilder::PlatformGestureEventBuilder):
+ * src/WebPopupMenuImpl.cpp:
+ (WebKit::WebPopupMenuImpl::handleInputEvent):
+ * src/WebViewImpl.cpp:
+ (WebKit::WebViewImpl::handleInputEvent):
+ * tests/WebCompositorInputHandlerImplTest.cpp:
+
2012-02-08 Nico Weber <nicolasweber@gmx.de>
[chromium] Make dependency on Accelerate.framework explicit.
, m_inputHandlerClient(inputHandlerClient)
#ifndef NDEBUG
, m_expectScrollUpdateEnd(false)
+ , m_expectPinchUpdateEnd(false)
#endif
, m_scrollStarted(false)
{
m_scrollStarted = false;
return;
}
+ } else if (event.type == WebInputEvent::GesturePinchBegin) {
+ ASSERT(!m_expectPinchUpdateEnd);
+#ifndef NDEBUG
+ m_expectPinchUpdateEnd = true;
+#endif
+ m_inputHandlerClient->pinchGestureBegin();
+ m_client->didHandleInputEvent();
+ return;
+ } else if (event.type == WebInputEvent::GesturePinchEnd) {
+ ASSERT(m_expectPinchUpdateEnd);
+#ifndef NDEBUG
+ m_expectPinchUpdateEnd = false;
+#endif
+ m_inputHandlerClient->pinchGestureEnd();
+ m_client->didHandleInputEvent();
+ return;
+ } else if (event.type == WebInputEvent::GesturePinchUpdate) {
+ ASSERT(m_expectPinchUpdateEnd);
+ const WebGestureEvent& gestureEvent = *static_cast<const WebGestureEvent*>(&event);
+ m_inputHandlerClient->pinchGestureUpdate(gestureEvent.deltaX, IntPoint(gestureEvent.x, gestureEvent.y));
+ m_client->didHandleInputEvent();
+ return;
}
m_client->didNotHandleInputEvent(true /* sendToWidget */);
}
public:
MockInputHandlerClient()
: m_scrollStatus(ScrollStarted)
+ , m_pinchStarted(false)
+ , m_pinchEnded(false)
+ , m_pinchMagnification(0)
{
}
virtual ~MockInputHandlerClient() { }
void setScrollStatus(ScrollStatus status) { m_scrollStatus = status; }
+ bool pinchStarted() const { return m_pinchStarted; }
+ bool pinchEnded() const { return m_pinchEnded; }
+ float pinchMaginifcation() const { return m_pinchMagnification; }
+
+ void resetPinch()
+ {
+ m_pinchStarted = m_pinchStarted = false;
+ m_pinchMagnification = 0;
+ }
+
private:
virtual void setNeedsRedraw() OVERRIDE { }
virtual ScrollStatus scrollBegin(const WebCore::IntPoint&) OVERRIDE
virtual void scrollEnd() OVERRIDE { }
virtual bool haveWheelEventHandlers() OVERRIDE { return false; }
- virtual void pinchGestureBegin() OVERRIDE { }
- virtual void pinchGestureUpdate(float magnifyDelta, const WebCore::IntPoint& anchor) OVERRIDE { }
- virtual void pinchGestureEnd() OVERRIDE { }
+ virtual void pinchGestureBegin() OVERRIDE
+ {
+ m_pinchStarted = true;
+ }
+ virtual void pinchGestureUpdate(float magnifyDelta, const WebCore::IntPoint& anchor) OVERRIDE
+ {
+ m_pinchMagnification = magnifyDelta;
+ }
+ virtual void pinchGestureEnd() OVERRIDE
+ {
+ m_pinchEnded = true;
+ }
virtual void startPageScaleAnimation(const WebCore::IntSize& targetPosition,
bool anchorPoint,
float pageScale,
double durationMs) OVERRIDE { }
ScrollStatus m_scrollStatus;
+ bool m_pinchStarted;
+ bool m_pinchEnded;
+ float m_pinchMagnification;
};
class MockWebCompositorInputHandlerClient : public WebKit::WebCompositorInputHandlerClient {
WebKit::WebCompositor::shutdown();
}
+TEST(WebCompositorInputHandlerImpl, gesturePinch)
+{
+ WebKit::WebCompositor::initialize(0);
+#ifndef NDEBUG
+ // WebCompositorInputHandler APIs can only be called from the compositor thread.
+ WebCore::DebugScopedSetImplThread alwaysImplThread;
+#endif
+
+ MockInputHandlerClient mockInputHandler;
+ OwnPtr<WebCompositorInputHandlerImpl> inputHandler = WebCompositorInputHandlerImpl::create(&mockInputHandler);
+ MockWebCompositorInputHandlerClient mockClient;
+ inputHandler->setClient(&mockClient);
+
+ WebKit::WebGestureEvent gesture;
+
+ gesture.type = WebKit::WebInputEvent::GesturePinchBegin;
+ inputHandler->handleInputEvent(gesture);
+ EXPECT_TRUE(mockClient.handled());
+ EXPECT_FALSE(mockClient.sendToWidget());
+ EXPECT_TRUE(mockInputHandler.pinchStarted());
+ mockClient.reset();
+ mockInputHandler.resetPinch();
+
+ gesture.type = WebKit::WebInputEvent::GesturePinchUpdate;
+ gesture.deltaX = 1.5;
+ inputHandler->handleInputEvent(gesture);
+ EXPECT_TRUE(mockClient.handled());
+ EXPECT_FALSE(mockClient.sendToWidget());
+ EXPECT_FALSE(mockInputHandler.pinchEnded());
+ EXPECT_EQ(1.5, mockInputHandler.pinchMaginifcation());
+ mockClient.reset();
+ mockInputHandler.resetPinch();
+
+ gesture.type = WebKit::WebInputEvent::GesturePinchUpdate;
+ gesture.deltaX = 0.5;
+ inputHandler->handleInputEvent(gesture);
+ EXPECT_TRUE(mockClient.handled());
+ EXPECT_FALSE(mockClient.sendToWidget());
+ EXPECT_FALSE(mockInputHandler.pinchEnded());
+ EXPECT_EQ(0.5, mockInputHandler.pinchMaginifcation());
+ mockClient.reset();
+ mockInputHandler.resetPinch();
+
+ gesture.type = WebKit::WebInputEvent::GesturePinchEnd;
+ inputHandler->handleInputEvent(gesture);
+ EXPECT_TRUE(mockClient.handled());
+ EXPECT_FALSE(mockClient.sendToWidget());
+ EXPECT_TRUE(mockInputHandler.pinchEnded());
+ mockClient.reset();
+ mockInputHandler.resetPinch();
+
+ inputHandler->setClient(0);
+
+ WebKit::WebCompositor::shutdown();
+}
+
}