dom/events/KeyboardEvent.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:cb6ee1861733
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/. */
5
6 #include "mozilla/dom/KeyboardEvent.h"
7 #include "mozilla/TextEvents.h"
8 #include "prtime.h"
9
10 namespace mozilla {
11 namespace dom {
12
13 KeyboardEvent::KeyboardEvent(EventTarget* aOwner,
14 nsPresContext* aPresContext,
15 WidgetKeyboardEvent* aEvent)
16 : UIEvent(aOwner, aPresContext,
17 aEvent ? aEvent : new WidgetKeyboardEvent(false, 0, nullptr))
18 , mInitializedByCtor(false)
19 , mInitialzedWhichValue(0)
20 {
21 NS_ASSERTION(mEvent->eventStructType == NS_KEY_EVENT, "event type mismatch");
22
23 if (aEvent) {
24 mEventIsInternal = false;
25 }
26 else {
27 mEventIsInternal = true;
28 mEvent->time = PR_Now();
29 mEvent->AsKeyboardEvent()->mKeyNameIndex = KEY_NAME_INDEX_USE_STRING;
30 }
31 }
32
33 NS_IMPL_ADDREF_INHERITED(KeyboardEvent, UIEvent)
34 NS_IMPL_RELEASE_INHERITED(KeyboardEvent, UIEvent)
35
36 NS_INTERFACE_MAP_BEGIN(KeyboardEvent)
37 NS_INTERFACE_MAP_ENTRY(nsIDOMKeyEvent)
38 NS_INTERFACE_MAP_END_INHERITING(UIEvent)
39
40 bool
41 KeyboardEvent::AltKey()
42 {
43 return mEvent->AsKeyboardEvent()->IsAlt();
44 }
45
46 NS_IMETHODIMP
47 KeyboardEvent::GetAltKey(bool* aIsDown)
48 {
49 NS_ENSURE_ARG_POINTER(aIsDown);
50 *aIsDown = AltKey();
51 return NS_OK;
52 }
53
54 bool
55 KeyboardEvent::CtrlKey()
56 {
57 return mEvent->AsKeyboardEvent()->IsControl();
58 }
59
60 NS_IMETHODIMP
61 KeyboardEvent::GetCtrlKey(bool* aIsDown)
62 {
63 NS_ENSURE_ARG_POINTER(aIsDown);
64 *aIsDown = CtrlKey();
65 return NS_OK;
66 }
67
68 bool
69 KeyboardEvent::ShiftKey()
70 {
71 return mEvent->AsKeyboardEvent()->IsShift();
72 }
73
74 NS_IMETHODIMP
75 KeyboardEvent::GetShiftKey(bool* aIsDown)
76 {
77 NS_ENSURE_ARG_POINTER(aIsDown);
78 *aIsDown = ShiftKey();
79 return NS_OK;
80 }
81
82 bool
83 KeyboardEvent::MetaKey()
84 {
85 return mEvent->AsKeyboardEvent()->IsMeta();
86 }
87
88 NS_IMETHODIMP
89 KeyboardEvent::GetMetaKey(bool* aIsDown)
90 {
91 NS_ENSURE_ARG_POINTER(aIsDown);
92 *aIsDown = MetaKey();
93 return NS_OK;
94 }
95
96 bool
97 KeyboardEvent::Repeat()
98 {
99 return mEvent->AsKeyboardEvent()->mIsRepeat;
100 }
101
102 NS_IMETHODIMP
103 KeyboardEvent::GetRepeat(bool* aIsRepeat)
104 {
105 NS_ENSURE_ARG_POINTER(aIsRepeat);
106 *aIsRepeat = Repeat();
107 return NS_OK;
108 }
109
110 bool
111 KeyboardEvent::IsComposing()
112 {
113 return mEvent->AsKeyboardEvent()->mIsComposing;
114 }
115
116 NS_IMETHODIMP
117 KeyboardEvent::GetModifierState(const nsAString& aKey,
118 bool* aState)
119 {
120 NS_ENSURE_ARG_POINTER(aState);
121
122 *aState = GetModifierState(aKey);
123 return NS_OK;
124 }
125
126 NS_IMETHODIMP
127 KeyboardEvent::GetKey(nsAString& aKeyName)
128 {
129 mEvent->AsKeyboardEvent()->GetDOMKeyName(aKeyName);
130 return NS_OK;
131 }
132
133 NS_IMETHODIMP
134 KeyboardEvent::GetCharCode(uint32_t* aCharCode)
135 {
136 NS_ENSURE_ARG_POINTER(aCharCode);
137 *aCharCode = CharCode();
138 return NS_OK;
139 }
140
141 uint32_t
142 KeyboardEvent::CharCode()
143 {
144 // If this event is initialized with ctor, we shouldn't check event type.
145 if (mInitializedByCtor) {
146 return mEvent->AsKeyboardEvent()->charCode;
147 }
148
149 switch (mEvent->message) {
150 case NS_KEY_UP:
151 case NS_KEY_DOWN:
152 return 0;
153 case NS_KEY_PRESS:
154 return mEvent->AsKeyboardEvent()->charCode;
155 }
156 return 0;
157 }
158
159 NS_IMETHODIMP
160 KeyboardEvent::GetKeyCode(uint32_t* aKeyCode)
161 {
162 NS_ENSURE_ARG_POINTER(aKeyCode);
163 *aKeyCode = KeyCode();
164 return NS_OK;
165 }
166
167 uint32_t
168 KeyboardEvent::KeyCode()
169 {
170 // If this event is initialized with ctor, we shouldn't check event type.
171 if (mInitializedByCtor) {
172 return mEvent->AsKeyboardEvent()->keyCode;
173 }
174
175 switch (mEvent->message) {
176 case NS_KEY_UP:
177 case NS_KEY_PRESS:
178 case NS_KEY_DOWN:
179 return mEvent->AsKeyboardEvent()->keyCode;
180 }
181 return 0;
182 }
183
184 uint32_t
185 KeyboardEvent::Which()
186 {
187 // If this event is initialized with ctor, which can have independent value.
188 if (mInitializedByCtor) {
189 return mInitialzedWhichValue;
190 }
191
192 switch (mEvent->message) {
193 case NS_KEY_UP:
194 case NS_KEY_DOWN:
195 return KeyCode();
196 case NS_KEY_PRESS:
197 //Special case for 4xp bug 62878. Try to make value of which
198 //more closely mirror the values that 4.x gave for RETURN and BACKSPACE
199 {
200 uint32_t keyCode = mEvent->AsKeyboardEvent()->keyCode;
201 if (keyCode == NS_VK_RETURN || keyCode == NS_VK_BACK) {
202 return keyCode;
203 }
204 return CharCode();
205 }
206 }
207
208 return 0;
209 }
210
211 NS_IMETHODIMP
212 KeyboardEvent::GetLocation(uint32_t* aLocation)
213 {
214 NS_ENSURE_ARG_POINTER(aLocation);
215
216 *aLocation = Location();
217 return NS_OK;
218 }
219
220 uint32_t
221 KeyboardEvent::Location()
222 {
223 return mEvent->AsKeyboardEvent()->location;
224 }
225
226 // static
227 already_AddRefed<KeyboardEvent>
228 KeyboardEvent::Constructor(const GlobalObject& aGlobal,
229 const nsAString& aType,
230 const KeyboardEventInit& aParam,
231 ErrorResult& aRv)
232 {
233 nsCOMPtr<EventTarget> target = do_QueryInterface(aGlobal.GetAsSupports());
234 nsRefPtr<KeyboardEvent> newEvent =
235 new KeyboardEvent(target, nullptr, nullptr);
236 bool trusted = newEvent->Init(target);
237 aRv = newEvent->InitKeyEvent(aType, aParam.mBubbles, aParam.mCancelable,
238 aParam.mView, aParam.mCtrlKey, aParam.mAltKey,
239 aParam.mShiftKey, aParam.mMetaKey,
240 aParam.mKeyCode, aParam.mCharCode);
241 newEvent->SetTrusted(trusted);
242 newEvent->mDetail = aParam.mDetail;
243 newEvent->mInitializedByCtor = true;
244 newEvent->mInitialzedWhichValue = aParam.mWhich;
245
246 WidgetKeyboardEvent* internalEvent = newEvent->mEvent->AsKeyboardEvent();
247 internalEvent->location = aParam.mLocation;
248 internalEvent->mIsRepeat = aParam.mRepeat;
249 internalEvent->mIsComposing = aParam.mIsComposing;
250 internalEvent->mKeyNameIndex = KEY_NAME_INDEX_USE_STRING;
251 internalEvent->mKeyValue = aParam.mKey;
252
253 return newEvent.forget();
254 }
255
256 NS_IMETHODIMP
257 KeyboardEvent::InitKeyEvent(const nsAString& aType,
258 bool aCanBubble,
259 bool aCancelable,
260 nsIDOMWindow* aView,
261 bool aCtrlKey,
262 bool aAltKey,
263 bool aShiftKey,
264 bool aMetaKey,
265 uint32_t aKeyCode,
266 uint32_t aCharCode)
267 {
268 nsresult rv = UIEvent::InitUIEvent(aType, aCanBubble, aCancelable, aView, 0);
269 NS_ENSURE_SUCCESS(rv, rv);
270
271 WidgetKeyboardEvent* keyEvent = mEvent->AsKeyboardEvent();
272 keyEvent->InitBasicModifiers(aCtrlKey, aAltKey, aShiftKey, aMetaKey);
273 keyEvent->keyCode = aKeyCode;
274 keyEvent->charCode = aCharCode;
275
276 return NS_OK;
277 }
278
279 } // namespace dom
280 } // namespace mozilla
281
282 using namespace mozilla;
283 using namespace mozilla::dom;
284
285 nsresult
286 NS_NewDOMKeyboardEvent(nsIDOMEvent** aInstancePtrResult,
287 EventTarget* aOwner,
288 nsPresContext* aPresContext,
289 WidgetKeyboardEvent* aEvent)
290 {
291 KeyboardEvent* it = new KeyboardEvent(aOwner, aPresContext, aEvent);
292 NS_ADDREF(it);
293 *aInstancePtrResult = static_cast<Event*>(it);
294 return NS_OK;
295 }

mercurial