diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index 635bb48e9aab..5bf0e77dfda2 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -571,8 +571,6 @@ nsresult EventStateManager::PreHandleEvent(nsPresContext* aPresContext, } } - PointerEventHandler::UpdateActivePointerState(mouseEvent, aTargetContent); - switch (aEvent->mMessage) { case eContextMenu: if (sIsPointerLocked) { @@ -624,6 +622,7 @@ nsresult EventStateManager::PreHandleEvent(nsPresContext* aPresContext, break; } case eMouseEnterIntoWidget: + PointerEventHandler::UpdateActivePointerState(mouseEvent, aTargetContent); // In some cases on e10s eMouseEnterIntoWidget // event was sent twice into child process of content. // (From specific widget code (sending is not permanent) and @@ -679,6 +678,8 @@ nsresult EventStateManager::PreHandleEvent(nsPresContext* aPresContext, case eMouseMove: case ePointerDown: if (aEvent->mMessage == ePointerDown) { + PointerEventHandler::UpdateActivePointerState(mouseEvent, + aTargetContent); PointerEventHandler::ImplicitlyCapturePointer(aTargetFrame, aEvent); if (mouseEvent->mInputSource != MouseEvent_Binding::MOZ_SOURCE_TOUCH) { NotifyTargetUserActivation(aEvent, aTargetContent); @@ -3411,6 +3412,7 @@ nsresult EventStateManager::PostHandleEvent(nsPresContext* aPresContext, // Implicitly releasing capture for given pointer. ePointerLostCapture // should be send after ePointerUp or ePointerCancel. PointerEventHandler::ImplicitlyReleasePointerCapture(pointerEvent); + PointerEventHandler::UpdateActivePointerState(pointerEvent); if (pointerEvent->mMessage == ePointerCancel || pointerEvent->mInputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH) { @@ -3812,6 +3814,10 @@ nsresult EventStateManager::PostHandleEvent(nsPresContext* aPresContext, } break; + case eMouseExitFromWidget: + PointerEventHandler::UpdateActivePointerState(aEvent->AsMouseEvent()); + break; + #ifdef XP_MACOSX case eMouseActivate: if (mCurrentTarget) { diff --git a/dom/events/PointerEventHandler.cpp b/dom/events/PointerEventHandler.cpp index 17a2ca0623dd..22067928d1c8 100644 --- a/dom/events/PointerEventHandler.cpp +++ b/dom/events/PointerEventHandler.cpp @@ -122,6 +122,7 @@ void PointerEventHandler::UpdateActivePointerState(WidgetMouseEvent* aEvent, sActivePointersIds->Remove(aEvent->pointerId); break; default: + MOZ_ASSERT_UNREACHABLE("event has invalid type"); break; } } diff --git a/dom/events/PointerEventHandler.h b/dom/events/PointerEventHandler.h index 2eccf4bb219d..8fc630ff0fcf 100644 --- a/dom/events/PointerEventHandler.h +++ b/dom/events/PointerEventHandler.h @@ -73,7 +73,7 @@ class PointerEventHandler final { // Called in ESM::PreHandleEvent to update current active pointers in a hash // table. static void UpdateActivePointerState(WidgetMouseEvent* aEvent, - nsIContent* aTargetContent); + nsIContent* aTargetContent = nullptr); // Request/release pointer capture of the specified pointer by the element. static void RequestPointerCaptureById(uint32_t aPointerId, diff --git a/testing/web-platform/meta/pointerevents/pointerevent_releasepointercapture_pointerup_touch.html.ini b/testing/web-platform/meta/pointerevents/pointerevent_releasepointercapture_pointerup_touch.html.ini new file mode 100644 index 000000000000..a52c875b55bf --- /dev/null +++ b/testing/web-platform/meta/pointerevents/pointerevent_releasepointercapture_pointerup_touch.html.ini @@ -0,0 +1,3 @@ +[pointerevent_releasepointercapture_pointerup_touch.html] + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1543337 + expected: ERROR diff --git a/testing/web-platform/meta/pointerevents/pointerevent_setpointercapture_pointerup_touch.html.ini b/testing/web-platform/meta/pointerevents/pointerevent_setpointercapture_pointerup_touch.html.ini new file mode 100644 index 000000000000..d444361f23c9 --- /dev/null +++ b/testing/web-platform/meta/pointerevents/pointerevent_setpointercapture_pointerup_touch.html.ini @@ -0,0 +1,3 @@ +[pointerevent_setpointercapture_pointerup_touch.html] + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1543337 + expected: ERROR diff --git a/testing/web-platform/tests/pointerevents/pointerevent_releasepointercapture_pointerup_mouse.html b/testing/web-platform/tests/pointerevents/pointerevent_releasepointercapture_pointerup_mouse.html new file mode 100644 index 000000000000..bdb64e502ff7 --- /dev/null +++ b/testing/web-platform/tests/pointerevents/pointerevent_releasepointercapture_pointerup_mouse.html @@ -0,0 +1,103 @@ + + + + releasePointerCapture on pointerup + + + + + + + + + + +

Pointer Events Capture Test - releasePointerCapture on pointerup

+

+ Test Description: This test checks if releasePointerCapture works properly. Complete the following actions: +
    +
  1. Press and hold left mouse button over "Set Capture" button +
  2. Release left mouse button anywhere over the document +
+

+ Test passes if the proper behavior of the events is observed. +
+
+ + +

Pointer Events Capture Test

+
+

Test complete: Scroll to Summary to view Pass/Fail Results.

+

The following pointer types were detected: .

+

The following events were logged: .

+
+
+ + diff --git a/testing/web-platform/tests/pointerevents/pointerevent_releasepointercapture_pointerup_touch.html b/testing/web-platform/tests/pointerevents/pointerevent_releasepointercapture_pointerup_touch.html new file mode 100644 index 000000000000..ce730492b45a --- /dev/null +++ b/testing/web-platform/tests/pointerevents/pointerevent_releasepointercapture_pointerup_touch.html @@ -0,0 +1,102 @@ + + + + releasePointerCapture on pointerup + + + + + + + + + + +

Pointer Events Capture Test - releasePointerCapture on pointerup

+

+ Test Description: This test checks if releaseCapture works properly on pointer up. Complete the following actions: +
    +
  1. Touch black rectangle and do not release your touch +
  2. Move and release your touch anywhere over the document +
+

+ Test passes if the proper behavior of the events is observed. +
+ + +

Pointer Events Capture Test

+
+

Test complete: Scroll to Summary to view Pass/Fail Results.

+

The following pointer types were detected: .

+

The following events were logged: .

+
+
+ + diff --git a/testing/web-platform/tests/pointerevents/pointerevent_setpointercapture_pointerup_mouse.html b/testing/web-platform/tests/pointerevents/pointerevent_setpointercapture_pointerup_mouse.html new file mode 100644 index 000000000000..31079d56cec4 --- /dev/null +++ b/testing/web-platform/tests/pointerevents/pointerevent_setpointercapture_pointerup_mouse.html @@ -0,0 +1,99 @@ + + + + setPointerCapture on pointerup + + + + + + + + + + +

Pointer Events Capture Test - setPointerCapture on pointerup

+

+ Test Description: This test checks if setPointerCapture works properly. Complete the following actions: +
    +
  1. Press and hold left mouse button over black rectangle +
  2. Release left mouse button +
+

+ Test passes if the proper behavior of the events is observed. +
+
+ +

Pointer Events Capture Test

+
+

Test complete: Scroll to Summary to view Pass/Fail Results.

+

The following pointer types were detected: .

+

The following events were logged: .

+
+
+ + diff --git a/testing/web-platform/tests/pointerevents/pointerevent_setpointercapture_pointerup_touch.html b/testing/web-platform/tests/pointerevents/pointerevent_setpointercapture_pointerup_touch.html new file mode 100644 index 000000000000..8122251a71c3 --- /dev/null +++ b/testing/web-platform/tests/pointerevents/pointerevent_setpointercapture_pointerup_touch.html @@ -0,0 +1,102 @@ + + + + setPointerCapture on pointerup + + + + + + + + + + +

Pointer Events Capture Test - setPointerCapture on pointerup

+

+ Test Description: This test checks if releaseCapture works properly on pointer up. Complete the following actions: +
    +
  1. Touch black rectangle +
  2. Release your touch +
+

+ Test passes if the proper behavior of the events is observed. +
+ + +

Pointer Events Capture Test

+
+

Test complete: Scroll to Summary to view Pass/Fail Results.

+

The following pointer types were detected: .

+

The following events were logged: .

+
+
+ +