Bug 1251915 - Ignore handling eTouchCancel events. r=roc

In my original design, I treat eTouchCancel to be like eTouchEnd for
ending a caret dragging procedure.

However when pointer events is enabled, it sents an eTouchCancel event
after the eTouchStart event whose primary usage is to be converted to
pointer events, which then cancels the normal caret dragging procedure.

Moreover, when pointer events is disabled, we don't get eTouchCancel
during a normal caret dragging scenario, so we don't really need to
handle eTouchCancel anyway.

MozReview-Commit-ID: GKju2Tp0q3Q
This commit is contained in:
Ting-Yu Lin 2016-02-29 15:51:44 +08:00
parent bf5c47a427
commit d1a7279479
2 changed files with 80 additions and 17 deletions

View File

@ -577,9 +577,8 @@ AccessibleCaretEventHub::HandleTouchEvent(WidgetTouchEvent* aEvent)
break;
case eTouchCancel:
AC_LOGV("Before eTouchCancel, state: %s", mState->Name());
rv = mState->OnRelease(this);
AC_LOGV("After eTouchCancel, state: %s, consume: %d", mState->Name(), rv);
AC_LOGV("Got eTouchCancel, state: %s", mState->Name());
// Do nothing since we don't really care eTouchCancel anyway.
break;
default:

View File

