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 "content/browser/renderer_host/render_widget_host_view_event_handler.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_event_handler.h" |
6 | 6 |
7 #include "base/metrics/user_metrics.h" | 7 #include "base/metrics/user_metrics.h" |
8 #include "base/metrics/user_metrics_action.h" | 8 #include "base/metrics/user_metrics_action.h" |
9 #include "content/browser/renderer_host/input/touch_selection_controller_client_ aura.h" | 9 #include "content/browser/renderer_host/input/touch_selection_controller_client_ aura.h" |
10 #include "content/browser/renderer_host/overscroll_controller.h" | 10 #include "content/browser/renderer_host/overscroll_controller.h" |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 if (host) { | 329 if (host) { |
330 HWND parent = host->GetAcceleratedWidget(); | 330 HWND parent = host->GetAcceleratedWidget(); |
331 HWND toplevel_hwnd = ::GetAncestor(parent, GA_ROOT); | 331 HWND toplevel_hwnd = ::GetAncestor(parent, GA_ROOT); |
332 EnumThreadWindows(GetCurrentThreadId(), DismissOwnedPopups, | 332 EnumThreadWindows(GetCurrentThreadId(), DismissOwnedPopups, |
333 reinterpret_cast<LPARAM>(toplevel_hwnd)); | 333 reinterpret_cast<LPARAM>(toplevel_hwnd)); |
334 } | 334 } |
335 #endif | 335 #endif |
336 blink::WebMouseWheelEvent mouse_wheel_event = | 336 blink::WebMouseWheelEvent mouse_wheel_event = |
337 ui::MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent&>(*event), | 337 ui::MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent&>(*event), |
338 base::Bind(&GetScreenLocationFromEvent)); | 338 base::Bind(&GetScreenLocationFromEvent)); |
339 | |
339 if (mouse_wheel_event.delta_x != 0 || mouse_wheel_event.delta_y != 0) { | 340 if (mouse_wheel_event.delta_x != 0 || mouse_wheel_event.delta_y != 0) { |
340 if (ShouldRouteEvent(event)) { | 341 bool should_route_event = ShouldRouteEvent(event); |
342 if (host_view_->wheel_scroll_latching_enabled()) | |
343 AddPhaseAndScheduleEndEvent(mouse_wheel_event, should_route_event); | |
344 if (should_route_event) { | |
341 host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent( | 345 host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent( |
342 host_view_, &mouse_wheel_event, *event->latency()); | 346 host_view_, &mouse_wheel_event, *event->latency()); |
343 } else { | 347 } else { |
344 ProcessMouseWheelEvent(mouse_wheel_event, *event->latency()); | 348 ProcessMouseWheelEvent(mouse_wheel_event, *event->latency()); |
345 } | 349 } |
346 } | 350 } |
347 } else { | 351 } else { |
348 bool is_selection_popup = NeedsInputGrab(popup_child_host_view_); | 352 bool is_selection_popup = NeedsInputGrab(popup_child_host_view_); |
349 if (CanRendererHandleEvent(event, mouse_locked_, is_selection_popup) && | 353 if (CanRendererHandleEvent(event, mouse_locked_, is_selection_popup) && |
350 !(event->flags() & ui::EF_FROM_TOUCH)) { | 354 !(event->flags() & ui::EF_FROM_TOUCH)) { |
(...skipping 30 matching lines...) Expand all Loading... | |
381 default: | 385 default: |
382 break; | 386 break; |
383 } | 387 } |
384 | 388 |
385 if (!IsXButtonUpEvent(event)) | 389 if (!IsXButtonUpEvent(event)) |
386 event->SetHandled(); | 390 event->SetHandled(); |
387 } | 391 } |
388 | 392 |
389 void RenderWidgetHostViewEventHandler::OnScrollEvent(ui::ScrollEvent* event) { | 393 void RenderWidgetHostViewEventHandler::OnScrollEvent(ui::ScrollEvent* event) { |
390 TRACE_EVENT0("input", "RenderWidgetHostViewBase::OnScrollEvent"); | 394 TRACE_EVENT0("input", "RenderWidgetHostViewBase::OnScrollEvent"); |
391 | 395 bool should_route_event = ShouldRouteEvent(event); |
392 if (event->type() == ui::ET_SCROLL) { | 396 if (event->type() == ui::ET_SCROLL) { |
393 #if !defined(OS_WIN) | 397 #if !defined(OS_WIN) |
394 // TODO(ananta) | 398 // TODO(ananta) |
395 // Investigate if this is true for Windows 8 Metro ASH as well. | 399 // Investigate if this is true for Windows 8 Metro ASH as well. |
396 if (event->finger_count() != 2) | 400 if (event->finger_count() != 2) |
397 return; | 401 return; |
398 #endif | 402 #endif |
399 blink::WebGestureEvent gesture_event = ui::MakeWebGestureEventFlingCancel(); | 403 blink::WebGestureEvent gesture_event = ui::MakeWebGestureEventFlingCancel(); |
400 // Coordinates need to be transferred to the fling cancel gesture only | 404 // Coordinates need to be transferred to the fling cancel gesture only |
401 // for Surface-targeting to ensure that it is targeted to the correct | 405 // for Surface-targeting to ensure that it is targeted to the correct |
402 // RenderWidgetHost. | 406 // RenderWidgetHost. |
403 gesture_event.x = event->x(); | 407 gesture_event.x = event->x(); |
404 gesture_event.y = event->y(); | 408 gesture_event.y = event->y(); |
405 blink::WebMouseWheelEvent mouse_wheel_event = ui::MakeWebMouseWheelEvent( | 409 blink::WebMouseWheelEvent mouse_wheel_event = ui::MakeWebMouseWheelEvent( |
406 *event, base::Bind(&GetScreenLocationFromEvent)); | 410 *event, base::Bind(&GetScreenLocationFromEvent)); |
407 if (ShouldRouteEvent(event)) { | 411 if (host_view_->wheel_scroll_latching_enabled()) |
412 AddPhaseAndScheduleEndEvent(mouse_wheel_event, should_route_event); | |
413 if (should_route_event) { | |
408 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( | 414 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( |
409 host_view_, &gesture_event, | 415 host_view_, &gesture_event, |
410 ui::LatencyInfo(ui::SourceEventType::WHEEL)); | 416 ui::LatencyInfo(ui::SourceEventType::WHEEL)); |
411 host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent( | 417 host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent( |
412 host_view_, &mouse_wheel_event, *event->latency()); | 418 host_view_, &mouse_wheel_event, *event->latency()); |
413 } else { | 419 } else { |
414 host_->ForwardGestureEvent(gesture_event); | 420 host_->ForwardGestureEvent(gesture_event); |
415 host_->ForwardWheelEventWithLatencyInfo(mouse_wheel_event, | 421 host_->ForwardWheelEventWithLatencyInfo(mouse_wheel_event, |
416 *event->latency()); | 422 *event->latency()); |
417 } | 423 } |
418 } else if (event->type() == ui::ET_SCROLL_FLING_START || | 424 } else if (event->type() == ui::ET_SCROLL_FLING_START || |
419 event->type() == ui::ET_SCROLL_FLING_CANCEL) { | 425 event->type() == ui::ET_SCROLL_FLING_CANCEL) { |
420 blink::WebGestureEvent gesture_event = ui::MakeWebGestureEvent( | 426 blink::WebGestureEvent gesture_event = ui::MakeWebGestureEvent( |
421 *event, base::Bind(&GetScreenLocationFromEvent)); | 427 *event, base::Bind(&GetScreenLocationFromEvent)); |
422 if (ShouldRouteEvent(event)) { | 428 if (should_route_event) { |
423 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( | 429 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( |
424 host_view_, &gesture_event, | 430 host_view_, &gesture_event, |
425 ui::LatencyInfo(ui::SourceEventType::WHEEL)); | 431 ui::LatencyInfo(ui::SourceEventType::WHEEL)); |
426 } else { | 432 } else { |
427 host_->ForwardGestureEvent(gesture_event); | 433 host_->ForwardGestureEvent(gesture_event); |
428 } | 434 } |
429 if (event->type() == ui::ET_SCROLL_FLING_START) | 435 if (event->type() == ui::ET_SCROLL_FLING_START) { |
430 RecordAction(base::UserMetricsAction("TrackpadScrollFling")); | 436 RecordAction(base::UserMetricsAction("TrackpadScrollFling")); |
437 // Stop the timer to avoid sending a synthetic wheel event with | |
438 // kPhaseEnded. | |
439 mouse_wheel_end_dispatch_timer_.Stop(); | |
440 } | |
431 } | 441 } |
432 | 442 |
433 event->SetHandled(); | 443 event->SetHandled(); |
434 } | 444 } |
435 | 445 |
436 void RenderWidgetHostViewEventHandler::OnTouchEvent(ui::TouchEvent* event) { | 446 void RenderWidgetHostViewEventHandler::OnTouchEvent(ui::TouchEvent* event) { |
437 TRACE_EVENT0("input", "RenderWidgetHostViewBase::OnTouchEvent"); | 447 TRACE_EVENT0("input", "RenderWidgetHostViewBase::OnTouchEvent"); |
438 | 448 |
439 bool had_no_pointer = !pointer_state_.GetPointerCount(); | 449 bool had_no_pointer = !pointer_state_.GetPointerCount(); |
440 | 450 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 if (ShouldRouteEvent(event)) { | 522 if (ShouldRouteEvent(event)) { |
513 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( | 523 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( |
514 host_view_, &fling_cancel, | 524 host_view_, &fling_cancel, |
515 ui::LatencyInfo(ui::SourceEventType::TOUCH)); | 525 ui::LatencyInfo(ui::SourceEventType::TOUCH)); |
516 } else { | 526 } else { |
517 host_->ForwardGestureEvent(fling_cancel); | 527 host_->ForwardGestureEvent(fling_cancel); |
518 } | 528 } |
519 } | 529 } |
520 | 530 |
521 if (gesture.GetType() != blink::WebInputEvent::kUndefined) { | 531 if (gesture.GetType() != blink::WebInputEvent::kUndefined) { |
532 if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { | |
533 RecordAction(base::UserMetricsAction("TouchscreenScroll")); | |
534 | |
535 if (mouse_wheel_end_dispatch_timer_.IsRunning()) { | |
536 // If there is a current scroll going on and a new scroll that isn't | |
537 // wheel based send a synthetic wheel event with kPhaseEnded to cancel | |
538 // the current scroll. | |
539 base::Closure task = mouse_wheel_end_dispatch_timer_.user_task(); | |
540 mouse_wheel_end_dispatch_timer_.Stop(); | |
541 task.Run(); | |
542 } | |
543 } else if (event->type() == ui::ET_GESTURE_SCROLL_END) { | |
544 // Make sure that the next wheel event will have phase = |kPhaseBegan|. | |
545 // This is for maintaining the correct phase info when some of the wheel | |
546 // events get ignored while a touchscreen scroll is going on. | |
547 mouse_wheel_end_dispatch_timer_.Stop(); | |
548 } else if (event->type() == ui::ET_SCROLL_FLING_START) { | |
549 RecordAction(base::UserMetricsAction("TouchscreenScrollFling")); | |
550 } | |
551 | |
522 if (ShouldRouteEvent(event)) { | 552 if (ShouldRouteEvent(event)) { |
523 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( | 553 host_->delegate()->GetInputEventRouter()->RouteGestureEvent( |
524 host_view_, &gesture, *event->latency()); | 554 host_view_, &gesture, *event->latency()); |
525 } else { | 555 } else { |
526 host_->ForwardGestureEventWithLatencyInfo(gesture, *event->latency()); | 556 host_->ForwardGestureEventWithLatencyInfo(gesture, *event->latency()); |
527 } | 557 } |
528 | |
529 if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { | |
530 RecordAction(base::UserMetricsAction("TouchscreenScroll")); | |
531 } else if (event->type() == ui::ET_SCROLL_FLING_START) { | |
532 RecordAction(base::UserMetricsAction("TouchscreenScrollFling")); | |
533 } | |
534 } | 558 } |
535 | 559 |
536 // If a gesture is not processed by the webpage, then WebKit processes it | 560 // If a gesture is not processed by the webpage, then WebKit processes it |
537 // (e.g. generates synthetic mouse events). | 561 // (e.g. generates synthetic mouse events). |
538 event->SetHandled(); | 562 event->SetHandled(); |
539 } | 563 } |
540 | 564 |
541 bool RenderWidgetHostViewEventHandler::CanRendererHandleEvent( | 565 bool RenderWidgetHostViewEventHandler::CanRendererHandleEvent( |
542 const ui::MouseEvent* event, | 566 const ui::MouseEvent* event, |
543 bool mouse_locked, | 567 bool mouse_locked, |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
880 const ui::LatencyInfo& latency) { | 904 const ui::LatencyInfo& latency) { |
881 host_->ForwardWheelEventWithLatencyInfo(event, latency); | 905 host_->ForwardWheelEventWithLatencyInfo(event, latency); |
882 } | 906 } |
883 | 907 |
884 void RenderWidgetHostViewEventHandler::ProcessTouchEvent( | 908 void RenderWidgetHostViewEventHandler::ProcessTouchEvent( |
885 const blink::WebTouchEvent& event, | 909 const blink::WebTouchEvent& event, |
886 const ui::LatencyInfo& latency) { | 910 const ui::LatencyInfo& latency) { |
887 host_->ForwardTouchEventWithLatencyInfo(event, latency); | 911 host_->ForwardTouchEventWithLatencyInfo(event, latency); |
888 } | 912 } |
889 | 913 |
914 void RenderWidgetHostViewEventHandler::SendSyntheticWheelEventWithPhaseEnded( | |
915 blink::WebMouseWheelEvent last_mouse_wheel_event, | |
916 bool should_route_event) { | |
917 DCHECK(host_view_->wheel_scroll_latching_enabled()); | |
918 blink::WebMouseWheelEvent mouse_wheel_event = last_mouse_wheel_event; | |
919 mouse_wheel_event.delta_x = 0; | |
920 mouse_wheel_event.delta_y = 0; | |
921 mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseEnded; | |
922 mouse_wheel_event.dispatch_type = | |
923 blink::WebInputEvent::DispatchType::kEventNonBlocking; | |
924 if (should_route_event) { | |
925 host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent( | |
926 host_view_, &mouse_wheel_event, | |
927 ui::LatencyInfo(ui::SourceEventType::WHEEL)); | |
928 } else { | |
929 ProcessMouseWheelEvent(mouse_wheel_event, | |
930 ui::LatencyInfo(ui::SourceEventType::WHEEL)); | |
931 } | |
932 } | |
933 | |
934 void RenderWidgetHostViewEventHandler::AddPhaseAndScheduleEndEvent( | |
935 blink::WebMouseWheelEvent& mouse_wheel_event, | |
936 bool should_route_event) { | |
937 DCHECK(mouse_wheel_event.phase == blink::WebMouseWheelEvent::kPhaseNone && | |
938 mouse_wheel_event.momentum_phase == | |
939 blink::WebMouseWheelEvent::kPhaseNone); | |
tdresser
2017/05/19 16:17:33
I'd split this into two DCHECKs, as it'll be easie
sahel
2017/05/19 17:39:16
Done.
| |
940 | |
941 if (!mouse_wheel_end_dispatch_timer_.IsRunning()) { | |
942 mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; | |
943 mouse_wheel_end_dispatch_timer_.Start( | |
944 FROM_HERE, | |
945 base::TimeDelta::FromMilliseconds( | |
946 kDefaultMouseWheelLatchingTransactionMs), | |
947 base::Bind(&RenderWidgetHostViewEventHandler:: | |
948 SendSyntheticWheelEventWithPhaseEnded, | |
949 base::Unretained(this), mouse_wheel_event, | |
950 should_route_event)); | |
951 } else { | |
952 bool non_zero_delta = | |
953 mouse_wheel_event.delta_x || mouse_wheel_event.delta_y; | |
954 mouse_wheel_event.phase = non_zero_delta | |
955 ? blink::WebMouseWheelEvent::kPhaseChanged | |
956 : blink::WebMouseWheelEvent::kPhaseStationary; | |
957 mouse_wheel_end_dispatch_timer_.Reset(); | |
958 } | |
959 } | |
960 | |
890 } // namespace content | 961 } // namespace content |
OLD | NEW |