From d6a44b8e13baaf7bd2f7e3d7a5eb4f34f2307138 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Tue, 19 May 2015 16:26:02 -0400 Subject: [PATCH] Bug 1164981 - Add MouseEvent.movementX/Y. r=masayuki, r=ehsan CLOSED TREE --- dom/events/DragEvent.cpp | 1 + dom/events/MouseEvent.cpp | 18 ++++++++++++------ dom/events/MouseEvent.h | 7 +++++-- dom/events/PointerEvent.cpp | 2 +- dom/events/UIEvent.cpp | 2 +- dom/events/WheelEvent.cpp | 3 +-- dom/events/test/test_dom_mouse_event.html | 4 ++++ dom/events/test/test_eventctors.html | 17 +++++++++++++---- dom/webidl/MouseEvent.webidl | 19 ++++++++++++------- .../meta/pointerlock/constructor.html.ini | 8 -------- .../meta/pointerlock/idlharness.html.ini | 18 ------------------ 11 files changed, 50 insertions(+), 49 deletions(-) delete mode 100644 testing/web-platform/meta/pointerlock/constructor.html.ini diff --git a/dom/events/DragEvent.cpp b/dom/events/DragEvent.cpp index 3e84dc578b68e..5477ffacf1341 100644 --- a/dom/events/DragEvent.cpp +++ b/dom/events/DragEvent.cpp @@ -148,6 +148,7 @@ DragEvent::Constructor(const GlobalObject& aGlobal, aParam.mCtrlKey, aParam.mAltKey, aParam.mShiftKey, aParam.mMetaKey, aParam.mButton, aParam.mRelatedTarget, aParam.mDataTransfer); + e->InitializeExtraMouseEventDictionaryMembers(aParam); e->SetTrusted(trusted); return e.forget(); } diff --git a/dom/events/MouseEvent.cpp b/dom/events/MouseEvent.cpp index fac118f7613ca..1a25fe9aa7c4d 100644 --- a/dom/events/MouseEvent.cpp +++ b/dom/events/MouseEvent.cpp @@ -138,6 +138,15 @@ MouseEvent::InitMouseEvent(const nsAString& aType, } } +void +MouseEvent::InitializeExtraMouseEventDictionaryMembers(const MouseEventInit& aParam) +{ + InitModifiers(aParam); + mEvent->AsMouseEventBase()->buttons = aParam.mButtons; + mMovementPoint.x = aParam.mMovementX; + mMovementPoint.y = aParam.mMovementY; +} + already_AddRefed MouseEvent::Constructor(const GlobalObject& aGlobal, const nsAString& aType, @@ -153,11 +162,8 @@ MouseEvent::Constructor(const GlobalObject& aGlobal, aParam.mCtrlKey, aParam.mAltKey, aParam.mShiftKey, aParam.mMetaKey, aParam.mButton, aParam.mRelatedTarget, aRv); - e->InitModifiers(aParam); + e->InitializeExtraMouseEventDictionaryMembers(aParam); e->SetTrusted(trusted); - MOZ_RELEASE_ASSERT(e->mEvent->AsMouseEventBase(), - "mEvent of MouseEvent must inherit WidgetMouseEventBase"); - e->mEvent->AsMouseEventBase()->buttons = aParam.mButtons; return e.forget(); } @@ -305,7 +311,7 @@ NS_IMETHODIMP MouseEvent::GetMozMovementX(int32_t* aMovementX) { NS_ENSURE_ARG_POINTER(aMovementX); - *aMovementX = MozMovementX(); + *aMovementX = MovementX(); return NS_OK; } @@ -314,7 +320,7 @@ NS_IMETHODIMP MouseEvent::GetMozMovementY(int32_t* aMovementY) { NS_ENSURE_ARG_POINTER(aMovementY); - *aMovementY = MozMovementY(); + *aMovementY = MovementY(); return NS_OK; } diff --git a/dom/events/MouseEvent.h b/dom/events/MouseEvent.h index c05a5fddcdebd..c086ce2f3e273 100644 --- a/dom/events/MouseEvent.h +++ b/dom/events/MouseEvent.h @@ -69,6 +69,9 @@ class MouseEvent : public UIEvent, aShiftKey, aMetaKey, aButton, aRelatedTarget); } + + void InitializeExtraMouseEventDictionaryMembers(const MouseEventInit& aParam); + bool GetModifierState(const nsAString& aKeyArg) { return GetModifierStateInternal(aKeyArg); @@ -77,11 +80,11 @@ class MouseEvent : public UIEvent, const nsAString& aType, const MouseEventInit& aParam, ErrorResult& aRv); - int32_t MozMovementX() + int32_t MovementX() { return GetMovementPoint().x; } - int32_t MozMovementY() + int32_t MovementY() { return GetMovementPoint().y; } diff --git a/dom/events/PointerEvent.cpp b/dom/events/PointerEvent.cpp index f0943b4812d60..8a433085e572f 100644 --- a/dom/events/PointerEvent.cpp +++ b/dom/events/PointerEvent.cpp @@ -82,7 +82,7 @@ PointerEvent::Constructor(EventTarget* aOwner, aParam.mScreenY, aParam.mClientX, aParam.mClientY, false, false, false, false, aParam.mButton, aParam.mRelatedTarget); - e->InitModifiers(aParam); + e->InitializeExtraMouseEventDictionaryMembers(aParam); WidgetPointerEvent* widgetEvent = e->mEvent->AsPointerEvent(); widgetEvent->pointerId = aParam.mPointerId; diff --git a/dom/events/UIEvent.cpp b/dom/events/UIEvent.cpp index 5e3f784a3b30b..afe02da4116de 100644 --- a/dom/events/UIEvent.cpp +++ b/dom/events/UIEvent.cpp @@ -114,7 +114,7 @@ DevPixelsToCSSPixels(const LayoutDeviceIntPoint& aPoint, nsIntPoint UIEvent::GetMovementPoint() { - if (mPrivateDataDuplicated) { + if (mPrivateDataDuplicated || mEventIsInternal) { return mMovementPoint; } diff --git a/dom/events/WheelEvent.cpp b/dom/events/WheelEvent.cpp index 99e423443e9a2..4bcb43e3cc0c5 100644 --- a/dom/events/WheelEvent.cpp +++ b/dom/events/WheelEvent.cpp @@ -164,8 +164,7 @@ WheelEvent::Constructor(const GlobalObject& aGlobal, aParam.mButton, aParam.mRelatedTarget, EmptyString(), aParam.mDeltaX, aParam.mDeltaY, aParam.mDeltaZ, aParam.mDeltaMode); - e->InitModifiers(aParam); - e->mEvent->AsWheelEvent()->buttons = aParam.mButtons; + e->InitializeExtraMouseEventDictionaryMembers(aParam); e->SetTrusted(trusted); return e.forget(); } diff --git a/dom/events/test/test_dom_mouse_event.html b/dom/events/test/test_dom_mouse_event.html index 8b3f982dbe369..c728876b59516 100644 --- a/dom/events/test/test_dom_mouse_event.html +++ b/dom/events/test/test_dom_mouse_event.html @@ -107,6 +107,10 @@ } is(e.isTrusted, false, description + "isTrusted returns wrong value"); is(e.buttons, 0, description + "buttons returns wrong value"); + is(e.movementX, 0, description + "movementX returns wrong value"); + is(e.movementY, 0, description + "movementY returns wrong value"); + is(e.movementX, e.mozMovementX); + is(e.movementY, e.mozMovementY); // getModifierState() tests is(e.getModifierState("Shift"), kTest.shiftKey, diff --git a/dom/events/test/test_eventctors.html b/dom/events/test/test_eventctors.html index f41b1d31458f8..a18c2a5eddc1f 100644 --- a/dom/events/test/test_eventctors.html +++ b/dom/events/test/test_eventctors.html @@ -696,11 +696,14 @@ ok(ex, "MouseEvent: First parameter is required!"); ex = false; -e = new MouseEvent("hello"); +e = new MouseEvent("hello", { buttons: 1, movementX: 2, movementY: 3}); is(e.type, "hello", "MouseEvent: Wrong event type!"); ok(!e.isTrusted, "MouseEvent: Event shouldn't be trusted!"); ok(!e.bubbles, "MouseEvent: Event shouldn't bubble!"); ok(!e.cancelable, "MouseEvent: Event shouldn't be cancelable!"); +is(e.buttons, 1); +is(e.movementX, 2); +is(e.movementY, 3); document.dispatchEvent(e); is(receivedEvent, e, "MouseEvent: Wrong event!"); @@ -724,7 +727,7 @@ { modifierSymbolLock: false }, { button: 0 }, { buttons: 0 }, - { relatedTarget: null } + { relatedTarget: null }, ]; var testProps = @@ -811,8 +814,11 @@ ok(ex, "WheelEvent: First parameter is required!"); ex = false; -e = new WheelEvent("hello"); +e = new WheelEvent("hello", { buttons: 1, movementX: 2, movementY: 3}); is(e.type, "hello", "WheelEvent: Wrong event type!"); +is(e.buttons, 1); +is(e.movementX, 2); +is(e.movementY, 3); ok(!e.isTrusted, "WheelEvent: Event shouldn't be trusted!"); ok(!e.bubbles, "WheelEvent: Event shouldn't bubble!"); ok(!e.cancelable, "WheelEvent: Event shouldn't be cancelable!"); @@ -907,8 +913,11 @@ ok(ex, "DragEvent: First parameter is required!"); ex = false; -e = new DragEvent("hello"); +e = new DragEvent("hello", { buttons: 1, movementX: 2, movementY: 3}); is(e.type, "hello", "DragEvent: Wrong event type!"); +is(e.buttons, 1); +is(e.movementX, 2); +is(e.movementY, 3); document.dispatchEvent(e); is(receivedEvent, e, "DragEvent: Wrong event!"); diff --git a/dom/webidl/MouseEvent.webidl b/dom/webidl/MouseEvent.webidl index eb9f538bc7e3a..3e32808872763 100644 --- a/dom/webidl/MouseEvent.webidl +++ b/dom/webidl/MouseEvent.webidl @@ -10,6 +10,7 @@ * liability, trademark and document use rules apply. */ +[Constructor(DOMString typeArg, optional MouseEventInit mouseEventInitDict)] interface MouseEvent : UIEvent { readonly attribute long screenX; readonly attribute long screenY; @@ -25,6 +26,11 @@ interface MouseEvent : UIEvent { readonly attribute unsigned short buttons; readonly attribute EventTarget? relatedTarget; readonly attribute DOMString? region; + + // Pointer Lock + readonly attribute long movementX; + readonly attribute long movementY; + // Deprecated in DOM Level 3: [Throws] void initMouseEvent(DOMString typeArg, @@ -46,13 +52,6 @@ interface MouseEvent : UIEvent { boolean getModifierState(DOMString keyArg); }; - -// Event Constructor Syntax: -[Constructor(DOMString typeArg, optional MouseEventInit mouseEventInitDict)] -partial interface MouseEvent -{ -}; - // Suggested initMouseEvent replacement initializer: dictionary MouseEventInit : EventModifierInit { // Attributes for MouseEvent: @@ -64,12 +63,18 @@ dictionary MouseEventInit : EventModifierInit { // Note: "buttons" was not previously initializable through initMouseEvent! unsigned short buttons = 0; EventTarget? relatedTarget = null; + + // Pointer Lock + long movementX = 0; + long movementY = 0; }; // Mozilla extensions partial interface MouseEvent { + [BinaryName="movementX"] readonly attribute long mozMovementX; + [BinaryName="movementY"] readonly attribute long mozMovementY; // Finger or touch pressure event value diff --git a/testing/web-platform/meta/pointerlock/constructor.html.ini b/testing/web-platform/meta/pointerlock/constructor.html.ini deleted file mode 100644 index 7e3e5cfaa1b9e..0000000000000 --- a/testing/web-platform/meta/pointerlock/constructor.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[constructor.html] - type: testharness - [Default event values for mouse event interface and its pointer lock extensions.] - expected: FAIL - - [Default event values for pointerlockerror using a dictionary] - expected: FAIL - diff --git a/testing/web-platform/meta/pointerlock/idlharness.html.ini b/testing/web-platform/meta/pointerlock/idlharness.html.ini index 42455bab0a4c9..7b7769e138d86 100644 --- a/testing/web-platform/meta/pointerlock/idlharness.html.ini +++ b/testing/web-platform/meta/pointerlock/idlharness.html.ini @@ -42,21 +42,3 @@ [Document interface: window.document must inherit property "exitPointerLock" with the proper type (3)] expected: FAIL - [MouseEvent interface: attribute movementX] - expected: FAIL - - [MouseEvent interface: attribute movementY] - expected: FAIL - - [MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementX" with the proper type (0)] - expected: FAIL - - [MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementY" with the proper type (1)] - expected: FAIL - - [MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementX" with the proper type (0)] - expected: FAIL - - [MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementY" with the proper type (1)] - expected: FAIL -