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

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

Issue 2807123002: Fix the wrong non-element node handling in EventHanlder and MouseEventManager (Closed)
Patch Set: Addressed Created 3 years, 8 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/MouseEventManager.h" 5 #include "core/input/MouseEventManager.h"
6 6
7 #include "core/clipboard/DataObject.h" 7 #include "core/clipboard/DataObject.h"
8 #include "core/clipboard/DataTransfer.h" 8 #include "core/clipboard/DataTransfer.h"
9 #include "core/dom/Element.h" 9 #include "core/dom/Element.h"
10 #include "core/dom/ElementTraversal.h" 10 #include "core/dom/ElementTraversal.h"
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 node_under_mouse_ = nullptr; 87 node_under_mouse_ = nullptr;
88 mouse_press_node_ = nullptr; 88 mouse_press_node_ = nullptr;
89 mouse_down_may_start_autoscroll_ = false; 89 mouse_down_may_start_autoscroll_ = false;
90 mouse_down_may_start_drag_ = false; 90 mouse_down_may_start_drag_ = false;
91 captures_dragging_ = false; 91 captures_dragging_ = false;
92 is_mouse_position_unknown_ = true; 92 is_mouse_position_unknown_ = true;
93 last_known_mouse_position_ = IntPoint(); 93 last_known_mouse_position_ = IntPoint();
94 last_known_mouse_global_position_ = IntPoint(); 94 last_known_mouse_global_position_ = IntPoint();
95 mouse_pressed_ = false; 95 mouse_pressed_ = false;
96 click_count_ = 0; 96 click_count_ = 0;
97 click_node_ = nullptr; 97 click_element_ = nullptr;
98 mouse_down_pos_ = IntPoint(); 98 mouse_down_pos_ = IntPoint();
99 mouse_down_timestamp_ = TimeTicks(); 99 mouse_down_timestamp_ = TimeTicks();
100 mouse_down_ = WebMouseEvent(); 100 mouse_down_ = WebMouseEvent();
101 svg_pan_ = false; 101 svg_pan_ = false;
102 drag_start_pos_ = LayoutPoint(); 102 drag_start_pos_ = LayoutPoint();
103 fake_mouse_move_event_timer_.Stop(); 103 fake_mouse_move_event_timer_.Stop();
104 ResetDragState(); 104 ResetDragState();
105 } 105 }
106 106
107 MouseEventManager::~MouseEventManager() = default; 107 MouseEventManager::~MouseEventManager() = default;
108 108
109 DEFINE_TRACE(MouseEventManager) { 109 DEFINE_TRACE(MouseEventManager) {
110 visitor->Trace(frame_); 110 visitor->Trace(frame_);
111 visitor->Trace(scroll_manager_); 111 visitor->Trace(scroll_manager_);
112 visitor->Trace(node_under_mouse_); 112 visitor->Trace(node_under_mouse_);
113 visitor->Trace(mouse_press_node_); 113 visitor->Trace(mouse_press_node_);
114 visitor->Trace(click_node_); 114 visitor->Trace(click_element_);
115 SynchronousMutationObserver::Trace(visitor); 115 SynchronousMutationObserver::Trace(visitor);
116 } 116 }
117 117
118 MouseEventManager::MouseEventBoundaryEventDispatcher:: 118 MouseEventManager::MouseEventBoundaryEventDispatcher::
119 MouseEventBoundaryEventDispatcher(MouseEventManager* mouse_event_manager, 119 MouseEventBoundaryEventDispatcher(MouseEventManager* mouse_event_manager,
120 const WebMouseEvent* web_mouse_event, 120 const WebMouseEvent* web_mouse_event,
121 EventTarget* exited_target, 121 EventTarget* exited_target,
122 const String& canvas_region_id) 122 const String& canvas_region_id)
123 : mouse_event_manager_(mouse_event_manager), 123 : mouse_event_manager_(mouse_event_manager),
124 web_mouse_event_(web_mouse_event), 124 web_mouse_event_(web_mouse_event),
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 target_node = FlatTreeTraversal::Parent(*target_node); 226 target_node = FlatTreeTraversal::Parent(*target_node);
227 227
228 SetNodeUnderMouse(target_node, canvas_region_id, web_mouse_event); 228 SetNodeUnderMouse(target_node, canvas_region_id, web_mouse_event);
229 229
230 return DispatchMouseEvent(node_under_mouse_, event_type, web_mouse_event, 230 return DispatchMouseEvent(node_under_mouse_, event_type, web_mouse_event,
231 canvas_region_id, nullptr); 231 canvas_region_id, nullptr);
232 } 232 }
233 233
234 WebInputEventResult MouseEventManager::DispatchMouseClickIfNeeded( 234 WebInputEventResult MouseEventManager::DispatchMouseClickIfNeeded(
235 const MouseEventWithHitTestResults& mev, 235 const MouseEventWithHitTestResults& mev,
236 Node* release_node) { 236 Element& mouse_release_target) {
237 // We only prevent click event when the click may cause contextmenu to popup. 237 // We only prevent click event when the click may cause contextmenu to popup.
238 // However, we always send auxclick. 238 // However, we always send auxclick.
239 bool context_menu_event = 239 bool context_menu_event =
240 !RuntimeEnabledFeatures::auxclickEnabled() && 240 !RuntimeEnabledFeatures::auxclickEnabled() &&
241 mev.Event().button == WebPointerProperties::Button::kRight; 241 mev.Event().button == WebPointerProperties::Button::kRight;
242 #if OS(MACOSX) 242 #if OS(MACOSX)
243 // FIXME: The Mac port achieves the same behavior by checking whether the 243 // FIXME: The Mac port achieves the same behavior by checking whether the
244 // context menu is currently open in WebPage::mouseEvent(). Consider merging 244 // context menu is currently open in WebPage::mouseEvent(). Consider merging
245 // the implementations. 245 // the implementations.
246 if (mev.Event().button == WebPointerProperties::Button::kLeft && 246 if (mev.Event().button == WebPointerProperties::Button::kLeft &&
247 mev.Event().GetModifiers() & WebInputEvent::Modifiers::kControlKey) 247 mev.Event().GetModifiers() & WebInputEvent::Modifiers::kControlKey)
248 context_menu_event = true; 248 context_menu_event = true;
249 #endif 249 #endif
250 250
251 WebInputEventResult click_event_result = WebInputEventResult::kNotHandled;
252 const bool should_dispatch_click_event = 251 const bool should_dispatch_click_event =
253 click_count_ > 0 && !context_menu_event && release_node && click_node_ && 252 click_count_ > 0 && !context_menu_event && click_element_ &&
254 release_node->CanParticipateInFlatTree() && 253 mouse_release_target.CanParticipateInFlatTree() &&
255 click_node_->CanParticipateInFlatTree() && 254 click_element_->CanParticipateInFlatTree() &&
256 !(frame_->GetEventHandler() 255 !(frame_->GetEventHandler()
257 .GetSelectionController() 256 .GetSelectionController()
258 .HasExtendedSelection() && 257 .HasExtendedSelection() &&
259 IsLinkSelection(mev)); 258 IsLinkSelection(mev));
260 if (should_dispatch_click_event) { 259 if (!should_dispatch_click_event)
261 Node* click_target_node = nullptr; 260 return WebInputEventResult::kNotHandled;
262 if (click_node_ == release_node) { 261
263 click_target_node = click_node_; 262 Node* click_target_node = nullptr;
264 } else if (click_node_->GetDocument() == release_node->GetDocument()) { 263 if (click_element_ == mouse_release_target) {
265 // Updates distribution because a 'mouseup' event listener can make the 264 click_target_node = click_element_;
266 // tree dirty at dispatchMouseEvent() invocation above. 265 } else if (click_element_->GetDocument() ==
267 // Unless distribution is updated, commonAncestor would hit ASSERT. 266 mouse_release_target.GetDocument()) {
268 click_node_->UpdateDistribution(); 267 // Updates distribution because a 'mouseup' event listener can make the
269 release_node->UpdateDistribution(); 268 // tree dirty at dispatchMouseEvent() invocation above.
270 click_target_node = release_node->CommonAncestor( 269 // Unless distribution is updated, commonAncestor would hit ASSERT.
271 *click_node_, EventHandlingUtil::ParentForClickEvent); 270 click_element_->UpdateDistribution();
272 } 271 mouse_release_target.UpdateDistribution();
273 if (click_target_node) { 272 click_target_node = mouse_release_target.CommonAncestor(
274 click_event_result = DispatchMouseEvent( 273 *click_element_, EventHandlingUtil::ParentForClickEvent);
275 click_target_node,
276 !RuntimeEnabledFeatures::auxclickEnabled() ||
277 (mev.Event().button == WebPointerProperties::Button::kLeft)
278 ? EventTypeNames::click
279 : EventTypeNames::auxclick,
280 mev.Event(), mev.CanvasRegionId(), nullptr);
281 }
282 } 274 }
283 return click_event_result; 275 if (!click_target_node)
276 return WebInputEventResult::kNotHandled;
277 return DispatchMouseEvent(
278 click_target_node,
279 !RuntimeEnabledFeatures::auxclickEnabled() ||
280 (mev.Event().button == WebPointerProperties::Button::kLeft)
281 ? EventTypeNames::click
282 : EventTypeNames::auxclick,
283 mev.Event(), mev.CanvasRegionId(), nullptr);
284 } 284 }
285 285
286 void MouseEventManager::FakeMouseMoveEventTimerFired(TimerBase* timer) { 286 void MouseEventManager::FakeMouseMoveEventTimerFired(TimerBase* timer) {
287 TRACE_EVENT0("input", "MouseEventManager::fakeMouseMoveEventTimerFired"); 287 TRACE_EVENT0("input", "MouseEventManager::fakeMouseMoveEventTimerFired");
288 DCHECK(timer == &fake_mouse_move_event_timer_); 288 DCHECK(timer == &fake_mouse_move_event_timer_);
289 DCHECK(!mouse_pressed_); 289 DCHECK(!mouse_pressed_);
290 290
291 if (is_mouse_position_unknown_) 291 if (is_mouse_position_unknown_)
292 return; 292 return;
293 293
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 if (last_node_under_mouse && 374 if (last_node_under_mouse &&
375 last_node_under_mouse->GetDocument() != frame_->GetDocument()) { 375 last_node_under_mouse->GetDocument() != frame_->GetDocument()) {
376 last_node_under_mouse = nullptr; 376 last_node_under_mouse = nullptr;
377 } 377 }
378 378
379 SendBoundaryEvents(last_node_under_mouse, node_under_mouse_, canvas_region_id, 379 SendBoundaryEvents(last_node_under_mouse, node_under_mouse_, canvas_region_id,
380 web_mouse_event); 380 web_mouse_event);
381 } 381 }
382 382
383 void MouseEventManager::NodeChildrenWillBeRemoved(ContainerNode& container) { 383 void MouseEventManager::NodeChildrenWillBeRemoved(ContainerNode& container) {
384 if (container == click_node_) 384 if (container == click_element_)
385 return; 385 return;
386 if (!container.IsShadowIncludingInclusiveAncestorOf(click_node_.Get())) 386 if (!container.IsShadowIncludingInclusiveAncestorOf(click_element_.Get()))
387 return; 387 return;
388 click_node_ = nullptr; 388 click_element_ = nullptr;
389 } 389 }
390 390
391 void MouseEventManager::NodeWillBeRemoved(Node& node_to_be_removed) { 391 void MouseEventManager::NodeWillBeRemoved(Node& node_to_be_removed) {
392 if (node_to_be_removed.IsShadowIncludingInclusiveAncestorOf( 392 if (node_to_be_removed.IsShadowIncludingInclusiveAncestorOf(
393 click_node_.Get())) { 393 click_element_.Get())) {
394 // We don't dispatch click events if the mousedown node is removed 394 // We don't dispatch click events if the mousedown node is removed
395 // before a mouseup event. It is compatible with IE and Firefox. 395 // before a mouseup event. It is compatible with IE and Firefox.
396 click_node_ = nullptr; 396 click_element_ = nullptr;
397 } 397 }
398 } 398 }
399 399
400 Node* MouseEventManager::GetNodeUnderMouse() { 400 Node* MouseEventManager::GetNodeUnderMouse() {
401 return node_under_mouse_; 401 return node_under_mouse_;
402 } 402 }
403 403
404 WebInputEventResult MouseEventManager::HandleMouseFocus( 404 WebInputEventResult MouseEventManager::HandleMouseFocus(
405 const HitTestResult& hit_test_result, 405 const HitTestResult& hit_test_result,
406 InputDeviceCapabilities* source_capabilities) { 406 InputDeviceCapabilities* source_capabilities) {
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 if (!svg_pan_) 998 if (!svg_pan_)
999 return false; 999 return false;
1000 svg_pan_ = !is_release_event; 1000 svg_pan_ = !is_release_event;
1001 frame_->GetDocument()->AccessSVGExtensions().UpdatePan( 1001 frame_->GetDocument()->AccessSVGExtensions().UpdatePan(
1002 frame_->View()->RootFrameToContents(last_known_mouse_position_)); 1002 frame_->View()->RootFrameToContents(last_known_mouse_position_));
1003 return true; 1003 return true;
1004 } 1004 }
1005 1005
1006 void MouseEventManager::InvalidateClick() { 1006 void MouseEventManager::InvalidateClick() {
1007 click_count_ = 0; 1007 click_count_ = 0;
1008 click_node_ = nullptr; 1008 click_element_ = nullptr;
1009 } 1009 }
1010 1010
1011 bool MouseEventManager::MousePressed() { 1011 bool MouseEventManager::MousePressed() {
1012 return mouse_pressed_; 1012 return mouse_pressed_;
1013 } 1013 }
1014 1014
1015 void MouseEventManager::SetMousePressed(bool mouse_pressed) { 1015 void MouseEventManager::SetMousePressed(bool mouse_pressed) {
1016 mouse_pressed_ = mouse_pressed; 1016 mouse_pressed_ = mouse_pressed;
1017 } 1017 }
1018 1018
1019 bool MouseEventManager::CapturesDragging() const { 1019 bool MouseEventManager::CapturesDragging() const {
1020 return captures_dragging_; 1020 return captures_dragging_;
1021 } 1021 }
1022 1022
1023 void MouseEventManager::SetCapturesDragging(bool captures_dragging) { 1023 void MouseEventManager::SetCapturesDragging(bool captures_dragging) {
1024 captures_dragging_ = captures_dragging; 1024 captures_dragging_ = captures_dragging;
1025 } 1025 }
1026 1026
1027 Node* MouseEventManager::MousePressNode() { 1027 Node* MouseEventManager::MousePressNode() {
1028 return mouse_press_node_; 1028 return mouse_press_node_;
1029 } 1029 }
1030 1030
1031 void MouseEventManager::SetMousePressNode(Node* node) { 1031 void MouseEventManager::SetMousePressNode(Node* node) {
1032 mouse_press_node_ = node; 1032 mouse_press_node_ = node;
1033 } 1033 }
1034 1034
1035 void MouseEventManager::SetClickNode(Node* node) { 1035 void MouseEventManager::SetClickElement(Element* element) {
1036 SetContext(node ? node->ownerDocument() : nullptr); 1036 SetContext(element ? element->ownerDocument() : nullptr);
1037 click_node_ = node; 1037 click_element_ = element;
1038 } 1038 }
1039 1039
1040 void MouseEventManager::SetClickCount(int click_count) { 1040 void MouseEventManager::SetClickCount(int click_count) {
1041 click_count_ = click_count; 1041 click_count_ = click_count;
1042 } 1042 }
1043 1043
1044 bool MouseEventManager::MouseDownMayStartDrag() { 1044 bool MouseEventManager::MouseDownMayStartDrag() {
1045 return mouse_down_may_start_drag_; 1045 return mouse_down_may_start_drag_;
1046 } 1046 }
1047 1047
1048 } // namespace blink 1048 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698