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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 LocalFrame* main_frame = frame_->LocalFrameRoot(); | 178 LocalFrame* main_frame = frame_->LocalFrameRoot(); |
179 if (main_frame && main_frame->View()) | 179 if (main_frame && main_frame->View()) |
180 main_frame->View()->UpdateLifecycleToCompositingCleanPlusScrolling(); | 180 main_frame->View()->UpdateLifecycleToCompositingCleanPlusScrolling(); |
181 adjusted_point = frame_view->RootFrameToContents( | 181 adjusted_point = frame_view->RootFrameToContents( |
182 FlooredIntPoint(gesture_event.PositionInRootFrame())); | 182 FlooredIntPoint(gesture_event.PositionInRootFrame())); |
183 current_hit_test = EventHandlingUtil::HitTestResultInFrame( | 183 current_hit_test = EventHandlingUtil::HitTestResultInFrame( |
184 frame_, adjusted_point, hit_type); | 184 frame_, adjusted_point, hit_type); |
185 } | 185 } |
186 | 186 |
187 // Capture data for showUnhandledTapUIIfNeeded. | 187 // Capture data for showUnhandledTapUIIfNeeded. |
188 Node* tapped_node = current_hit_test.InnerNode(); | |
189 IntPoint tapped_position = | 188 IntPoint tapped_position = |
190 FlooredIntPoint(gesture_event.PositionInRootFrame()); | 189 FlooredIntPoint(gesture_event.PositionInRootFrame()); |
191 Node* tapped_non_text_node = tapped_node; | |
192 UserGestureIndicator gesture_indicator(DocumentUserGestureToken::Create( | 190 UserGestureIndicator gesture_indicator(DocumentUserGestureToken::Create( |
193 tapped_node ? &tapped_node->GetDocument() : nullptr)); | 191 current_hit_test.InnerNode() |
192 ? ¤t_hit_test.InnerNode()->GetDocument() | |
193 : nullptr)); | |
194 | 194 |
195 if (tapped_non_text_node && tapped_non_text_node->IsTextNode()) | 195 Node* tapped_node = current_hit_test.InnerNode(); |
196 tapped_non_text_node = FlatTreeTraversal::Parent(*tapped_non_text_node); | 196 Element* tapped_element = |
197 | 197 EventHandlingUtil::ParentElementIfNeeded(tapped_node); |
198 mouse_event_manager_->SetClickNode(tapped_non_text_node); | 198 mouse_event_manager_->SetClickElement(tapped_element); |
199 | 199 |
200 WebMouseEvent fake_mouse_down( | 200 WebMouseEvent fake_mouse_down( |
201 WebInputEvent::kMouseDown, gesture_event, | 201 WebInputEvent::kMouseDown, gesture_event, |
202 WebPointerProperties::Button::kLeft, gesture_event.TapCount(), | 202 WebPointerProperties::Button::kLeft, gesture_event.TapCount(), |
203 static_cast<WebInputEvent::Modifiers>( | 203 static_cast<WebInputEvent::Modifiers>( |
204 modifiers | WebInputEvent::Modifiers::kLeftButtonDown | | 204 modifiers | WebInputEvent::Modifiers::kLeftButtonDown | |
205 WebInputEvent::Modifiers::kIsCompatibilityEventForTouch), | 205 WebInputEvent::Modifiers::kIsCompatibilityEventForTouch), |
206 gesture_event.TimeStampSeconds()); | 206 gesture_event.TimeStampSeconds()); |
207 | 207 |
208 // TODO(mustaq): We suppress MEs plus all it's side effects. What would that | 208 // TODO(mustaq): We suppress MEs plus all it's side effects. What would that |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
255 modifiers | WebInputEvent::Modifiers::kIsCompatibilityEventForTouch), | 255 modifiers | WebInputEvent::Modifiers::kIsCompatibilityEventForTouch), |
256 gesture_event.TimeStampSeconds()); | 256 gesture_event.TimeStampSeconds()); |
257 WebInputEventResult mouse_up_event_result = | 257 WebInputEventResult mouse_up_event_result = |
258 suppress_mouse_events_from_gestures_ | 258 suppress_mouse_events_from_gestures_ |
259 ? WebInputEventResult::kHandledSuppressed | 259 ? WebInputEventResult::kHandledSuppressed |
260 : mouse_event_manager_->SetMousePositionAndDispatchMouseEvent( | 260 : mouse_event_manager_->SetMousePositionAndDispatchMouseEvent( |
261 current_hit_test.InnerNode(), current_hit_test.CanvasRegionId(), | 261 current_hit_test.InnerNode(), current_hit_test.CanvasRegionId(), |
262 EventTypeNames::mouseup, fake_mouse_up); | 262 EventTypeNames::mouseup, fake_mouse_up); |
263 | 263 |
264 WebInputEventResult click_event_result = WebInputEventResult::kNotHandled; | 264 WebInputEventResult click_event_result = WebInputEventResult::kNotHandled; |
265 if (tapped_non_text_node) { | 265 if (tapped_element) { |
266 if (current_hit_test.InnerNode()) { | 266 if (current_hit_test.InnerNode()) { |
267 // Updates distribution because a mouseup (or mousedown) event listener | 267 // Updates distribution because a mouseup (or mousedown) event listener |
268 // can make the tree dirty at dispatchMouseEvent() invocation above. | 268 // can make the tree dirty at dispatchMouseEvent() invocation above. |
269 // Unless distribution is updated, commonAncestor would hit DCHECK. Both | 269 // Unless distribution is updated, commonAncestor would hit DCHECK. Both |
270 // tappedNonTextNode and currentHitTest.innerNode()) don't need to be | 270 // tappedNonTextNode and currentHitTest.innerNode()) don't need to be |
271 // updated because commonAncestor() will exit early if their documents are | 271 // updated because commonAncestor() will exit early if their documents are |
272 // different. | 272 // different. |
273 tapped_non_text_node->UpdateDistribution(); | 273 tapped_element->UpdateDistribution(); |
274 Node* click_target_node = current_hit_test.InnerNode()->CommonAncestor( | 274 Node* click_target_node = current_hit_test.InnerNode()->CommonAncestor( |
275 *tapped_non_text_node, EventHandlingUtil::ParentForClickEvent); | 275 *tapped_element, EventHandlingUtil::ParentForClickEvent); |
276 click_event_result = | 276 click_event_result = |
277 mouse_event_manager_->SetMousePositionAndDispatchMouseEvent( | 277 mouse_event_manager_->SetMousePositionAndDispatchMouseEvent( |
278 click_target_node, String(), EventTypeNames::click, | 278 click_target_node, String(), EventTypeNames::click, |
279 fake_mouse_up); | 279 fake_mouse_up); |
280 } | 280 } |
281 mouse_event_manager_->SetClickNode(nullptr); | 281 mouse_event_manager_->SetClickElement(nullptr); |
282 } | 282 } |
283 | 283 |
284 if (mouse_up_event_result == WebInputEventResult::kNotHandled) | 284 if (mouse_up_event_result == WebInputEventResult::kNotHandled) |
285 mouse_up_event_result = mouse_event_manager_->HandleMouseReleaseEvent( | 285 mouse_up_event_result = mouse_event_manager_->HandleMouseReleaseEvent( |
286 MouseEventWithHitTestResults(fake_mouse_up, current_hit_test)); | 286 MouseEventWithHitTestResults(fake_mouse_up, current_hit_test)); |
287 mouse_event_manager_->ClearDragHeuristicState(); | 287 mouse_event_manager_->ClearDragHeuristicState(); |
288 | 288 |
289 WebInputEventResult event_result = EventHandlingUtil::MergeEventResult( | 289 WebInputEventResult event_result = EventHandlingUtil::MergeEventResult( |
290 EventHandlingUtil::MergeEventResult(mouse_down_event_result, | 290 EventHandlingUtil::MergeEventResult(mouse_down_event_result, |
291 mouse_up_event_result), | 291 mouse_up_event_result), |
292 click_event_result); | 292 click_event_result); |
293 if (event_result == WebInputEventResult::kNotHandled && tapped_node && | 293 if (event_result == WebInputEventResult::kNotHandled && tapped_element && |
Donn Denman
2017/04/12 17:12:19
Nit: I wonder if it would be better to test the ta
hayato
2017/04/13 05:01:40
Nice catch. tapped_node should be better.
Done.
| |
294 frame_->GetPage()) { | 294 frame_->GetPage()) { |
295 bool dom_tree_changed = pre_dispatch_dom_tree_version != | 295 bool dom_tree_changed = pre_dispatch_dom_tree_version != |
296 frame_->GetDocument()->DomTreeVersion(); | 296 frame_->GetDocument()->DomTreeVersion(); |
297 bool style_changed = | 297 bool style_changed = |
298 pre_dispatch_style_version != frame_->GetDocument()->StyleVersion(); | 298 pre_dispatch_style_version != frame_->GetDocument()->StyleVersion(); |
299 | 299 |
300 IntPoint tapped_position_in_viewport = | 300 IntPoint tapped_position_in_viewport = |
301 frame_->GetPage()->GetVisualViewport().RootFrameToViewport( | 301 frame_->GetPage()->GetVisualViewport().RootFrameToViewport( |
302 tapped_position); | 302 tapped_position); |
303 frame_->GetChromeClient().ShowUnhandledTapUIIfNeeded( | 303 frame_->GetChromeClient().ShowUnhandledTapUIIfNeeded( |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
432 } | 432 } |
433 return WebInputEventResult::kNotHandled; | 433 return WebInputEventResult::kNotHandled; |
434 } | 434 } |
435 | 435 |
436 WTF::Optional<WTF::TimeTicks> GestureManager::GetLastShowPressTimestamp() | 436 WTF::Optional<WTF::TimeTicks> GestureManager::GetLastShowPressTimestamp() |
437 const { | 437 const { |
438 return last_show_press_timestamp_; | 438 return last_show_press_timestamp_; |
439 } | 439 } |
440 | 440 |
441 } // namespace blink | 441 } // namespace blink |
OLD | NEW |