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