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

Side by Side Diff: third_party/WebKit/Source/core/input/GestureManager.cpp

Issue 2650403006: Remove PlatformMouseEvent and use WebMouseEvent instead (Closed)
Patch Set: Created 3 years, 10 months 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 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/input/GestureManager.h" 5 #include "core/input/GestureManager.h"
6 6
7 #include "core/dom/Document.h" 7 #include "core/dom/Document.h"
8 #include "core/dom/DocumentUserGestureToken.h" 8 #include "core/dom/DocumentUserGestureToken.h"
9 #include "core/editing/SelectionController.h" 9 #include "core/editing/SelectionController.h"
10 #include "core/events/GestureEvent.h" 10 #include "core/events/GestureEvent.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 HitTestResult currentHitTest = targetedEvent.hitTestResult(); 143 HitTestResult currentHitTest = targetedEvent.hitTestResult();
144 144
145 // We use the adjusted position so the application isn't surprised to see a 145 // We use the adjusted position so the application isn't surprised to see a
146 // event with co-ordinates outside the target's bounds. 146 // event with co-ordinates outside the target's bounds.
147 IntPoint adjustedPoint = frameView->rootFrameToContents( 147 IntPoint adjustedPoint = frameView->rootFrameToContents(
148 flooredIntPoint(gestureEvent.positionInRootFrame())); 148 flooredIntPoint(gestureEvent.positionInRootFrame()));
149 149
150 const unsigned modifiers = gestureEvent.modifiers(); 150 const unsigned modifiers = gestureEvent.modifiers();
151 151
152 if (!m_suppressMouseEventsFromGestures) { 152 if (!m_suppressMouseEventsFromGestures) {
153 PlatformMouseEvent fakeMouseMove( 153 WebMouseEvent fakeMouseMove(
154 gestureEvent, WebPointerProperties::Button::NoButton, 154 WebInputEvent::MouseMove, gestureEvent,
155 PlatformEvent::MouseMoved, 155 WebPointerProperties::Button::NoButton,
156 /* clickCount */ 0, static_cast<PlatformEvent::Modifiers>(modifiers), 156 /* clickCount */ 0,
157 PlatformMouseEvent::FromTouch, 157 static_cast<PlatformEvent::Modifiers>(
158 TimeTicks::FromSeconds(gestureEvent.timeStampSeconds()), 158 modifiers | WebInputEvent::Modifiers::IsCompatibilityEventForTouch),
159 WebPointerProperties::PointerType::Mouse); 159 gestureEvent.timeStampSeconds());
160 m_mouseEventManager->setMousePositionAndDispatchMouseEvent( 160 m_mouseEventManager->setMousePositionAndDispatchMouseEvent(
161 currentHitTest.innerNode(), EventTypeNames::mousemove, fakeMouseMove); 161 currentHitTest.innerNode(), currentHitTest.canvasRegionId(),
162 EventTypeNames::mousemove, fakeMouseMove);
162 } 163 }
163 164
164 // Do a new hit-test in case the mousemove event changed the DOM. 165 // Do a new hit-test in case the mousemove event changed the DOM.
165 // Note that if the original hit test wasn't over an element (eg. was over a 166 // Note that if the original hit test wasn't over an element (eg. was over a
166 // scrollbar) we don't want to re-hit-test because it may be in the wrong 167 // scrollbar) we don't want to re-hit-test because it may be in the wrong
167 // frame (and there's no way the page could have seen the event anyway). Also 168 // frame (and there's no way the page could have seen the event anyway). Also
168 // note that the position of the frame may have changed, so we need to 169 // note that the position of the frame may have changed, so we need to
169 // recompute the content co-ordinates (updating layout/style as 170 // recompute the content co-ordinates (updating layout/style as
170 // hitTestResultAtPoint normally would). 171 // hitTestResultAtPoint normally would).
171 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. 172 // FIXME: Use a hit-test cache to avoid unnecessary hit tests.
(...skipping 13 matching lines...) Expand all
185 IntPoint tappedPosition = flooredIntPoint(gestureEvent.positionInRootFrame()); 186 IntPoint tappedPosition = flooredIntPoint(gestureEvent.positionInRootFrame());
186 Node* tappedNonTextNode = tappedNode; 187 Node* tappedNonTextNode = tappedNode;
187 UserGestureIndicator gestureIndicator(DocumentUserGestureToken::create( 188 UserGestureIndicator gestureIndicator(DocumentUserGestureToken::create(
188 tappedNode ? &tappedNode->document() : nullptr)); 189 tappedNode ? &tappedNode->document() : nullptr));
189 190
190 if (tappedNonTextNode && tappedNonTextNode->isTextNode()) 191 if (tappedNonTextNode && tappedNonTextNode->isTextNode())
191 tappedNonTextNode = FlatTreeTraversal::parent(*tappedNonTextNode); 192 tappedNonTextNode = FlatTreeTraversal::parent(*tappedNonTextNode);
192 193
193 m_mouseEventManager->setClickNode(tappedNonTextNode); 194 m_mouseEventManager->setClickNode(tappedNonTextNode);
194 195
195 PlatformMouseEvent fakeMouseDown( 196 WebMouseEvent fakeMouseDown(
196 gestureEvent, WebPointerProperties::Button::Left, 197 WebInputEvent::MouseDown, gestureEvent,
197 PlatformEvent::MousePressed, gestureEvent.tapCount(), 198 WebPointerProperties::Button::Left, gestureEvent.tapCount(),
198 static_cast<PlatformEvent::Modifiers>(modifiers | 199 static_cast<PlatformEvent::Modifiers>(
199 PlatformEvent::LeftButtonDown), 200 modifiers | WebInputEvent::Modifiers::LeftButtonDown |
200 PlatformMouseEvent::FromTouch, 201 WebInputEvent::Modifiers::IsCompatibilityEventForTouch),
201 TimeTicks::FromSeconds(gestureEvent.timeStampSeconds()), 202 gestureEvent.timeStampSeconds());
202 WebPointerProperties::PointerType::Mouse);
203 203
204 // TODO(mustaq): We suppress MEs plus all it's side effects. What would that 204 // TODO(mustaq): We suppress MEs plus all it's side effects. What would that
205 // mean for for TEs? What's the right balance here? crbug.com/617255 205 // mean for for TEs? What's the right balance here? crbug.com/617255
206 WebInputEventResult mouseDownEventResult = 206 WebInputEventResult mouseDownEventResult =
207 WebInputEventResult::HandledSuppressed; 207 WebInputEventResult::HandledSuppressed;
208 if (!m_suppressMouseEventsFromGestures) { 208 if (!m_suppressMouseEventsFromGestures) {
209 m_mouseEventManager->setClickCount(gestureEvent.tapCount()); 209 m_mouseEventManager->setClickCount(gestureEvent.tapCount());
210 210
211 mouseDownEventResult = 211 mouseDownEventResult =
212 m_mouseEventManager->setMousePositionAndDispatchMouseEvent( 212 m_mouseEventManager->setMousePositionAndDispatchMouseEvent(
213 currentHitTest.innerNode(), EventTypeNames::mousedown, 213 currentHitTest.innerNode(), currentHitTest.canvasRegionId(),
214 fakeMouseDown); 214 EventTypeNames::mousedown, fakeMouseDown);
215 m_selectionController->initializeSelectionState(); 215 m_selectionController->initializeSelectionState();
216 if (mouseDownEventResult == WebInputEventResult::NotHandled) 216 if (mouseDownEventResult == WebInputEventResult::NotHandled)
217 mouseDownEventResult = m_mouseEventManager->handleMouseFocus( 217 mouseDownEventResult = m_mouseEventManager->handleMouseFocus(
218 currentHitTest, 218 currentHitTest,
219 InputDeviceCapabilities::firesTouchEventsSourceCapabilities()); 219 InputDeviceCapabilities::firesTouchEventsSourceCapabilities());
220 if (mouseDownEventResult == WebInputEventResult::NotHandled) 220 if (mouseDownEventResult == WebInputEventResult::NotHandled)
221 mouseDownEventResult = m_mouseEventManager->handleMousePressEvent( 221 mouseDownEventResult = m_mouseEventManager->handleMousePressEvent(
222 MouseEventWithHitTestResults(fakeMouseDown, currentHitTest)); 222 MouseEventWithHitTestResults(fakeMouseDown, currentHitTest));
223 } 223 }
224 224
225 if (currentHitTest.innerNode()) { 225 if (currentHitTest.innerNode()) {
226 DCHECK(gestureEvent.type() == WebInputEvent::GestureTap); 226 DCHECK(gestureEvent.type() == WebInputEvent::GestureTap);
227 HitTestResult result = currentHitTest; 227 HitTestResult result = currentHitTest;
228 result.setToShadowHostIfInUserAgentShadowRoot(); 228 result.setToShadowHostIfInUserAgentShadowRoot();
229 m_frame->chromeClient().onMouseDown(result.innerNode()); 229 m_frame->chromeClient().onMouseDown(result.innerNode());
230 } 230 }
231 231
232 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. 232 // FIXME: Use a hit-test cache to avoid unnecessary hit tests.
233 // http://crbug.com/398920 233 // http://crbug.com/398920
234 if (currentHitTest.innerNode()) { 234 if (currentHitTest.innerNode()) {
235 LocalFrame* mainFrame = m_frame->localFrameRoot(); 235 LocalFrame* mainFrame = m_frame->localFrameRoot();
236 if (mainFrame && mainFrame->view()) 236 if (mainFrame && mainFrame->view())
237 mainFrame->view()->updateAllLifecyclePhases(); 237 mainFrame->view()->updateAllLifecyclePhases();
238 adjustedPoint = frameView->rootFrameToContents(tappedPosition); 238 adjustedPoint = frameView->rootFrameToContents(tappedPosition);
239 currentHitTest = EventHandlingUtil::hitTestResultInFrame( 239 currentHitTest = EventHandlingUtil::hitTestResultInFrame(
240 m_frame, adjustedPoint, hitType); 240 m_frame, adjustedPoint, hitType);
241 } 241 }
242 242
243 PlatformMouseEvent fakeMouseUp( 243 WebMouseEvent fakeMouseUp(
244 gestureEvent, WebPointerProperties::Button::Left, 244 WebInputEvent::MouseUp, gestureEvent, WebPointerProperties::Button::Left,
245 PlatformEvent::MouseReleased, gestureEvent.tapCount(), 245 gestureEvent.tapCount(),
246 static_cast<PlatformEvent::Modifiers>(modifiers), 246 static_cast<PlatformEvent::Modifiers>(
247 PlatformMouseEvent::FromTouch, 247 modifiers | WebInputEvent::Modifiers::IsCompatibilityEventForTouch),
248 TimeTicks::FromSeconds(gestureEvent.timeStampSeconds()), 248 gestureEvent.timeStampSeconds());
249 WebPointerProperties::PointerType::Mouse);
250 WebInputEventResult mouseUpEventResult = 249 WebInputEventResult mouseUpEventResult =
251 m_suppressMouseEventsFromGestures 250 m_suppressMouseEventsFromGestures
252 ? WebInputEventResult::HandledSuppressed 251 ? WebInputEventResult::HandledSuppressed
253 : m_mouseEventManager->setMousePositionAndDispatchMouseEvent( 252 : m_mouseEventManager->setMousePositionAndDispatchMouseEvent(
254 currentHitTest.innerNode(), EventTypeNames::mouseup, 253 currentHitTest.innerNode(), currentHitTest.canvasRegionId(),
255 fakeMouseUp); 254 EventTypeNames::mouseup, fakeMouseUp);
256 255
257 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled; 256 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled;
258 if (tappedNonTextNode) { 257 if (tappedNonTextNode) {
259 if (currentHitTest.innerNode()) { 258 if (currentHitTest.innerNode()) {
260 // Updates distribution because a mouseup (or mousedown) event listener 259 // Updates distribution because a mouseup (or mousedown) event listener
261 // can make the tree dirty at dispatchMouseEvent() invocation above. 260 // can make the tree dirty at dispatchMouseEvent() invocation above.
262 // Unless distribution is updated, commonAncestor would hit DCHECK. Both 261 // Unless distribution is updated, commonAncestor would hit DCHECK. Both
263 // tappedNonTextNode and currentHitTest.innerNode()) don't need to be 262 // tappedNonTextNode and currentHitTest.innerNode()) don't need to be
264 // updated because commonAncestor() will exit early if their documents are 263 // updated because commonAncestor() will exit early if their documents are
265 // different. 264 // different.
266 tappedNonTextNode->updateDistribution(); 265 tappedNonTextNode->updateDistribution();
267 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor( 266 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(
268 *tappedNonTextNode, EventHandlingUtil::parentForClickEvent); 267 *tappedNonTextNode, EventHandlingUtil::parentForClickEvent);
269 clickEventResult = 268 clickEventResult =
270 m_mouseEventManager->setMousePositionAndDispatchMouseEvent( 269 m_mouseEventManager->setMousePositionAndDispatchMouseEvent(
271 clickTargetNode, EventTypeNames::click, fakeMouseUp); 270 clickTargetNode, String(), EventTypeNames::click, fakeMouseUp);
272 } 271 }
273 m_mouseEventManager->setClickNode(nullptr); 272 m_mouseEventManager->setClickNode(nullptr);
274 } 273 }
275 274
276 if (mouseUpEventResult == WebInputEventResult::NotHandled) 275 if (mouseUpEventResult == WebInputEventResult::NotHandled)
277 mouseUpEventResult = m_mouseEventManager->handleMouseReleaseEvent( 276 mouseUpEventResult = m_mouseEventManager->handleMouseReleaseEvent(
278 MouseEventWithHitTestResults(fakeMouseUp, currentHitTest)); 277 MouseEventWithHitTestResults(fakeMouseUp, currentHitTest));
279 m_mouseEventManager->clearDragHeuristicState(); 278 m_mouseEventManager->clearDragHeuristicState();
280 279
281 WebInputEventResult eventResult = EventHandlingUtil::mergeEventResult( 280 WebInputEventResult eventResult = EventHandlingUtil::mergeEventResult(
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 m_selectionController->handleGestureTwoFingerTap(targetedEvent); 353 m_selectionController->handleGestureTwoFingerTap(targetedEvent);
355 return sendContextMenuEventForGesture(targetedEvent); 354 return sendContextMenuEventForGesture(targetedEvent);
356 } 355 }
357 356
358 WebInputEventResult GestureManager::sendContextMenuEventForGesture( 357 WebInputEventResult GestureManager::sendContextMenuEventForGesture(
359 const GestureEventWithHitTestResults& targetedEvent) { 358 const GestureEventWithHitTestResults& targetedEvent) {
360 const WebGestureEvent& gestureEvent = targetedEvent.event(); 359 const WebGestureEvent& gestureEvent = targetedEvent.event();
361 unsigned modifiers = gestureEvent.modifiers(); 360 unsigned modifiers = gestureEvent.modifiers();
362 361
363 if (!m_suppressMouseEventsFromGestures) { 362 if (!m_suppressMouseEventsFromGestures) {
364 // Send MouseMoved event prior to handling (https://crbug.com/485290). 363 // Send MouseMove event prior to handling (https://crbug.com/485290).
365 PlatformMouseEvent fakeMouseMove( 364 WebMouseEvent fakeMouseMove(
366 gestureEvent, WebPointerProperties::Button::NoButton, 365 WebInputEvent::MouseMove, gestureEvent,
367 PlatformEvent::MouseMoved, 366 WebPointerProperties::Button::NoButton,
368 /* clickCount */ 0, static_cast<PlatformEvent::Modifiers>(modifiers), 367 /* clickCount */ 0,
369 PlatformMouseEvent::FromTouch, 368 static_cast<PlatformEvent::Modifiers>(
370 TimeTicks::FromSeconds(gestureEvent.timeStampSeconds()), 369 modifiers | WebInputEvent::IsCompatibilityEventForTouch),
371 WebPointerProperties::PointerType::Mouse); 370 gestureEvent.timeStampSeconds());
372 m_mouseEventManager->setMousePositionAndDispatchMouseEvent( 371 m_mouseEventManager->setMousePositionAndDispatchMouseEvent(
373 targetedEvent.hitTestResult().innerNode(), EventTypeNames::mousemove, 372 targetedEvent.hitTestResult().innerNode(),
373 targetedEvent.canvasRegionId(), EventTypeNames::mousemove,
374 fakeMouseMove); 374 fakeMouseMove);
375 } 375 }
376 376
377 PlatformEvent::EventType eventType = PlatformEvent::MousePressed; 377 WebInputEvent::Type eventType = WebInputEvent::MouseDown;
378 if (m_frame->settings() && m_frame->settings()->getShowContextMenuOnMouseUp()) 378 if (m_frame->settings() && m_frame->settings()->getShowContextMenuOnMouseUp())
379 eventType = PlatformEvent::MouseReleased; 379 eventType = WebInputEvent::MouseUp;
380 380
381 PlatformMouseEvent mouseEvent( 381 WebMouseEvent mouseEvent(
382 gestureEvent, WebPointerProperties::Button::Right, eventType, 382 eventType, gestureEvent, WebPointerProperties::Button::Right,
383 /* clickCount */ 1, 383 /* clickCount */ 1,
384 static_cast<PlatformEvent::Modifiers>( 384 static_cast<PlatformEvent::Modifiers>(
385 modifiers | PlatformEvent::Modifiers::RightButtonDown), 385 modifiers | PlatformEvent::Modifiers::RightButtonDown |
386 PlatformMouseEvent::FromTouch, TimeTicks::Now(), 386 WebInputEvent::IsCompatibilityEventForTouch),
387 WebPointerProperties::PointerType::Mouse); 387 gestureEvent.timeStampSeconds());
388 388
389 if (!m_suppressMouseEventsFromGestures && m_frame->view()) { 389 if (!m_suppressMouseEventsFromGestures && m_frame->view()) {
390 HitTestRequest request(HitTestRequest::Active); 390 HitTestRequest request(HitTestRequest::Active);
391 LayoutPoint documentPoint = m_frame->view()->rootFrameToContents( 391 LayoutPoint documentPoint = m_frame->view()->rootFrameToContents(
392 flooredIntPoint(targetedEvent.event().positionInRootFrame())); 392 flooredIntPoint(targetedEvent.event().positionInRootFrame()));
393 MouseEventWithHitTestResults mev = 393 MouseEventWithHitTestResults mev =
394 m_frame->document()->performMouseEventHitTest(request, documentPoint, 394 m_frame->document()->performMouseEventHitTest(request, documentPoint,
395 mouseEvent); 395 mouseEvent);
396 m_mouseEventManager->handleMouseFocus( 396 m_mouseEventManager->handleMouseFocus(
397 mev.hitTestResult(), 397 mev.hitTestResult(),
(...skipping 26 matching lines...) Expand all
424 return nullptr; 424 return nullptr;
425 425
426 return &m_frame->page()->frameHost(); 426 return &m_frame->page()->frameHost();
427 } 427 }
428 428
429 TimeTicks GestureManager::getLastShowPressTimestamp() const { 429 TimeTicks GestureManager::getLastShowPressTimestamp() const {
430 return m_lastShowPressTimestamp; 430 return m_lastShowPressTimestamp;
431 } 431 }
432 432
433 } // namespace blink 433 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698