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

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

Issue 2936023002: MouseWheelEventManager is added to handle wheel events. (Closed)
Patch Set: Created 3 years, 6 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 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 #include "core/editing/Editor.h" 44 #include "core/editing/Editor.h"
45 #include "core/editing/FrameSelection.h" 45 #include "core/editing/FrameSelection.h"
46 #include "core/editing/SelectionController.h" 46 #include "core/editing/SelectionController.h"
47 #include "core/events/EventPath.h" 47 #include "core/events/EventPath.h"
48 #include "core/events/GestureEvent.h" 48 #include "core/events/GestureEvent.h"
49 #include "core/events/KeyboardEvent.h" 49 #include "core/events/KeyboardEvent.h"
50 #include "core/events/MouseEvent.h" 50 #include "core/events/MouseEvent.h"
51 #include "core/events/PointerEvent.h" 51 #include "core/events/PointerEvent.h"
52 #include "core/events/TextEvent.h" 52 #include "core/events/TextEvent.h"
53 #include "core/events/TouchEvent.h" 53 #include "core/events/TouchEvent.h"
54 #include "core/events/WheelEvent.h"
55 #include "core/frame/Deprecation.h" 54 #include "core/frame/Deprecation.h"
56 #include "core/frame/EventHandlerRegistry.h" 55 #include "core/frame/EventHandlerRegistry.h"
57 #include "core/frame/LocalFrame.h" 56 #include "core/frame/LocalFrame.h"
58 #include "core/frame/LocalFrameClient.h" 57 #include "core/frame/LocalFrameClient.h"
59 #include "core/frame/LocalFrameView.h" 58 #include "core/frame/LocalFrameView.h"
60 #include "core/frame/Settings.h" 59 #include "core/frame/Settings.h"
61 #include "core/frame/UseCounter.h" 60 #include "core/frame/UseCounter.h"
62 #include "core/frame/VisualViewport.h" 61 #include "core/frame/VisualViewport.h"
63 #include "core/html/HTMLDialogElement.h" 62 #include "core/html/HTMLDialogElement.h"
64 #include "core/html/HTMLFrameElementBase.h" 63 #include "core/html/HTMLFrameElementBase.h"
65 #include "core/html/HTMLFrameSetElement.h" 64 #include "core/html/HTMLFrameSetElement.h"
66 #include "core/html/HTMLInputElement.h" 65 #include "core/html/HTMLInputElement.h"
67 #include "core/input/EventHandlingUtil.h" 66 #include "core/input/EventHandlingUtil.h"
68 #include "core/input/InputDeviceCapabilities.h" 67 #include "core/input/InputDeviceCapabilities.h"
69 #include "core/input/TouchActionUtil.h" 68 #include "core/input/TouchActionUtil.h"
70 #include "core/layout/HitTestRequest.h" 69 #include "core/layout/HitTestRequest.h"
71 #include "core/layout/HitTestResult.h" 70 #include "core/layout/HitTestResult.h"
72 #include "core/layout/LayoutEmbeddedContent.h"
73 #include "core/layout/LayoutView.h" 71 #include "core/layout/LayoutView.h"
74 #include "core/layout/api/LayoutViewItem.h" 72 #include "core/layout/api/LayoutViewItem.h"
75 #include "core/loader/DocumentLoader.h" 73 #include "core/loader/DocumentLoader.h"
76 #include "core/loader/FrameLoader.h" 74 #include "core/loader/FrameLoader.h"
77 #include "core/loader/resource/ImageResourceContent.h" 75 #include "core/loader/resource/ImageResourceContent.h"
78 #include "core/page/AutoscrollController.h" 76 #include "core/page/AutoscrollController.h"
79 #include "core/page/ChromeClient.h" 77 #include "core/page/ChromeClient.h"
80 #include "core/page/DragState.h" 78 #include "core/page/DragState.h"
81 #include "core/page/FocusController.h" 79 #include "core/page/FocusController.h"
82 #include "core/page/FrameTree.h" 80 #include "core/page/FrameTree.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 this, 183 this,
186 &EventHandler::HoverTimerFired), 184 &EventHandler::HoverTimerFired),
187 cursor_update_timer_( 185 cursor_update_timer_(
188 TaskRunnerHelper::Get(TaskType::kUnspecedTimer, &frame), 186 TaskRunnerHelper::Get(TaskType::kUnspecedTimer, &frame),
189 this, 187 this,
190 &EventHandler::CursorUpdateTimerFired), 188 &EventHandler::CursorUpdateTimerFired),
191 event_handler_will_reset_capturing_mouse_events_node_(0), 189 event_handler_will_reset_capturing_mouse_events_node_(0),
192 should_only_fire_drag_over_event_(false), 190 should_only_fire_drag_over_event_(false),
193 scroll_manager_(new ScrollManager(frame)), 191 scroll_manager_(new ScrollManager(frame)),
194 mouse_event_manager_(new MouseEventManager(frame, *scroll_manager_)), 192 mouse_event_manager_(new MouseEventManager(frame, *scroll_manager_)),
193 mouse_wheel_event_manager_(
194 new MouseWheelEventManager(frame, *scroll_manager_)),
195 keyboard_event_manager_( 195 keyboard_event_manager_(
196 new KeyboardEventManager(frame, *scroll_manager_)), 196 new KeyboardEventManager(frame, *scroll_manager_)),
197 pointer_event_manager_( 197 pointer_event_manager_(
198 new PointerEventManager(frame, *mouse_event_manager_)), 198 new PointerEventManager(frame, *mouse_event_manager_)),
199 gesture_manager_(new GestureManager(frame, 199 gesture_manager_(new GestureManager(frame,
200 *scroll_manager_, 200 *scroll_manager_,
201 *mouse_event_manager_, 201 *mouse_event_manager_,
202 *pointer_event_manager_, 202 *pointer_event_manager_,
203 *selection_controller_)), 203 *selection_controller_)),
204 active_interval_timer_( 204 active_interval_timer_(
205 TaskRunnerHelper::Get(TaskType::kUserInteraction, &frame), 205 TaskRunnerHelper::Get(TaskType::kUserInteraction, &frame),
206 this, 206 this,
207 &EventHandler::ActiveIntervalTimerFired) {} 207 &EventHandler::ActiveIntervalTimerFired) {}
208 208
209 DEFINE_TRACE(EventHandler) { 209 DEFINE_TRACE(EventHandler) {
210 visitor->Trace(frame_); 210 visitor->Trace(frame_);
211 visitor->Trace(selection_controller_); 211 visitor->Trace(selection_controller_);
212 visitor->Trace(capturing_mouse_events_node_); 212 visitor->Trace(capturing_mouse_events_node_);
213 visitor->Trace(last_mouse_move_event_subframe_); 213 visitor->Trace(last_mouse_move_event_subframe_);
214 visitor->Trace(last_scrollbar_under_mouse_); 214 visitor->Trace(last_scrollbar_under_mouse_);
215 visitor->Trace(drag_target_); 215 visitor->Trace(drag_target_);
216 visitor->Trace(frame_set_being_resized_); 216 visitor->Trace(frame_set_being_resized_);
217 visitor->Trace(scroll_manager_); 217 visitor->Trace(scroll_manager_);
218 visitor->Trace(mouse_event_manager_); 218 visitor->Trace(mouse_event_manager_);
219 visitor->Trace(mouse_wheel_event_manager_);
219 visitor->Trace(keyboard_event_manager_); 220 visitor->Trace(keyboard_event_manager_);
220 visitor->Trace(pointer_event_manager_); 221 visitor->Trace(pointer_event_manager_);
221 visitor->Trace(gesture_manager_); 222 visitor->Trace(gesture_manager_);
222 visitor->Trace(last_deferred_tap_element_); 223 visitor->Trace(last_deferred_tap_element_);
223 } 224 }
224 225
225 void EventHandler::Clear() { 226 void EventHandler::Clear() {
226 hover_timer_.Stop(); 227 hover_timer_.Stop();
227 cursor_update_timer_.Stop(); 228 cursor_update_timer_.Stop();
228 active_interval_timer_.Stop(); 229 active_interval_timer_.Stop();
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 } 328 }
328 329
329 IntPoint EventHandler::DragDataTransferLocationForTesting() { 330 IntPoint EventHandler::DragDataTransferLocationForTesting() {
330 if (mouse_event_manager_->GetDragState().drag_data_transfer_) 331 if (mouse_event_manager_->GetDragState().drag_data_transfer_)
331 return mouse_event_manager_->GetDragState() 332 return mouse_event_manager_->GetDragState()
332 .drag_data_transfer_->DragLocation(); 333 .drag_data_transfer_->DragLocation();
333 334
334 return IntPoint(); 335 return IntPoint();
335 } 336 }
336 337
337 static LocalFrame* SubframeForTargetNode(Node* node) {
338 if (!node)
339 return nullptr;
340
341 LayoutObject* layout_object = node->GetLayoutObject();
342 if (!layout_object || !layout_object->IsLayoutEmbeddedContent())
343 return nullptr;
344
345 LocalFrameView* frame_view =
346 ToLayoutEmbeddedContent(layout_object)->ChildFrameView();
347 if (!frame_view)
348 return nullptr;
349
350 return &frame_view->GetFrame();
351 }
352
353 static LocalFrame* SubframeForHitTestResult( 338 static LocalFrame* SubframeForHitTestResult(
bokan 2017/06/14 15:23:29 Probably makes sense to move this to EventHandling
sahel 2017/06/14 15:56:34 Done.
354 const MouseEventWithHitTestResults& hit_test_result) { 339 const MouseEventWithHitTestResults& hit_test_result) {
355 if (!hit_test_result.IsOverEmbeddedContentView()) 340 if (!hit_test_result.IsOverEmbeddedContentView())
356 return nullptr; 341 return nullptr;
357 return SubframeForTargetNode(hit_test_result.InnerNode()); 342 return EventHandlingUtil::SubframeForTargetNode(hit_test_result.InnerNode());
358 } 343 }
359 344
360 static bool IsSubmitImage(Node* node) { 345 static bool IsSubmitImage(Node* node) {
361 return isHTMLInputElement(node) && 346 return isHTMLInputElement(node) &&
362 toHTMLInputElement(node)->type() == InputTypeNames::image; 347 toHTMLInputElement(node)->type() == InputTypeNames::image;
363 } 348 }
364 349
365 bool EventHandler::UseHandCursor(Node* node, bool is_over_link) { 350 bool EventHandler::UseHandCursor(Node* node, bool is_over_link) {
366 if (!node) 351 if (!node)
367 return false; 352 return false;
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 if (!scrollbar) 846 if (!scrollbar)
862 scrollbar = mev.GetScrollbar(); 847 scrollbar = mev.GetScrollbar();
863 848
864 UpdateLastScrollbarUnderMouse(scrollbar, 849 UpdateLastScrollbarUnderMouse(scrollbar,
865 !mouse_event_manager_->MousePressed()); 850 !mouse_event_manager_->MousePressed());
866 if (only_update_scrollbars) 851 if (only_update_scrollbars)
867 return WebInputEventResult::kHandledSuppressed; 852 return WebInputEventResult::kHandledSuppressed;
868 } 853 }
869 854
870 WebInputEventResult event_result = WebInputEventResult::kNotHandled; 855 WebInputEventResult event_result = WebInputEventResult::kNotHandled;
871 LocalFrame* new_subframe = 856 LocalFrame* new_subframe = capturing_mouse_events_node_.Get()
872 capturing_mouse_events_node_.Get() 857 ? EventHandlingUtil::SubframeForTargetNode(
873 ? SubframeForTargetNode(capturing_mouse_events_node_.Get()) 858 capturing_mouse_events_node_.Get())
874 : SubframeForHitTestResult(mev); 859 : SubframeForHitTestResult(mev);
875 860
876 // We want mouseouts to happen first, from the inside out. First send a move 861 // We want mouseouts to happen first, from the inside out. First send a move
877 // event to the last subframe so that it will fire mouseouts. 862 // event to the last subframe so that it will fire mouseouts.
878 if (last_mouse_move_event_subframe_ && 863 if (last_mouse_move_event_subframe_ &&
879 last_mouse_move_event_subframe_->Tree().IsDescendantOf(frame_) && 864 last_mouse_move_event_subframe_->Tree().IsDescendantOf(frame_) &&
880 last_mouse_move_event_subframe_ != new_subframe) 865 last_mouse_move_event_subframe_ != new_subframe)
881 last_mouse_move_event_subframe_->GetEventHandler().HandleMouseLeaveEvent( 866 last_mouse_move_event_subframe_->GetEventHandler().HandleMouseLeaveEvent(
882 mev.Event()); 867 mev.Event());
883 868
884 if (new_subframe) { 869 if (new_subframe) {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 } 945 }
961 946
962 // Mouse events simulated from touch should not hit-test again. 947 // Mouse events simulated from touch should not hit-test again.
963 DCHECK(!mouse_event.FromTouch()); 948 DCHECK(!mouse_event.FromTouch());
964 949
965 HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kRelease; 950 HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kRelease;
966 HitTestRequest request(hit_type); 951 HitTestRequest request(hit_type);
967 MouseEventWithHitTestResults mev = 952 MouseEventWithHitTestResults mev =
968 EventHandlingUtil::PerformMouseEventHitTest(frame_, request, mouse_event); 953 EventHandlingUtil::PerformMouseEventHitTest(frame_, request, mouse_event);
969 Element* mouse_release_target = mev.InnerElement(); 954 Element* mouse_release_target = mev.InnerElement();
970 LocalFrame* subframe = 955 LocalFrame* subframe = capturing_mouse_events_node_.Get()
971 capturing_mouse_events_node_.Get() 956 ? EventHandlingUtil::SubframeForTargetNode(
972 ? SubframeForTargetNode(capturing_mouse_events_node_.Get()) 957 capturing_mouse_events_node_.Get())
973 : SubframeForHitTestResult(mev); 958 : SubframeForHitTestResult(mev);
974 if (event_handler_will_reset_capturing_mouse_events_node_) 959 if (event_handler_will_reset_capturing_mouse_events_node_)
975 capturing_mouse_events_node_ = nullptr; 960 capturing_mouse_events_node_ = nullptr;
976 if (subframe) 961 if (subframe)
977 return PassMouseReleaseEventToSubframe(mev, subframe); 962 return PassMouseReleaseEventToSubframe(mev, subframe);
978 963
979 // Mouse events will be associated with the Document where mousedown 964 // Mouse events will be associated with the Document where mousedown
980 // occurred. If, e.g., there is a mousedown, then a drag to a different 965 // occurred. If, e.g., there is a mousedown, then a drag to a different
981 // Document and mouseup there, the mouseup's gesture will be associated with 966 // Document and mouseup there, the mouseup's gesture will be associated with
982 // the mousedown's Document. It's not absolutely certain that this is the 967 // the mousedown's Document. It's not absolutely certain that this is the
983 // correct behavior. 968 // correct behavior.
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 mouse_event_type == EventTypeNames::mouseup); 1243 mouse_event_type == EventTypeNames::mouseup);
1259 1244
1260 const auto& event_result = pointer_event_manager_->SendMousePointerEvent( 1245 const auto& event_result = pointer_event_manager_->SendMousePointerEvent(
1261 UpdateMouseEventTargetNode(target_node), canvas_region_id, 1246 UpdateMouseEventTargetNode(target_node), canvas_region_id,
1262 mouse_event_type, mouse_event, coalesced_events); 1247 mouse_event_type, mouse_event, coalesced_events);
1263 return event_result; 1248 return event_result;
1264 } 1249 }
1265 1250
1266 WebInputEventResult EventHandler::HandleWheelEvent( 1251 WebInputEventResult EventHandler::HandleWheelEvent(
1267 const WebMouseWheelEvent& event) { 1252 const WebMouseWheelEvent& event) {
1268 #if OS(MACOSX) 1253 return mouse_wheel_event_manager_->HandleWheelEvent(event);
1269 // Filter Mac OS specific phases, usually with a zero-delta.
1270 // https://crbug.com/553732
1271 // TODO(chongz): EventSender sends events with
1272 // |WebMouseWheelEvent::PhaseNone|,
1273 // but it shouldn't.
1274 const int kWheelEventPhaseNoEventMask = WebMouseWheelEvent::kPhaseEnded |
1275 WebMouseWheelEvent::kPhaseCancelled |
1276 WebMouseWheelEvent::kPhaseMayBegin;
1277 if ((event.phase & kWheelEventPhaseNoEventMask) ||
1278 (event.momentum_phase & kWheelEventPhaseNoEventMask))
1279 return WebInputEventResult::kNotHandled;
1280 #endif
1281 Document* doc = frame_->GetDocument();
1282
1283 if (doc->GetLayoutViewItem().IsNull())
1284 return WebInputEventResult::kNotHandled;
1285
1286 LocalFrameView* view = frame_->View();
1287 if (!view)
1288 return WebInputEventResult::kNotHandled;
1289
1290 LayoutPoint v_point =
1291 view->RootFrameToContents(FlooredIntPoint(event.PositionInRootFrame()));
1292
1293 HitTestRequest request(HitTestRequest::kReadOnly);
1294 HitTestResult result(request, v_point);
1295 doc->GetLayoutViewItem().HitTest(result);
1296
1297 Node* node = result.InnerNode();
1298 // Wheel events should not dispatch to text nodes.
1299 if (node && node->IsTextNode())
1300 node = FlatTreeTraversal::Parent(*node);
1301
1302 // If we're over the frame scrollbar, scroll the document.
1303 if (!node && result.GetScrollbar())
1304 node = doc->documentElement();
1305
1306 LocalFrame* subframe = SubframeForTargetNode(node);
1307 if (subframe) {
1308 WebInputEventResult result =
1309 subframe->GetEventHandler().HandleWheelEvent(event);
1310 if (result != WebInputEventResult::kNotHandled)
1311 scroll_manager_->SetFrameWasScrolledByUser();
1312 return result;
1313 }
1314
1315 if (node) {
1316 WheelEvent* dom_event =
1317 WheelEvent::Create(event, node->GetDocument().domWindow());
1318 DispatchEventResult dom_event_result = node->DispatchEvent(dom_event);
1319 if (dom_event_result != DispatchEventResult::kNotCanceled)
1320 return EventHandlingUtil::ToWebInputEventResult(dom_event_result);
1321 }
1322
1323 return WebInputEventResult::kNotHandled;
1324 } 1254 }
1325 1255
1326 WebInputEventResult EventHandler::HandleGestureEvent( 1256 WebInputEventResult EventHandler::HandleGestureEvent(
1327 const WebGestureEvent& gesture_event) { 1257 const WebGestureEvent& gesture_event) {
1328 // Propagation to inner frames is handled below this function. 1258 // Propagation to inner frames is handled below this function.
1329 DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); 1259 DCHECK_EQ(frame_, &frame_->LocalFrameRoot());
1330 DCHECK_NE(0, gesture_event.FrameScale()); 1260 DCHECK_NE(0, gesture_event.FrameScale());
1331 1261
1332 // Scrolling-related gesture events invoke EventHandler recursively for each 1262 // Scrolling-related gesture events invoke EventHandler recursively for each
1333 // frame down the chain, doing a single-frame hit-test per frame. This matches 1263 // frame down the chain, doing a single-frame hit-test per frame. This matches
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 MouseEventWithHitTestResults& mev, 2078 MouseEventWithHitTestResults& mev,
2149 LocalFrame* subframe) { 2079 LocalFrame* subframe) {
2150 WebInputEventResult result = 2080 WebInputEventResult result =
2151 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event()); 2081 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event());
2152 if (result != WebInputEventResult::kNotHandled) 2082 if (result != WebInputEventResult::kNotHandled)
2153 return result; 2083 return result;
2154 return WebInputEventResult::kHandledSystem; 2084 return WebInputEventResult::kHandledSystem;
2155 } 2085 }
2156 2086
2157 } // namespace blink 2087 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698