Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "mozilla/dom/WheelEvent.h"
8 : #include "mozilla/MouseEvents.h"
9 : #include "prtime.h"
10 :
11 : namespace mozilla {
12 : namespace dom {
13 :
14 0 : WheelEvent::WheelEvent(EventTarget* aOwner,
15 : nsPresContext* aPresContext,
16 0 : WidgetWheelEvent* aWheelEvent)
17 : : MouseEvent(aOwner, aPresContext,
18 : aWheelEvent ? aWheelEvent :
19 0 : new WidgetWheelEvent(false, eVoidEvent, nullptr))
20 0 : , mAppUnitsPerDevPixel(0)
21 : {
22 0 : if (aWheelEvent) {
23 0 : mEventIsInternal = false;
24 : // If the delta mode is pixel, the WidgetWheelEvent's delta values are in
25 : // device pixels. However, JS contents need the delta values in CSS pixels.
26 : // We should store the value of mAppUnitsPerDevPixel here because
27 : // it might be changed by changing zoom or something.
28 0 : if (aWheelEvent->mDeltaMode == nsIDOMWheelEvent::DOM_DELTA_PIXEL) {
29 0 : mAppUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel();
30 : }
31 : } else {
32 0 : mEventIsInternal = true;
33 0 : mEvent->mTime = PR_Now();
34 0 : mEvent->mRefPoint = LayoutDeviceIntPoint(0, 0);
35 0 : mEvent->AsWheelEvent()->inputSource = nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN;
36 : }
37 0 : }
38 :
39 0 : NS_IMPL_ADDREF_INHERITED(WheelEvent, MouseEvent)
40 0 : NS_IMPL_RELEASE_INHERITED(WheelEvent, MouseEvent)
41 :
42 0 : NS_INTERFACE_MAP_BEGIN(WheelEvent)
43 0 : NS_INTERFACE_MAP_END_INHERITING(MouseEvent)
44 :
45 : void
46 0 : WheelEvent::InitWheelEvent(const nsAString& aType,
47 : bool aCanBubble,
48 : bool aCancelable,
49 : nsGlobalWindow* aView,
50 : int32_t aDetail,
51 : int32_t aScreenX,
52 : int32_t aScreenY,
53 : int32_t aClientX,
54 : int32_t aClientY,
55 : uint16_t aButton,
56 : EventTarget* aRelatedTarget,
57 : const nsAString& aModifiersList,
58 : double aDeltaX,
59 : double aDeltaY,
60 : double aDeltaZ,
61 : uint32_t aDeltaMode)
62 : {
63 0 : NS_ENSURE_TRUE_VOID(!mEvent->mFlags.mIsBeingDispatched);
64 :
65 0 : MouseEvent::InitMouseEvent(aType, aCanBubble, aCancelable, aView, aDetail,
66 : aScreenX, aScreenY, aClientX, aClientY, aButton,
67 0 : aRelatedTarget, aModifiersList);
68 :
69 0 : WidgetWheelEvent* wheelEvent = mEvent->AsWheelEvent();
70 0 : wheelEvent->mDeltaX = aDeltaX;
71 0 : wheelEvent->mDeltaY = aDeltaY;
72 0 : wheelEvent->mDeltaZ = aDeltaZ;
73 0 : wheelEvent->mDeltaMode = aDeltaMode;
74 : }
75 :
76 : double
77 0 : WheelEvent::DeltaX()
78 : {
79 0 : if (!mAppUnitsPerDevPixel) {
80 0 : return mEvent->AsWheelEvent()->mDeltaX;
81 : }
82 0 : return mEvent->AsWheelEvent()->mDeltaX *
83 0 : mAppUnitsPerDevPixel / nsPresContext::AppUnitsPerCSSPixel();
84 : }
85 :
86 : double
87 0 : WheelEvent::DeltaY()
88 : {
89 0 : if (!mAppUnitsPerDevPixel) {
90 0 : return mEvent->AsWheelEvent()->mDeltaY;
91 : }
92 0 : return mEvent->AsWheelEvent()->mDeltaY *
93 0 : mAppUnitsPerDevPixel / nsPresContext::AppUnitsPerCSSPixel();
94 : }
95 :
96 : double
97 0 : WheelEvent::DeltaZ()
98 : {
99 0 : if (!mAppUnitsPerDevPixel) {
100 0 : return mEvent->AsWheelEvent()->mDeltaZ;
101 : }
102 0 : return mEvent->AsWheelEvent()->mDeltaZ *
103 0 : mAppUnitsPerDevPixel / nsPresContext::AppUnitsPerCSSPixel();
104 : }
105 :
106 : uint32_t
107 0 : WheelEvent::DeltaMode()
108 : {
109 0 : return mEvent->AsWheelEvent()->mDeltaMode;
110 : }
111 :
112 : already_AddRefed<WheelEvent>
113 0 : WheelEvent::Constructor(const GlobalObject& aGlobal,
114 : const nsAString& aType,
115 : const WheelEventInit& aParam,
116 : ErrorResult& aRv)
117 : {
118 0 : nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
119 0 : RefPtr<WheelEvent> e = new WheelEvent(t, nullptr, nullptr);
120 0 : bool trusted = e->Init(t);
121 0 : e->InitWheelEvent(aType, aParam.mBubbles, aParam.mCancelable,
122 0 : aParam.mView, aParam.mDetail,
123 0 : aParam.mScreenX, aParam.mScreenY,
124 0 : aParam.mClientX, aParam.mClientY,
125 0 : aParam.mButton, aParam.mRelatedTarget,
126 0 : EmptyString(), aParam.mDeltaX,
127 0 : aParam.mDeltaY, aParam.mDeltaZ, aParam.mDeltaMode);
128 0 : e->InitializeExtraMouseEventDictionaryMembers(aParam);
129 0 : e->SetTrusted(trusted);
130 0 : e->SetComposed(aParam.mComposed);
131 0 : return e.forget();
132 : }
133 :
134 : } // namespace dom
135 : } // namespace mozilla
136 :
137 : using namespace mozilla;
138 : using namespace mozilla::dom;
139 :
140 : already_AddRefed<WheelEvent>
141 0 : NS_NewDOMWheelEvent(EventTarget* aOwner,
142 : nsPresContext* aPresContext,
143 : WidgetWheelEvent* aEvent)
144 : {
145 0 : RefPtr<WheelEvent> it = new WheelEvent(aOwner, aPresContext, aEvent);
146 0 : return it.forget();
147 : }
|