1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef mozilla_MouseEvents_h__
7 #define mozilla_MouseEvents_h__
11 #include "mozilla/BasicEvents.h"
12 #include "mozilla/MathAlgorithms.h"
13 #include "mozilla/dom/DataTransfer.h"
21 class PBrowserBridgeParent
;
24 class WidgetPointerEvent
;
25 } // namespace mozilla
28 class WidgetPointerEventHolder final
{
30 nsTArray
<WidgetPointerEvent
> mEvents
;
31 NS_INLINE_DECL_REFCOUNTING(WidgetPointerEventHolder
)
34 virtual ~WidgetPointerEventHolder() = default;
37 /******************************************************************************
38 * mozilla::WidgetPointerHelper
39 ******************************************************************************/
41 class WidgetPointerHelper
{
47 float tangentialPressure
;
48 bool convertToPointer
;
49 RefPtr
<WidgetPointerEventHolder
> mCoalescedWidgetEvents
;
56 tangentialPressure(0),
57 convertToPointer(true) {}
59 WidgetPointerHelper(uint32_t aPointerId
, uint32_t aTiltX
, uint32_t aTiltY
,
60 uint32_t aTwist
= 0, float aTangentialPressure
= 0)
61 : pointerId(aPointerId
),
65 tangentialPressure(aTangentialPressure
),
66 convertToPointer(true) {}
68 explicit WidgetPointerHelper(const WidgetPointerHelper
& aHelper
) = default;
70 void AssignPointerHelperData(const WidgetPointerHelper
& aEvent
,
71 bool aCopyCoalescedEvents
= false) {
72 pointerId
= aEvent
.pointerId
;
76 tangentialPressure
= aEvent
.tangentialPressure
;
77 convertToPointer
= aEvent
.convertToPointer
;
78 if (aCopyCoalescedEvents
) {
79 mCoalescedWidgetEvents
= aEvent
.mCoalescedWidgetEvents
;
84 /******************************************************************************
85 * mozilla::WidgetMouseEventBase
86 ******************************************************************************/
88 class WidgetMouseEventBase
: public WidgetInputEvent
{
90 friend class dom::PBrowserParent
;
91 friend class dom::PBrowserChild
;
92 friend class dom::PBrowserBridgeParent
;
95 WidgetMouseEventBase()
99 mInputSource(/* MouseEvent_Binding::MOZ_SOURCE_MOUSE = */ 1) {}
100 // Including MouseEventBinding.h here leads to an include loop, so
101 // we have to hardcode MouseEvent_Binding::MOZ_SOURCE_MOUSE.
103 WidgetMouseEventBase(bool aIsTrusted
, EventMessage aMessage
,
104 nsIWidget
* aWidget
, EventClassID aEventClassID
)
105 : WidgetInputEvent(aIsTrusted
, aMessage
, aWidget
, aEventClassID
),
109 mInputSource(/* MouseEvent_Binding::MOZ_SOURCE_MOUSE = */ 1) {}
110 // Including MouseEventBinding.h here leads to an include loop, so
111 // we have to hardcode MouseEvent_Binding::MOZ_SOURCE_MOUSE.
114 virtual WidgetMouseEventBase
* AsMouseEventBase() override
{ return this; }
116 virtual WidgetEvent
* Duplicate() const override
{
117 MOZ_CRASH("WidgetMouseEventBase must not be most-subclass");
120 // ID of the canvas HitRegion
123 // Finger or touch pressure of event. It ranges between 0.0 and 1.0.
126 // Pressed button ID of mousedown or mouseup event.
127 // This is set only when pressing a button causes the event.
130 // Flags of all pressed buttons at the event fired.
131 // This is set at any mouse event, don't be confused with |mButton|.
134 // Possible values a in MouseEvent
135 uint16_t mInputSource
;
137 bool IsLeftButtonPressed() const {
138 return !!(mButtons
& MouseButtonsFlag::ePrimaryFlag
);
140 bool IsRightButtonPressed() const {
141 return !!(mButtons
& MouseButtonsFlag::eSecondaryFlag
);
143 bool IsMiddleButtonPressed() const {
144 return !!(mButtons
& MouseButtonsFlag::eMiddleFlag
);
146 bool Is4thButtonPressed() const {
147 return !!(mButtons
& MouseButtonsFlag::e4thFlag
);
149 bool Is5thButtonPressed() const {
150 return !!(mButtons
& MouseButtonsFlag::e5thFlag
);
153 void AssignMouseEventBaseData(const WidgetMouseEventBase
& aEvent
,
155 AssignInputEventData(aEvent
, aCopyTargets
);
157 mButton
= aEvent
.mButton
;
158 mButtons
= aEvent
.mButtons
;
159 mPressure
= aEvent
.mPressure
;
160 mInputSource
= aEvent
.mInputSource
;
164 * Returns true if left click event.
166 bool IsLeftClickEvent() const {
167 return mMessage
== eMouseClick
&& mButton
== MouseButton::ePrimary
;
171 /******************************************************************************
172 * mozilla::WidgetMouseEvent
173 ******************************************************************************/
175 class WidgetMouseEvent
: public WidgetMouseEventBase
,
176 public WidgetPointerHelper
{
178 friend class dom::PBrowserParent
;
179 friend class dom::PBrowserChild
;
180 friend class dom::PBrowserBridgeParent
;
183 typedef bool ReasonType
;
184 enum Reason
: ReasonType
{ eReal
, eSynthesized
};
186 typedef uint8_t ContextMenuTriggerType
;
187 enum ContextMenuTrigger
: ContextMenuTriggerType
{
193 typedef uint8_t ExitFromType
;
194 enum ExitFrom
: ExitFromType
{
198 ePuppetParentToPuppetChild
204 mContextMenuTrigger(eNormal
),
206 mIgnoreRootScrollFrame(false),
207 mUseLegacyNonPrimaryDispatch(false),
208 mClickEventPrevented(false) {}
210 WidgetMouseEvent(bool aIsTrusted
, EventMessage aMessage
, nsIWidget
* aWidget
,
211 EventClassID aEventClassID
, Reason aReason
)
212 : WidgetMouseEventBase(aIsTrusted
, aMessage
, aWidget
, aEventClassID
),
214 mContextMenuTrigger(eNormal
),
216 mIgnoreRootScrollFrame(false),
217 mUseLegacyNonPrimaryDispatch(false),
218 mClickEventPrevented(false) {}
221 void AssertContextMenuEventButtonConsistency() const;
225 virtual WidgetMouseEvent
* AsMouseEvent() override
{ return this; }
227 WidgetMouseEvent(bool aIsTrusted
, EventMessage aMessage
, nsIWidget
* aWidget
,
229 ContextMenuTrigger aContextMenuTrigger
= eNormal
)
230 : WidgetMouseEventBase(aIsTrusted
, aMessage
, aWidget
, eMouseEventClass
),
232 mContextMenuTrigger(aContextMenuTrigger
),
234 mIgnoreRootScrollFrame(false),
235 mUseLegacyNonPrimaryDispatch(false),
236 mClickEventPrevented(false) {
237 if (aMessage
== eContextMenu
) {
238 mButton
= (mContextMenuTrigger
== eNormal
) ? MouseButton::eSecondary
239 : MouseButton::ePrimary
;
244 virtual ~WidgetMouseEvent() { AssertContextMenuEventButtonConsistency(); }
247 virtual WidgetEvent
* Duplicate() const override
{
248 MOZ_ASSERT(mClass
== eMouseEventClass
,
249 "Duplicate() must be overridden by sub class");
250 // Not copying widget, it is a weak reference.
251 WidgetMouseEvent
* result
= new WidgetMouseEvent(
252 false, mMessage
, nullptr, mReason
, mContextMenuTrigger
);
253 result
->AssignMouseEventData(*this, true);
254 result
->mFlags
= mFlags
;
258 // If during mouseup handling we detect that click event might need to be
259 // dispatched, this is setup to be the target of the click event.
260 nsCOMPtr
<dom::EventTarget
> mClickTarget
;
262 // mReason indicates the reason why the event is fired:
263 // - Representing mouse operation.
264 // - Synthesized for emulating mousemove event when the content under the
265 // mouse cursor is scrolled.
268 // mContextMenuTrigger is valid only when mMessage is eContextMenu.
269 // This indicates if the context menu event is caused by context menu key or
270 // other reasons (typically, a click of right mouse button).
271 ContextMenuTrigger mContextMenuTrigger
;
273 // mExitFrom contains a value only when mMessage is eMouseExitFromWidget.
274 // This indicates if the mouse cursor exits from a top level platform widget,
275 // a child widget or a puppet widget.
276 Maybe
<ExitFrom
> mExitFrom
;
278 // mClickCount may be non-zero value when mMessage is eMouseDown, eMouseUp,
279 // eMouseClick or eMouseDoubleClick. The number is count of mouse clicks.
280 // Otherwise, this must be 0.
281 uint32_t mClickCount
;
283 // Whether the event should ignore scroll frame bounds during dispatch.
284 bool mIgnoreRootScrollFrame
;
286 // Indicates whether the event should dispatch click events for non-primary
287 // mouse buttons on window and document.
288 bool mUseLegacyNonPrimaryDispatch
;
290 // Whether the event shouldn't cause click event.
291 bool mClickEventPrevented
;
293 void AssignMouseEventData(const WidgetMouseEvent
& aEvent
, bool aCopyTargets
) {
294 AssignMouseEventBaseData(aEvent
, aCopyTargets
);
295 AssignPointerHelperData(aEvent
, /* aCopyCoalescedEvents */ true);
297 mExitFrom
= aEvent
.mExitFrom
;
298 mClickCount
= aEvent
.mClickCount
;
299 mIgnoreRootScrollFrame
= aEvent
.mIgnoreRootScrollFrame
;
300 mUseLegacyNonPrimaryDispatch
= aEvent
.mUseLegacyNonPrimaryDispatch
;
301 mClickEventPrevented
= aEvent
.mClickEventPrevented
;
305 * Returns true if the event is a context menu event caused by key.
307 bool IsContextMenuKeyEvent() const {
308 return mMessage
== eContextMenu
&& mContextMenuTrigger
== eContextMenuKey
;
312 * Returns true if the event is a real mouse event. Otherwise, i.e., it's
313 * a synthesized event by scroll or something, returns false.
315 bool IsReal() const { return mReason
== eReal
; }
318 * Returns true if middle click paste is enabled.
320 static bool IsMiddleClickPasteEnabled();
323 /******************************************************************************
324 * mozilla::WidgetDragEvent
325 ******************************************************************************/
327 class WidgetDragEvent
: public WidgetMouseEvent
{
329 friend class mozilla::dom::PBrowserParent
;
330 friend class mozilla::dom::PBrowserChild
;
334 : mUserCancelled(false), mDefaultPreventedOnContent(false) {}
337 virtual WidgetDragEvent
* AsDragEvent() override
{ return this; }
339 WidgetDragEvent(bool aIsTrusted
, EventMessage aMessage
, nsIWidget
* aWidget
)
340 : WidgetMouseEvent(aIsTrusted
, aMessage
, aWidget
, eDragEventClass
, eReal
),
341 mUserCancelled(false),
342 mDefaultPreventedOnContent(false) {}
344 virtual WidgetEvent
* Duplicate() const override
{
345 MOZ_ASSERT(mClass
== eDragEventClass
,
346 "Duplicate() must be overridden by sub class");
347 // Not copying widget, it is a weak reference.
348 WidgetDragEvent
* result
= new WidgetDragEvent(false, mMessage
, nullptr);
349 result
->AssignDragEventData(*this, true);
350 result
->mFlags
= mFlags
;
354 // The dragging data.
355 nsCOMPtr
<dom::DataTransfer
> mDataTransfer
;
357 // If this is true, user has cancelled the drag operation.
359 // If this is true, the drag event's preventDefault() is called on content.
360 bool mDefaultPreventedOnContent
;
362 // XXX Not tested by test_assign_event_data.html
363 void AssignDragEventData(const WidgetDragEvent
& aEvent
, bool aCopyTargets
) {
364 AssignMouseEventData(aEvent
, aCopyTargets
);
366 mDataTransfer
= aEvent
.mDataTransfer
;
367 // XXX mUserCancelled isn't copied, is this intentionally?
368 mUserCancelled
= false;
369 mDefaultPreventedOnContent
= aEvent
.mDefaultPreventedOnContent
;
373 * Should be called before dispatching the DOM tree if this event is
374 * synthesized for tests because drop effect is initialized before
375 * dispatching from widget if it's not synthesized event, but synthesized
376 * events are not initialized in the path.
378 void InitDropEffectForTests();
381 /******************************************************************************
382 * mozilla::WidgetMouseScrollEvent
384 * This is used for legacy DOM mouse scroll events, i.e.,
385 * DOMMouseScroll and MozMousePixelScroll event. These events are NOT hanbled
386 * by ESM even if widget dispatches them. Use new WidgetWheelEvent instead.
387 ******************************************************************************/
389 class WidgetMouseScrollEvent
: public WidgetMouseEventBase
{
391 WidgetMouseScrollEvent() : mDelta(0), mIsHorizontal(false) {}
394 virtual WidgetMouseScrollEvent
* AsMouseScrollEvent() override
{ return this; }
396 WidgetMouseScrollEvent(bool aIsTrusted
, EventMessage aMessage
,
398 : WidgetMouseEventBase(aIsTrusted
, aMessage
, aWidget
,
399 eMouseScrollEventClass
),
401 mIsHorizontal(false) {}
403 virtual WidgetEvent
* Duplicate() const override
{
404 MOZ_ASSERT(mClass
== eMouseScrollEventClass
,
405 "Duplicate() must be overridden by sub class");
406 // Not copying widget, it is a weak reference.
407 WidgetMouseScrollEvent
* result
=
408 new WidgetMouseScrollEvent(false, mMessage
, nullptr);
409 result
->AssignMouseScrollEventData(*this, true);
410 result
->mFlags
= mFlags
;
414 // The delta value of mouse scroll event.
415 // If the event message is eLegacyMouseLineOrPageScroll, the value indicates
416 // scroll amount in lines. However, if the value is
417 // UIEvent::SCROLL_PAGE_UP or UIEvent::SCROLL_PAGE_DOWN, the
418 // value inducates one page scroll. If the event message is
419 // eLegacyMousePixelScroll, the value indicates scroll amount in pixels.
422 // If this is true, it may cause to scroll horizontally.
423 // Otherwise, vertically.
426 void AssignMouseScrollEventData(const WidgetMouseScrollEvent
& aEvent
,
428 AssignMouseEventBaseData(aEvent
, aCopyTargets
);
430 mDelta
= aEvent
.mDelta
;
431 mIsHorizontal
= aEvent
.mIsHorizontal
;
435 /******************************************************************************
436 * mozilla::WidgetWheelEvent
437 ******************************************************************************/
439 class WidgetWheelEvent
: public WidgetMouseEventBase
{
441 friend class mozilla::dom::PBrowserParent
;
442 friend class mozilla::dom::PBrowserChild
;
448 mOverflowDeltaX(0.0),
450 // Including WheelEventBinding.h here leads to an include loop, so
451 // we have to hardcode WheelEvent_Binding::DOM_DELTA_PIXEL.
453 mDeltaMode(/* WheelEvent_Binding::DOM_DELTA_PIXEL = */ 0),
454 mLineOrPageDeltaX(0),
455 mLineOrPageDeltaY(0),
456 mScrollType(SCROLL_DEFAULT
),
457 mCustomizedByUserPrefs(false),
458 mMayHaveMomentum(false),
460 mIsNoLineOrPageDelta(false),
461 mViewPortIsOverscrolled(false),
462 mCanTriggerSwipe(false),
463 mAllowToOverrideSystemScrollSpeed(false),
464 mDeltaValuesHorizontalizedForDefaultHandler(false) {}
467 virtual WidgetWheelEvent
* AsWheelEvent() override
{ return this; }
469 WidgetWheelEvent(bool aIsTrusted
, EventMessage aMessage
, nsIWidget
* aWidget
)
470 : WidgetMouseEventBase(aIsTrusted
, aMessage
, aWidget
, eWheelEventClass
),
474 mOverflowDeltaX(0.0),
476 // Including WheelEventBinding.h here leads to an include loop, so
477 // we have to hardcode WheelEvent_Binding::DOM_DELTA_PIXEL.
479 mDeltaMode(/* WheelEvent_Binding::DOM_DELTA_PIXEL = */ 0),
480 mLineOrPageDeltaX(0),
481 mLineOrPageDeltaY(0),
482 mScrollType(SCROLL_DEFAULT
),
483 mCustomizedByUserPrefs(false),
484 mMayHaveMomentum(false),
486 mIsNoLineOrPageDelta(false),
487 mViewPortIsOverscrolled(false),
488 mCanTriggerSwipe(false),
489 mAllowToOverrideSystemScrollSpeed(true),
490 mDeltaValuesHorizontalizedForDefaultHandler(false) {}
492 virtual WidgetEvent
* Duplicate() const override
{
493 MOZ_ASSERT(mClass
== eWheelEventClass
,
494 "Duplicate() must be overridden by sub class");
495 // Not copying widget, it is a weak reference.
496 WidgetWheelEvent
* result
= new WidgetWheelEvent(false, mMessage
, nullptr);
497 result
->AssignWheelEventData(*this, true);
498 result
->mFlags
= mFlags
;
502 // On OS X, scroll gestures that start at the edge of the scrollable range
503 // can result in a swipe gesture. For the first wheel event of such a
504 // gesture, call TriggersSwipe() after the event has been processed
505 // in order to find out whether a swipe should be started.
506 bool TriggersSwipe() const {
507 return mCanTriggerSwipe
&& mViewPortIsOverscrolled
&&
508 this->mOverflowDeltaX
!= 0.0;
511 // NOTE: mDeltaX, mDeltaY and mDeltaZ may be customized by
512 // mousewheel.*.delta_multiplier_* prefs which are applied by
513 // EventStateManager. So, after widget dispatches this event,
514 // these delta values may have different values than before.
519 enum class DeltaModeCheckingState
: uint8_t {
520 // Neither deltaMode nor the delta values have been accessed.
522 // The delta values have been accessed, without checking deltaMode first.
524 // The deltaMode has been checked.
528 // For compat reasons, we might expose a DOM_DELTA_LINE event as
529 // DOM_DELTA_PIXEL instead. Whether we do that depends on whether the event
530 // has been asked for the deltaMode before the deltas. If it has, we assume
531 // that the page will correctly handle DOM_DELTA_LINE. This variable tracks
532 // that state. See bug 1392460.
533 DeltaModeCheckingState mDeltaModeCheckingState
=
534 DeltaModeCheckingState::Unknown
;
536 // The amount of scrolling per line or page, without accounting for mouse
537 // wheel transactions etc.
539 // Computed by EventStateManager::DeltaAccumulator::InitLineOrPageDelta.
540 nsSize mScrollAmount
;
542 // overflowed delta values for scroll, these values are set by
543 // EventStateManger. If the default action of the wheel event isn't scroll,
544 // these values are always zero. Otherwise, remaining delta values which are
545 // not used by scroll are set.
546 // NOTE: mDeltaX, mDeltaY and mDeltaZ may be modified by EventStateManager.
547 // However, mOverflowDeltaX and mOverflowDeltaY indicate unused original
548 // delta values which are not applied the delta_multiplier prefs.
549 // So, if widget wanted to know the actual direction to be scrolled,
550 // it would need to check the mDeltaX and mDeltaY.
551 double mOverflowDeltaX
;
552 double mOverflowDeltaY
;
554 // Should be one of WheelEvent_Binding::DOM_DELTA_*
557 // If widget sets mLineOrPageDelta, EventStateManager will dispatch
558 // eLegacyMouseLineOrPageScroll event for compatibility. Note that the delta
559 // value means pages if the mDeltaMode is DOM_DELTA_PAGE, otherwise, lines.
560 int32_t mLineOrPageDeltaX
;
561 int32_t mLineOrPageDeltaY
;
563 // When the default action for an wheel event is moving history or zooming,
564 // need to chose a delta value for doing it.
565 int32_t GetPreferredIntDelta() {
566 if (!mLineOrPageDeltaX
&& !mLineOrPageDeltaY
) {
569 if (mLineOrPageDeltaY
&& !mLineOrPageDeltaX
) {
570 return mLineOrPageDeltaY
;
572 if (mLineOrPageDeltaX
&& !mLineOrPageDeltaY
) {
573 return mLineOrPageDeltaX
;
575 if ((mLineOrPageDeltaX
< 0 && mLineOrPageDeltaY
> 0) ||
576 (mLineOrPageDeltaX
> 0 && mLineOrPageDeltaY
< 0)) {
577 return 0; // We cannot guess the answer in this case.
579 return (Abs(mLineOrPageDeltaX
) > Abs(mLineOrPageDeltaY
))
585 // The default value is SCROLL_DEFAULT, which means EventStateManager will
586 // select preferred scroll type automatically.
587 enum ScrollType
: uint8_t {
589 SCROLL_SYNCHRONOUSLY
,
590 SCROLL_ASYNCHRONOUSELY
,
593 ScrollType mScrollType
;
595 // If the delta values are computed from prefs, this value is true.
596 // Otherwise, i.e., they are computed from native events, false.
597 bool mCustomizedByUserPrefs
;
599 // true if the momentum events directly tied to this event may follow it.
600 bool mMayHaveMomentum
;
601 // true if the event is caused by momentum.
604 // If device event handlers don't know when they should set mLineOrPageDeltaX
605 // and mLineOrPageDeltaY, this is true. Otherwise, false.
606 // If mIsNoLineOrPageDelta is true, ESM will generate
607 // eLegacyMouseLineOrPageScroll events when accumulated delta values reach
609 bool mIsNoLineOrPageDelta
;
611 // Whether or not the parent of the currently overscrolled frame is the
612 // ViewPort. This is false in situations when an element on the page is being
613 // overscrolled (such as a text field), but true when the 'page' is being
615 bool mViewPortIsOverscrolled
;
617 // The wheel event can trigger a swipe to start if it's overscrolling the
619 bool mCanTriggerSwipe
;
621 // If mAllowToOverrideSystemScrollSpeed is true, the scroll speed may be
622 // overridden. Otherwise, the scroll speed won't be overridden even if
623 // it's enabled by the pref.
624 bool mAllowToOverrideSystemScrollSpeed
;
626 // After the event's default action handler has adjusted its delta's values
627 // for horizontalizing a vertical wheel scroll, this variable will be set to
629 bool mDeltaValuesHorizontalizedForDefaultHandler
;
631 void AssignWheelEventData(const WidgetWheelEvent
& aEvent
, bool aCopyTargets
) {
632 AssignMouseEventBaseData(aEvent
, aCopyTargets
);
634 mDeltaX
= aEvent
.mDeltaX
;
635 mDeltaY
= aEvent
.mDeltaY
;
636 mDeltaZ
= aEvent
.mDeltaZ
;
637 mDeltaMode
= aEvent
.mDeltaMode
;
638 mScrollAmount
= aEvent
.mScrollAmount
;
639 mCustomizedByUserPrefs
= aEvent
.mCustomizedByUserPrefs
;
640 mMayHaveMomentum
= aEvent
.mMayHaveMomentum
;
641 mIsMomentum
= aEvent
.mIsMomentum
;
642 mIsNoLineOrPageDelta
= aEvent
.mIsNoLineOrPageDelta
;
643 mLineOrPageDeltaX
= aEvent
.mLineOrPageDeltaX
;
644 mLineOrPageDeltaY
= aEvent
.mLineOrPageDeltaY
;
645 mScrollType
= aEvent
.mScrollType
;
646 mOverflowDeltaX
= aEvent
.mOverflowDeltaX
;
647 mOverflowDeltaY
= aEvent
.mOverflowDeltaY
;
648 mViewPortIsOverscrolled
= aEvent
.mViewPortIsOverscrolled
;
649 mCanTriggerSwipe
= aEvent
.mCanTriggerSwipe
;
650 mAllowToOverrideSystemScrollSpeed
=
651 aEvent
.mAllowToOverrideSystemScrollSpeed
;
652 mDeltaValuesHorizontalizedForDefaultHandler
=
653 aEvent
.mDeltaValuesHorizontalizedForDefaultHandler
;
656 // System scroll speed settings may be too slow at using Gecko. In such
657 // case, we should override the scroll speed computed with system settings.
658 // Following methods return preferred delta values which are multiplied by
659 // factors specified by prefs. If system scroll speed shouldn't be
660 // overridden (e.g., this feature is disabled by pref), they return raw
662 double OverriddenDeltaX() const;
663 double OverriddenDeltaY() const;
665 // Compute the overridden delta value. This may be useful for suppressing
666 // too fast scroll by system scroll speed overriding when widget sets
667 // mAllowToOverrideSystemScrollSpeed.
668 static double ComputeOverriddenDelta(double aDelta
, bool aIsForVertical
);
671 static bool sInitialized
;
672 static bool sIsSystemScrollSpeedOverrideEnabled
;
673 static int32_t sOverrideFactorX
;
674 static int32_t sOverrideFactorY
;
675 static void Initialize();
678 /******************************************************************************
679 * mozilla::WidgetPointerEvent
680 ******************************************************************************/
682 class WidgetPointerEvent
: public WidgetMouseEvent
{
683 friend class mozilla::dom::PBrowserParent
;
684 friend class mozilla::dom::PBrowserChild
;
687 : mWidth(1), mHeight(1), mIsPrimary(true), mFromTouchEvent(false) {}
690 virtual WidgetPointerEvent
* AsPointerEvent() override
{ return this; }
692 WidgetPointerEvent(bool aIsTrusted
, EventMessage aMsg
, nsIWidget
* w
)
693 : WidgetMouseEvent(aIsTrusted
, aMsg
, w
, ePointerEventClass
, eReal
),
697 mFromTouchEvent(false) {}
699 explicit WidgetPointerEvent(const WidgetMouseEvent
& aEvent
)
700 : WidgetMouseEvent(aEvent
),
704 mFromTouchEvent(false) {
705 mClass
= ePointerEventClass
;
708 virtual WidgetEvent
* Duplicate() const override
{
709 MOZ_ASSERT(mClass
== ePointerEventClass
,
710 "Duplicate() must be overridden by sub class");
711 // Not copying widget, it is a weak reference.
712 WidgetPointerEvent
* result
=
713 new WidgetPointerEvent(false, mMessage
, nullptr);
714 result
->AssignPointerEventData(*this, true);
715 result
->mFlags
= mFlags
;
722 bool mFromTouchEvent
;
724 // XXX Not tested by test_assign_event_data.html
725 void AssignPointerEventData(const WidgetPointerEvent
& aEvent
,
727 AssignMouseEventData(aEvent
, aCopyTargets
);
729 mWidth
= aEvent
.mWidth
;
730 mHeight
= aEvent
.mHeight
;
731 mIsPrimary
= aEvent
.mIsPrimary
;
732 mFromTouchEvent
= aEvent
.mFromTouchEvent
;
736 } // namespace mozilla
738 #endif // mozilla_MouseEvents_h__