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

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

Issue 2928793003: Re-target wheel events only when a new scroll sequence has started. (Closed)
Patch Set: browser test updated. 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 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(wheel_target_);
216 visitor->Trace(frame_set_being_resized_); 217 visitor->Trace(frame_set_being_resized_);
217 visitor->Trace(scroll_manager_); 218 visitor->Trace(scroll_manager_);
218 visitor->Trace(mouse_event_manager_); 219 visitor->Trace(mouse_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();
229 last_mouse_move_event_subframe_ = nullptr; 230 last_mouse_move_event_subframe_ = nullptr;
230 last_scrollbar_under_mouse_ = nullptr; 231 last_scrollbar_under_mouse_ = nullptr;
231 frame_set_being_resized_ = nullptr; 232 frame_set_being_resized_ = nullptr;
232 drag_target_ = nullptr; 233 drag_target_ = nullptr;
234 wheel_target_ = nullptr;
233 should_only_fire_drag_over_event_ = false; 235 should_only_fire_drag_over_event_ = false;
234 last_mouse_down_user_gesture_token_.Clear(); 236 last_mouse_down_user_gesture_token_.Clear();
235 capturing_mouse_events_node_ = nullptr; 237 capturing_mouse_events_node_ = nullptr;
236 pointer_event_manager_->Clear(); 238 pointer_event_manager_->Clear();
237 scroll_manager_->Clear(); 239 scroll_manager_->Clear();
238 gesture_manager_->Clear(); 240 gesture_manager_->Clear();
239 mouse_event_manager_->Clear(); 241 mouse_event_manager_->Clear();
240 last_deferred_tap_element_ = nullptr; 242 last_deferred_tap_element_ = nullptr;
241 event_handler_will_reset_capturing_mouse_events_node_ = false; 243 event_handler_will_reset_capturing_mouse_events_node_ = false;
242 } 244 }
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 mouse_event_type == EventTypeNames::mouseup); 1260 mouse_event_type == EventTypeNames::mouseup);
1259 1261
1260 const auto& event_result = pointer_event_manager_->SendMousePointerEvent( 1262 const auto& event_result = pointer_event_manager_->SendMousePointerEvent(
1261 UpdateMouseEventTargetNode(target_node), canvas_region_id, 1263 UpdateMouseEventTargetNode(target_node), canvas_region_id,
1262 mouse_event_type, mouse_event, coalesced_events); 1264 mouse_event_type, mouse_event, coalesced_events);
1263 return event_result; 1265 return event_result;
1264 } 1266 }
1265 1267
1266 WebInputEventResult EventHandler::HandleWheelEvent( 1268 WebInputEventResult EventHandler::HandleWheelEvent(
1267 const WebMouseWheelEvent& event) { 1269 const WebMouseWheelEvent& event) {
1270 bool wheel_scroll_latching =
1271 RuntimeEnabledFeatures::TouchpadAndWheelScrollLatchingEnabled();
1272
1273 if (wheel_scroll_latching) {
1274 const int kWheelEventPhaseNoEventMask =
1275 WebMouseWheelEvent::kPhaseEnded | WebMouseWheelEvent::kPhaseCancelled |
1276 WebMouseWheelEvent::kPhaseMayBegin;
1277
1278 if ((event.phase & kWheelEventPhaseNoEventMask) ||
1279 (event.momentum_phase & kWheelEventPhaseNoEventMask)) {
1280 // Filter wheel events with zero deltas and reset the wheel_target_ node.
1281 DCHECK(!event.delta_x && !event.delta_y);
1282 wheel_target_ = nullptr;
1283 return WebInputEventResult::kNotHandled;
1284 }
1285
1286 if (event.phase == WebMouseWheelEvent::kPhaseBegan) {
1287 // Find and save the wheel_target_, this target will be used for the rest
1288 // of the current scrolling sequence.
1289 DCHECK(!wheel_target_);
1290 Document* doc = frame_->GetDocument();
1291
1292 if (doc->GetLayoutViewItem().IsNull())
1293 return WebInputEventResult::kNotHandled;
1294
1295 LocalFrameView* view = frame_->View();
1296 if (!view)
1297 return WebInputEventResult::kNotHandled;
1298
1299 LayoutPoint v_point = view->RootFrameToContents(
1300 FlooredIntPoint(event.PositionInRootFrame()));
1301
1302 HitTestRequest request(HitTestRequest::kReadOnly);
1303 HitTestResult result(request, v_point);
1304 doc->GetLayoutViewItem().HitTest(result);
1305
1306 wheel_target_ = result.InnerNode();
1307 // Wheel events should not dispatch to text nodes.
1308 if (wheel_target_ && wheel_target_->IsTextNode())
1309 wheel_target_ = FlatTreeTraversal::Parent(*wheel_target_);
1310
1311 // If we're over the frame scrollbar, scroll the document.
1312 if (!wheel_target_ && result.GetScrollbar())
1313 wheel_target_ = doc->documentElement();
1314 }
1315 } else { // !wheel_scroll_latching, wheel_target_ will be updated for each
1316 // wheel event.
1268 #if OS(MACOSX) 1317 #if OS(MACOSX)
1269 // Filter Mac OS specific phases, usually with a zero-delta. 1318 // Filter Mac OS specific phases, usually with a zero-delta.
1270 // https://crbug.com/553732 1319 // https://crbug.com/553732
1271 // TODO(chongz): EventSender sends events with 1320 // TODO(chongz): EventSender sends events with
1272 // |WebMouseWheelEvent::PhaseNone|, 1321 // |WebMouseWheelEvent::PhaseNone|,
1273 // but it shouldn't. 1322 // but it shouldn't.
1274 const int kWheelEventPhaseNoEventMask = WebMouseWheelEvent::kPhaseEnded | 1323 const int kWheelEventPhaseNoEventMask =
1275 WebMouseWheelEvent::kPhaseCancelled | 1324 WebMouseWheelEvent::kPhaseEnded | WebMouseWheelEvent::kPhaseCancelled |
1276 WebMouseWheelEvent::kPhaseMayBegin; 1325 WebMouseWheelEvent::kPhaseMayBegin;
1277 if ((event.phase & kWheelEventPhaseNoEventMask) || 1326 if ((event.phase & kWheelEventPhaseNoEventMask) ||
1278 (event.momentum_phase & kWheelEventPhaseNoEventMask)) 1327 (event.momentum_phase & kWheelEventPhaseNoEventMask))
1279 return WebInputEventResult::kNotHandled; 1328 return WebInputEventResult::kNotHandled;
1280 #endif 1329 #endif
1281 Document* doc = frame_->GetDocument();
1282 1330
1283 if (doc->GetLayoutViewItem().IsNull()) 1331 Document* doc = frame_->GetDocument();
1284 return WebInputEventResult::kNotHandled;
1285 1332
1286 LocalFrameView* view = frame_->View(); 1333 if (doc->GetLayoutViewItem().IsNull())
1287 if (!view) 1334 return WebInputEventResult::kNotHandled;
1288 return WebInputEventResult::kNotHandled;
1289 1335
1290 LayoutPoint v_point = 1336 LocalFrameView* view = frame_->View();
1291 view->RootFrameToContents(FlooredIntPoint(event.PositionInRootFrame())); 1337 if (!view)
1338 return WebInputEventResult::kNotHandled;
1292 1339
1293 HitTestRequest request(HitTestRequest::kReadOnly); 1340 LayoutPoint v_point =
1294 HitTestResult result(request, v_point); 1341 view->RootFrameToContents(FlooredIntPoint(event.PositionInRootFrame()));
1295 doc->GetLayoutViewItem().HitTest(result);
1296 1342
1297 Node* node = result.InnerNode(); 1343 HitTestRequest request(HitTestRequest::kReadOnly);
1298 // Wheel events should not dispatch to text nodes. 1344 HitTestResult result(request, v_point);
1299 if (node && node->IsTextNode()) 1345 doc->GetLayoutViewItem().HitTest(result);
1300 node = FlatTreeTraversal::Parent(*node);
1301 1346
1302 // If we're over the frame scrollbar, scroll the document. 1347 Node* node = result.InnerNode();
1303 if (!node && result.GetScrollbar()) 1348 // Wheel events should not dispatch to text nodes.
1304 node = doc->documentElement(); 1349 if (node && node->IsTextNode())
1350 node = FlatTreeTraversal::Parent(*node);
1305 1351
1306 LocalFrame* subframe = SubframeForTargetNode(node); 1352 // If we're over the frame scrollbar, scroll the document.
1353 if (!node && result.GetScrollbar())
1354 node = doc->documentElement();
1355
1356 wheel_target_ = node;
1357 }
1358
1359 LocalFrame* subframe = SubframeForTargetNode(wheel_target_.Get());
1307 if (subframe) { 1360 if (subframe) {
1308 WebInputEventResult result = 1361 WebInputEventResult result =
1309 subframe->GetEventHandler().HandleWheelEvent(event); 1362 subframe->GetEventHandler().HandleWheelEvent(event);
1310 if (result != WebInputEventResult::kNotHandled) 1363 if (result != WebInputEventResult::kNotHandled)
1311 scroll_manager_->SetFrameWasScrolledByUser(); 1364 scroll_manager_->SetFrameWasScrolledByUser();
1312 return result; 1365 return result;
1313 } 1366 }
1314 1367
1315 if (node) { 1368 if (wheel_target_) {
1316 WheelEvent* dom_event = 1369 WheelEvent* dom_event =
1317 WheelEvent::Create(event, node->GetDocument().domWindow()); 1370 WheelEvent::Create(event, wheel_target_->GetDocument().domWindow());
1318 DispatchEventResult dom_event_result = node->DispatchEvent(dom_event); 1371 DispatchEventResult dom_event_result =
1372 wheel_target_->DispatchEvent(dom_event);
1319 if (dom_event_result != DispatchEventResult::kNotCanceled) 1373 if (dom_event_result != DispatchEventResult::kNotCanceled)
1320 return EventHandlingUtil::ToWebInputEventResult(dom_event_result); 1374 return EventHandlingUtil::ToWebInputEventResult(dom_event_result);
1321 } 1375 }
1322 1376
1323 return WebInputEventResult::kNotHandled; 1377 return WebInputEventResult::kNotHandled;
1324 } 1378 }
1325 1379
1326 WebInputEventResult EventHandler::HandleGestureEvent( 1380 WebInputEventResult EventHandler::HandleGestureEvent(
1327 const WebGestureEvent& gesture_event) { 1381 const WebGestureEvent& gesture_event) {
1328 // Propagation to inner frames is handled below this function. 1382 // Propagation to inner frames is handled below this function.
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 MouseEventWithHitTestResults& mev, 2202 MouseEventWithHitTestResults& mev,
2149 LocalFrame* subframe) { 2203 LocalFrame* subframe) {
2150 WebInputEventResult result = 2204 WebInputEventResult result =
2151 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event()); 2205 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event());
2152 if (result != WebInputEventResult::kNotHandled) 2206 if (result != WebInputEventResult::kNotHandled)
2153 return result; 2207 return result;
2154 return WebInputEventResult::kHandledSystem; 2208 return WebInputEventResult::kHandledSystem;
2155 } 2209 }
2156 2210
2157 } // namespace blink 2211 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698