Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: Source/core/events/MouseEvent.cpp

Issue 727593003: Implement MouseEvent buttons attribute. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: addressed comments Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2001 Peter Kelly (pmk@post.com) 2 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
3 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) 3 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
4 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 4 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
5 * Copyright (C) 2003, 2005, 2006, 2008 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2005, 2006, 2008 Apple Inc. All rights reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 22 matching lines...) Expand all
33 MouseEventInit::MouseEventInit() 33 MouseEventInit::MouseEventInit()
34 : screenX(0) 34 : screenX(0)
35 , screenY(0) 35 , screenY(0)
36 , clientX(0) 36 , clientX(0)
37 , clientY(0) 37 , clientY(0)
38 , ctrlKey(false) 38 , ctrlKey(false)
39 , altKey(false) 39 , altKey(false)
40 , shiftKey(false) 40 , shiftKey(false)
41 , metaKey(false) 41 , metaKey(false)
42 , button(0) 42 , button(0)
43 , buttons(0)
43 , relatedTarget(nullptr) 44 , relatedTarget(nullptr)
44 { 45 {
45 } 46 }
46 47
47 PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& type, const MouseEventInit& initializer) 48 PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& type, const MouseEventInit& initializer)
48 { 49 {
49 return adoptRefWillBeNoop(new MouseEvent(type, initializer)); 50 return adoptRefWillBeNoop(new MouseEvent(type, initializer));
50 } 51 }
51 52
52 PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& eventT ype, PassRefPtrWillBeRawPtr<AbstractView> view, const PlatformMouseEvent& event, int detail, PassRefPtrWillBeRawPtr<Node> relatedTarget) 53 PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& eventT ype, PassRefPtrWillBeRawPtr<AbstractView> view, const PlatformMouseEvent& event, int detail, PassRefPtrWillBeRawPtr<Node> relatedTarget)
53 { 54 {
54 ASSERT(event.type() == PlatformEvent::MouseMoved || event.button() != NoButt on); 55 ASSERT(event.type() == PlatformEvent::MouseMoved || event.button() != NoButt on);
55 56
56 bool isMouseEnterOrLeave = eventType == EventTypeNames::mouseenter || eventT ype == EventTypeNames::mouseleave; 57 bool isMouseEnterOrLeave = eventType == EventTypeNames::mouseenter || eventT ype == EventTypeNames::mouseleave;
57 bool isCancelable = !isMouseEnterOrLeave; 58 bool isCancelable = !isMouseEnterOrLeave;
58 bool isBubbling = !isMouseEnterOrLeave; 59 bool isBubbling = !isMouseEnterOrLeave;
59 60
60 return MouseEvent::create( 61 return MouseEvent::create(
61 eventType, isBubbling, isCancelable, view, 62 eventType, isBubbling, isCancelable, view,
62 detail, event.globalPosition().x(), event.globalPosition().y(), event.po sition().x(), event.position().y(), 63 detail, event.globalPosition().x(), event.globalPosition().y(), event.po sition().x(), event.position().y(),
63 event.movementDelta().x(), event.movementDelta().y(), 64 event.movementDelta().x(), event.movementDelta().y(),
64 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), even t.button(), 65 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), even t.button(), event.modifiers(),
65 relatedTarget, nullptr, false, event.syntheticEventType()); 66 relatedTarget, nullptr, false, event.syntheticEventType());
66 } 67 }
67 68
68 PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView> view, 69 PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView> view,
69 int detail, int screenX, int screenY, int pageX, int pageY, 70 int detail, int screenX, int screenY, int pageX, int pageY,
70 int movementX, int movementY, 71 int movementX, int movementY,
71 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short butto n, 72 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
73 unsigned short button, unsigned modifiers,
72 PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, PassRefPtrWillBeRawPtr<Da taTransfer> dataTransfer, bool isSimulated, PlatformMouseEvent::SyntheticEventTy pe syntheticEventType) 74 PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, PassRefPtrWillBeRawPtr<Da taTransfer> dataTransfer, bool isSimulated, PlatformMouseEvent::SyntheticEventTy pe syntheticEventType)
73 { 75 {
74 return adoptRefWillBeNoop(new MouseEvent(type, canBubble, cancelable, view, 76 return adoptRefWillBeNoop(new MouseEvent(type, canBubble, cancelable, view,
75 detail, screenX, screenY, pageX, pageY, 77 detail, screenX, screenY, pageX, pageY,
76 movementX, movementY, 78 movementX, movementY,
77 ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, dataTransfer, isSimulated, syntheticEventType)); 79 ctrlKey, altKey, shiftKey, metaKey, button, modifiers,
80 relatedTarget, dataTransfer, isSimulated, syntheticEventType));
78 } 81 }
79 82
80 MouseEvent::MouseEvent() 83 MouseEvent::MouseEvent()
81 : m_button(0) 84 : m_button(0)
85 , m_buttons(0)
82 , m_buttonDown(false) 86 , m_buttonDown(false)
83 { 87 {
84 } 88 }
85 89
86 MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cance lable, PassRefPtrWillBeRawPtr<AbstractView> view, 90 MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cance lable, PassRefPtrWillBeRawPtr<AbstractView> view,
87 int detail, int screenX, int screenY, int pageX, int pageY, 91 int detail, int screenX, int screenY, int pageX, int pageY,
88 int movementX, int movementY, 92 int movementX, int movementY,
89 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, 93 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
90 unsigned short button, PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, 94 unsigned short button, unsigned modifiers, PassRefPtrWillBeRawPtr<EventTarge t> relatedTarget,
91 PassRefPtrWillBeRawPtr<DataTransfer> dataTransfer, bool isSimulated, Platfor mMouseEvent::SyntheticEventType syntheticEventType) 95 PassRefPtrWillBeRawPtr<DataTransfer> dataTransfer, bool isSimulated, Platfor mMouseEvent::SyntheticEventType syntheticEventType)
92 : MouseRelatedEvent(eventType, canBubble, cancelable, view, detail, IntPoint (screenX, screenY), 96 : MouseRelatedEvent(eventType, canBubble, cancelable, view, detail, IntPoint (screenX, screenY),
93 IntPoint(pageX, pageY), 97 IntPoint(pageX, pageY),
94 IntPoint(movementX, movementY), 98 IntPoint(movementX, movementY),
95 ctrlKey, altKey, shiftKey, metaKey, isSimulated) 99 ctrlKey, altKey, shiftKey, metaKey, isSimulated)
96 , m_button(button == (unsigned short)-1 ? 0 : button) 100 , m_button(button == (unsigned short)-1 ? 0 : button)
101 , m_buttons(modifiersToButtons(eventType, button, modifiers))
97 , m_buttonDown(button != (unsigned short)-1) 102 , m_buttonDown(button != (unsigned short)-1)
98 , m_relatedTarget(relatedTarget) 103 , m_relatedTarget(relatedTarget)
99 , m_dataTransfer(dataTransfer) 104 , m_dataTransfer(dataTransfer)
100 , m_syntheticEventType(syntheticEventType) 105 , m_syntheticEventType(syntheticEventType)
101 { 106 {
102 } 107 }
103 108
104 MouseEvent::MouseEvent(const AtomicString& eventType, const MouseEventInit& init ializer) 109 MouseEvent::MouseEvent(const AtomicString& eventType, const MouseEventInit& init ializer)
105 : MouseRelatedEvent(eventType, initializer.bubbles, initializer.cancelable, initializer.view, initializer.detail, IntPoint(initializer.screenX, initializer. screenY), 110 : MouseRelatedEvent(eventType, initializer.bubbles, initializer.cancelable, initializer.view, initializer.detail, IntPoint(initializer.screenX, initializer. screenY),
106 IntPoint(0 /* pageX */, 0 /* pageY */), 111 IntPoint(0 /* pageX */, 0 /* pageY */),
107 IntPoint(0 /* movementX */, 0 /* movementY */), 112 IntPoint(0 /* movementX */, 0 /* movementY */),
108 initializer.ctrlKey, initializer.altKey, initializer.shiftKey, initializ er.metaKey, false /* isSimulated */) 113 initializer.ctrlKey, initializer.altKey, initializer.shiftKey, initializ er.metaKey, false /* isSimulated */)
109 , m_button(initializer.button == (unsigned short)-1 ? 0 : initializer.button ) 114 , m_button(initializer.button == (unsigned short)-1 ? 0 : initializer.button )
115 , m_buttons(initializer.buttons == (unsigned short)-1 ? 0 : initializer.butt ons)
110 , m_buttonDown(initializer.button != (unsigned short)-1) 116 , m_buttonDown(initializer.button != (unsigned short)-1)
111 , m_relatedTarget(initializer.relatedTarget) 117 , m_relatedTarget(initializer.relatedTarget)
112 , m_dataTransfer(nullptr) 118 , m_dataTransfer(nullptr)
113 { 119 {
114 initCoordinates(IntPoint(initializer.clientX, initializer.clientY)); 120 initCoordinates(IntPoint(initializer.clientX, initializer.clientY));
115 } 121 }
116 122
117 MouseEvent::~MouseEvent() 123 MouseEvent::~MouseEvent()
118 { 124 {
119 } 125 }
120 126
127 unsigned short MouseEvent::modifiersToButtons(const AtomicString& type, unsigned short button, unsigned modifiers)
128 {
129 const unsigned buttonToModifier[] = {
130 PlatformEvent::LeftButtonDown,
131 PlatformEvent::MiddleButtonDown,
132 PlatformEvent::RightButtonDown
133 };
134 if (type == EventTypeNames::mouseup)
Rick Byers 2014/11/25 17:44:28 I don't think checking for mouseup here is suffici
zino 2014/11/28 12:29:28 Done.
135 modifiers &= ~buttonToModifier[button];
136
137 unsigned short buttons = 0;
138 if (modifiers & PlatformEvent::LeftButtonDown)
139 buttons |= 1;
140 if (modifiers & PlatformEvent::RightButtonDown)
141 buttons |= 2;
142 if (modifiers & PlatformEvent::MiddleButtonDown)
143 buttons |= 4;
144
145 return buttons;
146 }
147
121 void MouseEvent::initMouseEvent(const AtomicString& type, bool canBubble, bool c ancelable, PassRefPtrWillBeRawPtr<AbstractView> view, 148 void MouseEvent::initMouseEvent(const AtomicString& type, bool canBubble, bool c ancelable, PassRefPtrWillBeRawPtr<AbstractView> view,
122 int detail, int screenX, int screenY, int client X, int clientY, 149 int detail, int screenX, int screenY, int client X, int clientY,
123 bool ctrlKey, bool altKey, bool shiftKey, bool m etaKey, 150 bool ctrlKey, bool altKey, bool shiftKey, bool m etaKey,
124 unsigned short button, PassRefPtrWillBeRawPtr<Ev entTarget> relatedTarget) 151 unsigned short button, PassRefPtrWillBeRawPtr<Ev entTarget> relatedTarget, unsigned short buttons)
125 { 152 {
126 if (dispatched()) 153 if (dispatched())
127 return; 154 return;
128 155
129 initUIEvent(type, canBubble, cancelable, view, detail); 156 initUIEvent(type, canBubble, cancelable, view, detail);
130 157
131 m_screenLocation = IntPoint(screenX, screenY); 158 m_screenLocation = IntPoint(screenX, screenY);
132 m_ctrlKey = ctrlKey; 159 m_ctrlKey = ctrlKey;
133 m_altKey = altKey; 160 m_altKey = altKey;
134 m_shiftKey = shiftKey; 161 m_shiftKey = shiftKey;
135 m_metaKey = metaKey; 162 m_metaKey = metaKey;
136 m_button = button == (unsigned short)-1 ? 0 : button; 163 m_button = button == (unsigned short)-1 ? 0 : button;
137 m_buttonDown = button != (unsigned short)-1; 164 m_buttonDown = button != (unsigned short)-1;
138 m_relatedTarget = relatedTarget; 165 m_relatedTarget = relatedTarget;
166 m_buttons = buttons;
139 167
140 initCoordinates(IntPoint(clientX, clientY)); 168 initCoordinates(IntPoint(clientX, clientY));
141 169
142 // FIXME: m_isSimulated is not set to false here. 170 // FIXME: m_isSimulated is not set to false here.
143 // FIXME: m_dataTransfer is not set to nullptr here. 171 // FIXME: m_dataTransfer is not set to nullptr here.
144 } 172 }
145 173
146 const AtomicString& MouseEvent::interfaceName() const 174 const AtomicString& MouseEvent::interfaceName() const
147 { 175 {
148 return EventNames::MouseEvent; 176 return EventNames::MouseEvent;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 PassRefPtrWillBeRawPtr<SimulatedMouseEvent> SimulatedMouseEvent::create(const At omicString& eventType, PassRefPtrWillBeRawPtr<AbstractView> view, PassRefPtrWill BeRawPtr<Event> underlyingEvent) 226 PassRefPtrWillBeRawPtr<SimulatedMouseEvent> SimulatedMouseEvent::create(const At omicString& eventType, PassRefPtrWillBeRawPtr<AbstractView> view, PassRefPtrWill BeRawPtr<Event> underlyingEvent)
199 { 227 {
200 return adoptRefWillBeNoop(new SimulatedMouseEvent(eventType, view, underlyin gEvent)); 228 return adoptRefWillBeNoop(new SimulatedMouseEvent(eventType, view, underlyin gEvent));
201 } 229 }
202 230
203 SimulatedMouseEvent::~SimulatedMouseEvent() 231 SimulatedMouseEvent::~SimulatedMouseEvent()
204 { 232 {
205 } 233 }
206 234
207 SimulatedMouseEvent::SimulatedMouseEvent(const AtomicString& eventType, PassRefP trWillBeRawPtr<AbstractView> view, PassRefPtrWillBeRawPtr<Event> underlyingEvent ) 235 SimulatedMouseEvent::SimulatedMouseEvent(const AtomicString& eventType, PassRefP trWillBeRawPtr<AbstractView> view, PassRefPtrWillBeRawPtr<Event> underlyingEvent )
208 : MouseEvent(eventType, true, true, view, 0, 0, 0, 0, 0, 0, 0, false, false, false, false, 0, 236 : MouseEvent(eventType, true, true, view, 0, 0, 0, 0, 0, 0, 0, false, false, false, false, 0, 0,
209 nullptr, nullptr, true, PlatformMouseEvent::RealOrIndistinguishable) 237 nullptr, nullptr, true, PlatformMouseEvent::RealOrIndistinguishable)
210 { 238 {
211 if (UIEventWithKeyState* keyStateEvent = findEventWithKeyState(underlyingEve nt.get())) { 239 if (UIEventWithKeyState* keyStateEvent = findEventWithKeyState(underlyingEve nt.get())) {
212 m_ctrlKey = keyStateEvent->ctrlKey(); 240 m_ctrlKey = keyStateEvent->ctrlKey();
213 m_altKey = keyStateEvent->altKey(); 241 m_altKey = keyStateEvent->altKey();
214 m_shiftKey = keyStateEvent->shiftKey(); 242 m_shiftKey = keyStateEvent->shiftKey();
215 m_metaKey = keyStateEvent->metaKey(); 243 m_metaKey = keyStateEvent->metaKey();
216 } 244 }
217 setUnderlyingEvent(underlyingEvent); 245 setUnderlyingEvent(underlyingEvent);
218 246
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 bool swallowEvent = event()->defaultHandled() || event()->defaultPrevented() ; 293 bool swallowEvent = event()->defaultHandled() || event()->defaultPrevented() ;
266 294
267 if (event()->type() != EventTypeNames::click || event()->detail() != 2) 295 if (event()->type() != EventTypeNames::click || event()->detail() != 2)
268 return !swallowEvent; 296 return !swallowEvent;
269 297
270 // Special case: If it's a double click event, we also send the dblclick eve nt. This is not part 298 // Special case: If it's a double click event, we also send the dblclick eve nt. This is not part
271 // of the DOM specs, but is used for compatibility with the ondblclick="" at tribute. This is treated 299 // of the DOM specs, but is used for compatibility with the ondblclick="" at tribute. This is treated
272 // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same. 300 // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same.
273 RefPtrWillBeRawPtr<MouseEvent> doubleClickEvent = MouseEvent::create(); 301 RefPtrWillBeRawPtr<MouseEvent> doubleClickEvent = MouseEvent::create();
274 doubleClickEvent->initMouseEvent(EventTypeNames::dblclick, event()->bubbles( ), event()->cancelable(), event()->view(), 302 doubleClickEvent->initMouseEvent(EventTypeNames::dblclick, event()->bubbles( ), event()->cancelable(), event()->view(),
275 event()->detail(), event()->screenX(), even t()->screenY(), event()->clientX(), event()->clientY(), 303 event()->detail(), event()->screenX(), event()->screenY(), event()->clie ntX(), event()->clientY(),
276 event()->ctrlKey(), event()->altKey(), even t()->shiftKey(), event()->metaKey(), 304 event()->ctrlKey(), event()->altKey(), event()->shiftKey(), event()->met aKey(),
277 event()->button(), relatedTarget); 305 event()->button(), relatedTarget, event()->buttons());
278 if (event()->defaultHandled()) 306 if (event()->defaultHandled())
279 doubleClickEvent->setDefaultHandled(); 307 doubleClickEvent->setDefaultHandled();
280 EventDispatcher::dispatchEvent(dispatcher->node(), MouseEventDispatchMediato r::create(doubleClickEvent)); 308 EventDispatcher::dispatchEvent(dispatcher->node(), MouseEventDispatchMediato r::create(doubleClickEvent));
281 if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented ()) 309 if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented ())
282 return false; 310 return false;
283 return !swallowEvent; 311 return !swallowEvent;
284 } 312 }
285 313
286 } // namespace blink 314 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698