@ -168,7 +168,7 @@ public:
return Move(event);
}
static UniquePtr<WidgetEvent> CreateTouchPressEvent(nscoord aX, nscoord aY)
static UniquePtr<WidgetEvent> CreateTouchStartEvent(nscoord aX, nscoord aY)
{
return CreateTouchEvent(eTouchStart, aX, aY);
}
@ -178,11 +178,16 @@ public:
return CreateTouchEvent(eTouchMove, aX, aY);
}
static UniquePtr<WidgetEvent> CreateTouchReleaseEvent(nscoord aX, nscoord aY)
static UniquePtr<WidgetEvent> CreateTouchEndEvent(nscoord aX, nscoord aY)
{
return CreateTouchEvent(eTouchEnd, aX, aY);
}
static UniquePtr<WidgetEvent> CreateTouchCancelEvent(nscoord aX, nscoord aY)
{
return CreateTouchEvent(eTouchCancel, aX, aY);
}
static UniquePtr<WidgetEvent> CreateWheelEvent(EventMessage aMessage)
{
auto event = MakeUnique<WidgetWheelEvent>(true, aMessage, nullptr);
@ -252,7 +257,7 @@ TEST_F(AccessibleCaretEventHubTester, TestMousePressReleaseOnNoCaret)
TEST_F(AccessibleCaretEventHubTester, TestTouchPressReleaseOnNoCaret)
{
TestPressReleaseOnNoCaret(CreateTouchPressEvent, CreateTouchReleaseEvent);
TestPressReleaseOnNoCaret(CreateTouchStartEvent, CreateTouchEndEvent);
}
template <typename PressEventCreator, typename ReleaseEventCreator>
@ -284,7 +289,7 @@ TEST_F(AccessibleCaretEventHubTester, TestMousePressReleaseOnCaret)
TEST_F(AccessibleCaretEventHubTester, TestTouchPressReleaseOnCaret)
{
TestPressReleaseOnCaret(CreateTouchPressEvent, CreateTouchReleaseEvent);
TestPressReleaseOnCaret(CreateTouchStartEvent, CreateTouchEndEvent);
}
template <typename PressEventCreator, typename ReleaseEventCreator>
@ -327,8 +332,8 @@ TEST_F(AccessibleCaretEventHubTester, TestMousePressMoveReleaseOnNoCaret)
TEST_F(AccessibleCaretEventHubTester, TestTouchPressMoveReleaseOnNoCaret)
{
TestPressMoveReleaseOnNoCaret(CreateTouchPressEvent, CreateTouchMoveEvent,
CreateTouchReleaseEvent);
TestPressMoveReleaseOnNoCaret(CreateTouchStartEvent, CreateTouchMoveEvent,
CreateTouchEndEvent);
}
template <typename PressEventCreator, typename MoveEventCreator,
@ -381,8 +386,8 @@ TEST_F(AccessibleCaretEventHubTester, TestMousePressMoveReleaseOnCaret)
TEST_F(AccessibleCaretEventHubTester, TestTouchPressMoveReleaseOnCaret)
{
TestPressMoveReleaseOnCaret(CreateTouchPressEvent, CreateTouchMoveEvent,
CreateTouchReleaseEvent);
TestPressMoveReleaseOnCaret(CreateTouchStartEvent, CreateTouchMoveEvent,
CreateTouchEndEvent);
}
template <typename PressEventCreator, typename MoveEventCreator,
@ -439,6 +444,65 @@ AccessibleCaretEventHubTester::TestPressMoveReleaseOnCaret(
nsEventStatus_eConsumeNoDefault);
}
TEST_F(AccessibleCaretEventHubTester,
TestTouchStartMoveEndOnCaretWithTouchCancelIgnored)
{
nscoord x0 = 0, y0 = 0;
nscoord x1 = 100, y1 = 100;
nscoord x2 = 300, y2 = 300;
nscoord x3 = 400, y3 = 400;
{
InSequence dummy;
EXPECT_CALL(*mHub->GetMockAccessibleCaretManager(), PressCaret(_))
.WillOnce(Return(NS_OK));
EXPECT_CALL(*mHub->GetMockAccessibleCaretManager(), DragCaret(_))
.WillOnce(Return(NS_OK));
EXPECT_CALL(*mHub->GetMockAccessibleCaretManager(), ReleaseCaret())
.WillOnce(Return(NS_OK));
}
// All the eTouchCancel events should be ignored in this test.
HandleEventAndCheckState(CreateTouchStartEvent(x0, y0),
MockAccessibleCaretEventHub::PressCaretState(),
nsEventStatus_eConsumeNoDefault);
HandleEventAndCheckState(CreateTouchCancelEvent(x0, y0),
MockAccessibleCaretEventHub::PressCaretState(),
nsEventStatus_eIgnore);
// A small move with the distance between (x0, y0) and (x1, y1) below the
// tolerance value.
HandleEventAndCheckState(CreateTouchMoveEvent(x1, y1),
MockAccessibleCaretEventHub::PressCaretState(),
nsEventStatus_eConsumeNoDefault);
HandleEventAndCheckState(CreateTouchCancelEvent(x1, y1),
MockAccessibleCaretEventHub::PressCaretState(),
nsEventStatus_eIgnore);
// A large move forms a valid drag since the distance between (x0, y0) and
// (x2, y2) is above the tolerance value.
HandleEventAndCheckState(CreateTouchMoveEvent(x2, y2),
MockAccessibleCaretEventHub::DragCaretState(),
nsEventStatus_eConsumeNoDefault);
HandleEventAndCheckState(CreateTouchCancelEvent(x2, y2),
MockAccessibleCaretEventHub::DragCaretState(),
nsEventStatus_eIgnore);
HandleEventAndCheckState(CreateTouchEndEvent(x3, y3),
MockAccessibleCaretEventHub::NoActionState(),
nsEventStatus_eConsumeNoDefault);
HandleEventAndCheckState(CreateTouchCancelEvent(x3, y3),
MockAccessibleCaretEventHub::NoActionState(),
nsEventStatus_eIgnore);}
TEST_F(AccessibleCaretEventHubTester, TestMouseLongTapWithSelectWordSuccessful)
{
TestLongTapWithSelectWordSuccessful(CreateMousePressEvent,
@ -447,8 +511,8 @@ TEST_F(AccessibleCaretEventHubTester, TestMouseLongTapWithSelectWordSuccessful)
TEST_F(AccessibleCaretEventHubTester, TestTouchLongTapWithSelectWordSuccessful)
{
TestLongTapWithSelectWordSuccessful(CreateTouchPressEvent,
CreateTouchReleaseEvent);
TestLongTapWithSelectWordSuccessful(CreateTouchStartEvent,
CreateTouchEndEvent);
}
template <typename PressEventCreator, typename ReleaseEventCreator>
@ -531,8 +595,8 @@ TEST_F(AccessibleCaretEventHubTester, TestMouseLongTapWithSelectWordFailed)
TEST_F(AccessibleCaretEventHubTester, TestTouchLongTapWithSelectWordFailed)
{
TestLongTapWithSelectWordFailed(CreateTouchPressEvent,
CreateTouchReleaseEvent);
TestLongTapWithSelectWordFailed(CreateTouchStartEvent,
CreateTouchEndEvent);
}
template <typename PressEventCreator, typename ReleaseEventCreator>
@ -566,8 +630,8 @@ AccessibleCaretEventHubTester::TestLongTapWithSelectWordFailed(
TEST_F(AccessibleCaretEventHubTester, TestTouchEventDrivenAsyncPanZoomScroll)
{
TestEventDrivenAsyncPanZoomScroll(CreateTouchPressEvent, CreateTouchMoveEvent,
CreateTouchReleaseEvent);
TestEventDrivenAsyncPanZoomScroll(CreateTouchStartEvent, CreateTouchMoveEvent,
CreateTouchEndEvent);
}
TEST_F(AccessibleCaretEventHubTester, TestMouseEventDrivenAsyncPanZoomScroll)