OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |