From c650e7620fea3905e00e0479d012acbba62c0d5e Mon Sep 17 00:00:00 2001 From: Oleg Romashin Date: Wed, 26 Feb 2014 13:37:30 -0800 Subject: [PATCH] Bug 974177 - PointerCancel must trigger PointerOut event. r=smaug --HG-- extra : rebase_source : cd88e856cbae08f21aed564899195f9697053f3a --- dom/events/nsEventStateManager.cpp | 6 ++++++ layout/base/tests/bug970964_inner.html | 30 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/dom/events/nsEventStateManager.cpp b/dom/events/nsEventStateManager.cpp index a695d201dde..d504fdbaac8 100644 --- a/dom/events/nsEventStateManager.cpp +++ b/dom/events/nsEventStateManager.cpp @@ -1094,6 +1094,11 @@ nsEventStateManager::PreHandleEvent(nsPresContext* aPresContext, } break; } + case NS_POINTER_CANCEL: + { + GenerateMouseEnterExit(mouseEvent); + break; + } case NS_MOUSE_EXIT: // If the event is not a top-level window exit, then it's not // really an exit --- we may have traversed widget boundaries but @@ -4440,6 +4445,7 @@ nsEventStateManager::GenerateMouseEnterExit(WidgetMouseEvent* aMouseEvent) } break; case NS_POINTER_LEAVE: + case NS_POINTER_CANCEL: case NS_MOUSE_EXIT: { // This is actually the window mouse exit or pointer leave event. We're not moving diff --git a/layout/base/tests/bug970964_inner.html b/layout/base/tests/bug970964_inner.html index 0b44dd0004a..24c3e1625e4 100644 --- a/layout/base/tests/bug970964_inner.html +++ b/layout/base/tests/bug970964_inner.html @@ -263,6 +263,36 @@ function runTests() { }; sendTouchEvent(cwu, "touchmove", getTouchEventForTarget(d1, cwu, 2), 0); + // Test for cancel trigger pointerOut (Touch Pointer must be at d1 now) + pointerCancelTriggered = 0; + var pointerOutTriggeredForCancelEvent = 0; + var pointerLeaveTriggeredForCancelEvent = 0; + d1.onpointerout = function(e) { + if (pointerOutTriggeredForCancelEvent == 0) { + is(e.pointerId, 3, "Wrong Pointer type, should be id from Touch event"); + is(e.pointerType, "touch", "Wrong Pointer type, should be touch type"); + } else { + is(e.pointerId, 0, "Wrong Pointer type, should be id from mouse event"); + is(e.pointerType, "mouse", "Wrong Pointer type, should be mouse type"); + } + pointerOutTriggeredForCancelEvent = 1; + }; + d1.onpointerleave = function(e) { + is(pointerOutTriggeredForCancelEvent, 1, "Pointer Out must be dispatched bedore Pointer leave"); + if (pointerLeaveTriggeredForCancelEvent == 0) { + is(e.pointerId, 3, "Wrong Pointer type, should be id from Touch event"); + is(e.pointerType, "touch", "Wrong Pointer type, should be touch type"); + } else { + is(e.pointerId, 0, "Wrong Pointer type, should be id from mouse event"); + is(e.pointerType, "mouse", "Wrong Pointer type, should be mouse type"); + } + pointerLeaveTriggeredForCancelEvent = 1; + } + + sendTouchEvent(cwu, "touchcancel", getTouchEventForTarget(d1, cwu, 3), 0); + is(pointerOutTriggeredForCancelEvent, 1, "Pointer Out not dispatched on PointerCancel"); + is(pointerLeaveTriggeredForCancelEvent, 1, "Pointer Leave not dispatched on PointerCancel"); + finishTest(); }