| Index: Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp
|
| ===================================================================
|
| --- Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp (revision 112613)
|
| +++ Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp (working copy)
|
| @@ -33,13 +33,14 @@
|
| #include "cc/CCActiveGestureAnimation.h"
|
| #include "cc/CCInputHandler.h"
|
| #include "cc/CCSingleThreadProxy.h"
|
| +#include "platform/WebFloatPoint.h"
|
| +#include "platform/WebPoint.h"
|
|
|
| #include <gmock/gmock.h>
|
| #include <gtest/gtest.h>
|
| #include <wtf/OwnPtr.h>
|
|
|
| -using WebKit::WebCompositorInputHandler;
|
| -using WebKit::WebCompositorInputHandlerImpl;
|
| +using namespace WebKit;
|
|
|
| namespace {
|
|
|
| @@ -73,11 +74,11 @@
|
| virtual void setActiveGestureAnimation(PassOwnPtr<WebCore::CCActiveGestureAnimation>) OVERRIDE { }
|
| };
|
|
|
| -class MockWebCompositorInputHandlerClient : public WebKit::WebCompositorInputHandlerClient {
|
| +class MockWebCompositorInputHandlerClient : public WebCompositorInputHandlerClient {
|
| WTF_MAKE_NONCOPYABLE(MockWebCompositorInputHandlerClient);
|
| public:
|
| MockWebCompositorInputHandlerClient()
|
| - : WebKit::WebCompositorInputHandlerClient()
|
| + : WebCompositorInputHandlerClient()
|
| {
|
| }
|
| virtual ~MockWebCompositorInputHandlerClient() { }
|
| @@ -85,11 +86,14 @@
|
| MOCK_METHOD0(willShutdown, void());
|
| MOCK_METHOD0(didHandleInputEvent, void());
|
| MOCK_METHOD1(didNotHandleInputEvent, void(bool sendToWidget));
|
| +
|
| + MOCK_METHOD1(transferActiveWheelFlingAnimation, void(const WebActiveWheelFlingParameters&));
|
| +
|
| };
|
|
|
| TEST(WebCompositorInputHandlerImpl, fromIdentifier)
|
| {
|
| - WebKit::WebCompositor::initialize(0);
|
| + WebCompositor::initialize(0);
|
| WebCore::DebugScopedSetImplThread alwaysImplThread;
|
|
|
| // Before creating any WebCompositorInputHandlers, lookups for any value should fail and not crash.
|
| @@ -110,7 +114,7 @@
|
|
|
| // After the compositor is destroyed, its entry should be removed from the map.
|
| EXPECT_EQ(0, WebCompositorInputHandler::fromIdentifier(compositorIdentifier));
|
| - WebKit::WebCompositor::shutdown();
|
| + WebCompositor::shutdown();
|
| }
|
|
|
| class WebCompositorInputHandlerImplTest : public testing::Test {
|
| @@ -118,7 +122,7 @@
|
| WebCompositorInputHandlerImplTest()
|
| : m_expectedDisposition(DidHandle)
|
| {
|
| - WebKit::WebCompositor::initialize(0);
|
| + WebCompositor::initialize(0);
|
| m_inputHandler = WebCompositorInputHandlerImpl::create(&m_mockCCInputHandlerClient);
|
| m_inputHandler->setClient(&m_mockClient);
|
| }
|
| @@ -127,39 +131,41 @@
|
| {
|
| m_inputHandler->setClient(0);
|
| m_inputHandler.clear();
|
| - WebKit::WebCompositor::shutdown();
|
| + WebCompositor::shutdown();
|
| }
|
|
|
| - void verifyAndResetMocks()
|
| - {
|
| - testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| - testing::Mock::VerifyAndClearExpectations(&m_mockClient);
|
| - switch (m_expectedDisposition) {
|
| - case DidHandle:
|
| - // If we expect to handle events, we shouldn't get any didNotHandleInputEvent() calls with any parameter.
|
| - EXPECT_CALL(m_mockClient, didNotHandleInputEvent(::testing::_)).Times(0);
|
| - EXPECT_CALL(m_mockClient, didHandleInputEvent());
|
| - break;
|
| - case DidNotHandle:
|
| - // If we aren't expecting to handle events, we shouldn't call didHandleInputEvent().
|
| - EXPECT_CALL(m_mockClient, didHandleInputEvent()).Times(0);
|
| - EXPECT_CALL(m_mockClient, didNotHandleInputEvent(false)).Times(0);
|
| - EXPECT_CALL(m_mockClient, didNotHandleInputEvent(true));
|
| - break;
|
| - case DropEvent:
|
| - // If we're expecting to drop, we shouldn't get any didHandle..() or didNotHandleInputEvent(true /* sendToWidget */) calls.
|
| - EXPECT_CALL(m_mockClient, didHandleInputEvent()).Times(0);
|
| - EXPECT_CALL(m_mockClient, didNotHandleInputEvent(true)).Times(0);
|
| - EXPECT_CALL(m_mockClient, didNotHandleInputEvent(false));
|
| - break;
|
| - }
|
| - }
|
| + // This is defined as a macro because when an expectation is not satisfied the only output you get
|
| + // out of gmock is the line number that set the expectation.
|
| +#define VERIFY_AND_RESET_MOCKS() do \
|
| + { \
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient); \
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockClient); \
|
| + switch (m_expectedDisposition) { \
|
| + case DidHandle: \
|
| + /* If we expect to handle events, we shouldn't get any didNotHandleInputEvent() calls with any parameter. */ \
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(::testing::_)).Times(0); \
|
| + EXPECT_CALL(m_mockClient, didHandleInputEvent()); \
|
| + break; \
|
| + case DidNotHandle: \
|
| + /* If we aren't expecting to handle events, we shouldn't call didHandleInputEvent(). */ \
|
| + EXPECT_CALL(m_mockClient, didHandleInputEvent()).Times(0); \
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(false)).Times(0); \
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(true)); \
|
| + break; \
|
| + case DropEvent: \
|
| + /* If we're expecting to drop, we shouldn't get any didHandle..() or didNotHandleInputEvent(true) calls. */ \
|
| + EXPECT_CALL(m_mockClient, didHandleInputEvent()).Times(0); \
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(true)).Times(0); \
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(false)); \
|
| + break; \
|
| + } \
|
| + } while (0)
|
|
|
| protected:
|
| MockCCInputHandlerClient m_mockCCInputHandlerClient;
|
| OwnPtr<WebCompositorInputHandlerImpl> m_inputHandler;
|
| MockWebCompositorInputHandlerClient m_mockClient;
|
| - WebKit::WebGestureEvent gesture;
|
| + WebGestureEvent gesture;
|
|
|
| enum ExpectedDisposition { DidHandle, DidNotHandle, DropEvent };
|
| ExpectedDisposition m_expectedDisposition;
|
| @@ -173,24 +179,24 @@
|
| {
|
| // We shouldn't send any events to the widget for this gesture.
|
| m_expectedDisposition = DidHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollBegin;
|
| + gesture.type = WebInputEvent::GestureScrollBegin;
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollUpdate;
|
| + gesture.type = WebInputEvent::GestureScrollUpdate;
|
| gesture.deltaY = -40; // -Y means scroll down - i.e. in the +Y direction.
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::Property(&WebCore::IntSize::height, testing::Gt(0))));
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollEnd;
|
| + gesture.type = WebInputEvent::GestureScrollEnd;
|
| gesture.deltaY = 0;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd());
|
| m_inputHandler->handleInputEvent(gesture);
|
| @@ -200,23 +206,23 @@
|
| {
|
| // We should send all events to the widget for this gesture.
|
| m_expectedDisposition = DidNotHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(::testing::_, ::testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollFailed));
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollBegin;
|
| + gesture.type = WebInputEvent::GestureScrollBegin;
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollUpdate;
|
| + gesture.type = WebInputEvent::GestureScrollUpdate;
|
| gesture.deltaY = 40;
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollEnd;
|
| + gesture.type = WebInputEvent::GestureScrollEnd;
|
| gesture.deltaY = 0;
|
| m_inputHandler->handleInputEvent(gesture);
|
| }
|
| @@ -228,12 +234,12 @@
|
| // indicating that we could determine that there's nothing that could scroll or otherwise
|
| // react to this gesture sequence and thus we should drop the whole gesture sequence on the floor.
|
| m_expectedDisposition = DropEvent;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollIgnored));
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureScrollBegin;
|
| + gesture.type = WebInputEvent::GestureScrollBegin;
|
| m_inputHandler->handleInputEvent(gesture);
|
| }
|
|
|
| @@ -241,33 +247,33 @@
|
| {
|
| // We shouldn't send any events to the widget for this gesture.
|
| m_expectedDisposition = DidHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GesturePinchBegin;
|
| + gesture.type = WebInputEvent::GesturePinchBegin;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, pinchGestureBegin());
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GesturePinchUpdate;
|
| + gesture.type = WebInputEvent::GesturePinchUpdate;
|
| gesture.deltaX = 1.5;
|
| gesture.x = 7;
|
| gesture.y = 13;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, pinchGestureUpdate(1.5, WebCore::IntPoint(7, 13)));
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GesturePinchUpdate;
|
| + gesture.type = WebInputEvent::GesturePinchUpdate;
|
| gesture.deltaX = 0.5;
|
| gesture.x = 9;
|
| gesture.y = 6;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, pinchGestureUpdate(.5, WebCore::IntPoint(9, 6)));
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| - gesture.type = WebKit::WebInputEvent::GesturePinchEnd;
|
| + gesture.type = WebInputEvent::GesturePinchEnd;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, pinchGestureEnd());
|
| m_inputHandler->handleInputEvent(gesture);
|
| }
|
| @@ -276,20 +282,20 @@
|
| {
|
| // We shouldn't send any events to the widget for this gesture.
|
| m_expectedDisposition = DidHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingStart;
|
| + gesture.type = WebInputEvent::GestureFlingStart;
|
| gesture.deltaX = 10;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| // Verify that a GestureFlingCancel during an animation cancels it.
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingCancel;
|
| + gesture.type = WebInputEvent::GestureFlingCancel;
|
| m_inputHandler->handleInputEvent(gesture);
|
| }
|
|
|
| @@ -297,36 +303,36 @@
|
| {
|
| // We should send all events to the widget for this gesture.
|
| m_expectedDisposition = DidNotHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollFailed));
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingStart;
|
| + gesture.type = WebInputEvent::GestureFlingStart;
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| // Even if we didn't start a fling ourselves, we still need to send the cancel event to the widget.
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingCancel;
|
| + gesture.type = WebInputEvent::GestureFlingCancel;
|
| m_inputHandler->handleInputEvent(gesture);
|
| }
|
|
|
| TEST_F(WebCompositorInputHandlerImplTest, gestureFlingIgnored)
|
| {
|
| m_expectedDisposition = DidNotHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollIgnored));
|
|
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingStart;
|
| + gesture.type = WebInputEvent::GestureFlingStart;
|
| m_inputHandler->handleInputEvent(gesture);
|
|
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| // Even if we didn't start a fling ourselves, we still need to send the cancel event to the widget.
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingCancel;
|
| + gesture.type = WebInputEvent::GestureFlingCancel;
|
| m_inputHandler->handleInputEvent(gesture);
|
| }
|
|
|
| @@ -334,12 +340,22 @@
|
| {
|
| // We shouldn't send any events to the widget for this gesture.
|
| m_expectedDisposition = DidHandle;
|
| - verifyAndResetMocks();
|
| + VERIFY_AND_RESET_MOCKS();
|
|
|
| // On the fling start, we should schedule an animation but not actually start
|
| // scrolling.
|
| - gesture.type = WebKit::WebInputEvent::GestureFlingStart;
|
| - gesture.deltaX = -1000;
|
| + gesture.type = WebInputEvent::GestureFlingStart;
|
| + WebFloatPoint flingDelta = WebFloatPoint(1000, 0);
|
| + WebPoint flingPoint = WebPoint(7, 13);
|
| + WebPoint flingGlobalPoint = WebPoint(17, 23);
|
| + int modifiers = 7;
|
| + gesture.deltaX = flingDelta.x;
|
| + gesture.deltaY = flingDelta.y;
|
| + gesture.x = flingPoint.x;
|
| + gesture.y = flingPoint.y;
|
| + gesture.globalX = flingGlobalPoint.x;
|
| + gesture.globalY = flingGlobalPoint.y;
|
| + gesture.modifiers = modifiers;
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
| @@ -356,33 +372,194 @@
|
|
|
| testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
|
|
| - // The second call should start scrolling in the +X direction.
|
| + // The second call should start scrolling in the -X direction.
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
| - EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::Property(&WebCore::IntSize::width, testing::Gt(0))));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::Property(&WebCore::IntSize::width, testing::Lt(0))));
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd());
|
| m_inputHandler->animate(10.1);
|
|
|
| testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
|
|
| // Let's say on the third call we hit a non-scrollable region. We should abort the fling and not scroll.
|
| - // FIXME: We also need to do some work to transfer the rest of this fling to the main thread.
|
| - // Add tests for this once it's implemented.
|
| + // We also should pass the current fling parameters out to the client so the rest of the fling can be
|
| + // transferred to the main thread.
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollFailed));
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::_)).Times(0);
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd()).Times(0);
|
| +
|
| + // Expected wheel fling animation parameters:
|
| + // *) flingDelta and flingPoint should match the original GestureFlingStart event
|
| + // *) startTime should be 10 to match the time parameter of the first animate() call after the GestureFlingStart
|
| + // *) cumulativeScroll depends on the curve, but since we've animated in the -X direction the X value should be < 0
|
| + EXPECT_CALL(m_mockClient, transferActiveWheelFlingAnimation(testing::AllOf(
|
| + testing::Field(&WebActiveWheelFlingParameters::delta, testing::Eq(flingDelta)),
|
| + testing::Field(&WebActiveWheelFlingParameters::point, testing::Eq(flingPoint)),
|
| + testing::Field(&WebActiveWheelFlingParameters::globalPoint, testing::Eq(flingGlobalPoint)),
|
| + testing::Field(&WebActiveWheelFlingParameters::modifiers, testing::Eq(modifiers)),
|
| + testing::Field(&WebActiveWheelFlingParameters::startTime, testing::Eq(10)),
|
| + testing::Field(&WebActiveWheelFlingParameters::cumulativeScroll,
|
| + testing::Field(&WebSize::width, testing::Gt(0))))));
|
| m_inputHandler->animate(10.2);
|
|
|
| testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockClient);
|
|
|
| // Since we've aborted the fling, the next animation should be a no-op and should not result in another
|
| // frame being requested.
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation()).Times(0);
|
| EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_)).Times(0);
|
| m_inputHandler->animate(10.3);
|
| +
|
| + // Since we've transferred the fling to the main thread, we need to pass the next GestureFlingCancel to the main
|
| + // thread as well.
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(true));
|
| + gesture.type = WebInputEvent::GestureFlingCancel;
|
| + m_inputHandler->handleInputEvent(gesture);
|
| }
|
|
|
| +TEST_F(WebCompositorInputHandlerImplTest, gestureFlingTransferResets)
|
| +{
|
| + // We shouldn't send any events to the widget for this gesture.
|
| + m_expectedDisposition = DidHandle;
|
| + VERIFY_AND_RESET_MOCKS();
|
| +
|
| + // Start a gesture fling in the -X direction with zero Y movement.
|
| + gesture.type = WebInputEvent::GestureFlingStart;
|
| + WebFloatPoint flingDelta = WebFloatPoint(1000, 0);
|
| + WebPoint flingPoint = WebPoint(7, 13);
|
| + WebPoint flingGlobalPoint = WebPoint(17, 23);
|
| + int modifiers = 1;
|
| + gesture.deltaX = flingDelta.x;
|
| + gesture.deltaY = flingDelta.y;
|
| + gesture.x = flingPoint.x;
|
| + gesture.y = flingPoint.y;
|
| + gesture.globalX = flingGlobalPoint.x;
|
| + gesture.globalY = flingGlobalPoint.y;
|
| + gesture.modifiers = modifiers;
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| + .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
| + m_inputHandler->handleInputEvent(gesture);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // Start the fling animation at time 10. This shouldn't actually scroll, just establish a start time.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_)).Times(0);
|
| + m_inputHandler->animate(10);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // The second call should start scrolling in the -X direction.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| + .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::Property(&WebCore::IntSize::width, testing::Lt(0))));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd());
|
| + m_inputHandler->animate(10.1);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // Let's say on the third call we hit a non-scrollable region. We should abort the fling and not scroll.
|
| + // We also should pass the current fling parameters out to the client so the rest of the fling can be
|
| + // transferred to the main thread.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| + .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollFailed));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::_)).Times(0);
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd()).Times(0);
|
| +
|
| + // Expected wheel fling animation parameters:
|
| + // *) flingDelta and flingPoint should match the original GestureFlingStart event
|
| + // *) startTime should be 10 to match the time parameter of the first animate() call after the GestureFlingStart
|
| + // *) cumulativeScroll depends on the curve, but since we've animated in the -X direction the X value should be < 0
|
| + EXPECT_CALL(m_mockClient, transferActiveWheelFlingAnimation(testing::AllOf(
|
| + testing::Field(&WebActiveWheelFlingParameters::delta, testing::Eq(flingDelta)),
|
| + testing::Field(&WebActiveWheelFlingParameters::point, testing::Eq(flingPoint)),
|
| + testing::Field(&WebActiveWheelFlingParameters::globalPoint, testing::Eq(flingGlobalPoint)),
|
| + testing::Field(&WebActiveWheelFlingParameters::modifiers, testing::Eq(modifiers)),
|
| + testing::Field(&WebActiveWheelFlingParameters::startTime, testing::Eq(10)),
|
| + testing::Field(&WebActiveWheelFlingParameters::cumulativeScroll,
|
| + testing::Field(&WebSize::width, testing::Gt(0))))));
|
| + m_inputHandler->animate(10.2);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockClient);
|
| +
|
| + // Since we've aborted the fling, the next animation should be a no-op and should not result in another
|
| + // frame being requested.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation()).Times(0);
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_)).Times(0);
|
| + m_inputHandler->animate(10.3);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // Since we've transferred the fling to the main thread, we need to pass the next GestureFlingCancel to the main
|
| + // thread as well.
|
| + EXPECT_CALL(m_mockClient, didNotHandleInputEvent(true));
|
| + gesture.type = WebInputEvent::GestureFlingCancel;
|
| + m_inputHandler->handleInputEvent(gesture);
|
| +
|
| + VERIFY_AND_RESET_MOCKS();
|
| +
|
| + // Start a second gesture fling, this time in the +Y direction with no X.
|
| + gesture.type = WebInputEvent::GestureFlingStart;
|
| + flingDelta = WebFloatPoint(0, -1000);
|
| + flingPoint = WebPoint(95, 87);
|
| + flingGlobalPoint = WebPoint(32, 71);
|
| + modifiers = 2;
|
| + gesture.deltaX = flingDelta.x;
|
| + gesture.deltaY = flingDelta.y;
|
| + gesture.x = flingPoint.x;
|
| + gesture.y = flingPoint.y;
|
| + gesture.globalX = flingGlobalPoint.x;
|
| + gesture.globalY = flingGlobalPoint.y;
|
| + gesture.modifiers = modifiers;
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| + .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
| + m_inputHandler->handleInputEvent(gesture);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // Start the second fling animation at time 30.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_)).Times(0);
|
| + m_inputHandler->animate(30);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // Tick the second fling once normally.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| + .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollStarted));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::Property(&WebCore::IntSize::height, testing::Gt(0))));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd());
|
| + m_inputHandler->animate(30.1);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&m_mockCCInputHandlerClient);
|
| +
|
| + // Then abort the second fling.
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scheduleAnimation());
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBegin(testing::_, testing::_))
|
| + .WillOnce(testing::Return(WebCore::CCInputHandlerClient::ScrollFailed));
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollBy(testing::_)).Times(0);
|
| + EXPECT_CALL(m_mockCCInputHandlerClient, scrollEnd()).Times(0);
|
| +
|
| + // We should get parameters from the second fling, nothing from the first fling should "leak".
|
| + EXPECT_CALL(m_mockClient, transferActiveWheelFlingAnimation(testing::AllOf(
|
| + testing::Field(&WebActiveWheelFlingParameters::delta, testing::Eq(flingDelta)),
|
| + testing::Field(&WebActiveWheelFlingParameters::point, testing::Eq(flingPoint)),
|
| + testing::Field(&WebActiveWheelFlingParameters::globalPoint, testing::Eq(flingGlobalPoint)),
|
| + testing::Field(&WebActiveWheelFlingParameters::modifiers, testing::Eq(modifiers)),
|
| + testing::Field(&WebActiveWheelFlingParameters::startTime, testing::Eq(30)),
|
| + testing::Field(&WebActiveWheelFlingParameters::cumulativeScroll,
|
| + testing::Field(&WebSize::height, testing::Lt(0))))));
|
| + m_inputHandler->animate(30.2);
|
| }
|
| +
|
| +}
|
|
|