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

Side by Side Diff: content/browser/renderer_host/input/mouse_wheel_phase_handler.cc

Issue 2914393002: Adding phase info to wheel events migrated to wheel phase handler class. (Closed)
Patch Set: fixed mouse_wheel_phase_handler_path in rwhv_mac 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
6
7 #include "content/browser/renderer_host/render_widget_host_impl.h"
8 #include "content/browser/renderer_host/render_widget_host_input_event_router.h"
9 #include "content/browser/renderer_host/render_widget_host_view_base.h"
10
11 namespace content {
12 MouseWheelPhaseHandler::MouseWheelPhaseHandler(
13 RenderWidgetHostImpl* const host,
14 RenderWidgetHostViewBase* const host_view)
15 : host_(RenderWidgetHostImpl::From(host)), host_view_(host_view) {}
16
17 void MouseWheelPhaseHandler::AddPhaseIfNeededAndScheduleEndEvent(
18 blink::WebMouseWheelEvent& mouse_wheel_event,
19 bool should_route_event) {
20 bool has_phase =
21 mouse_wheel_event.phase != blink::WebMouseWheelEvent::kPhaseNone ||
22 mouse_wheel_event.momentum_phase != blink::WebMouseWheelEvent::kPhaseNone;
23 if (has_phase) {
24 if (mouse_wheel_event.phase == blink::WebMouseWheelEvent::kPhaseEnded) {
25 // Don't send the wheel end event immediately, start a timer instead to
26 // see whether momentum phase of the scrolling starts or not.
27 ScheduleMouseWheelEndDispatching(mouse_wheel_event, should_route_event);
28 } else if (mouse_wheel_event.phase ==
29 blink::WebMouseWheelEvent::kPhaseBegan) {
30 // A new scrolling sequence has started, send the pending wheel end
31 // event to end the previous scrolling sequence.
32 DispatchPendingWheelEndEvent();
33 } else if (mouse_wheel_event.momentum_phase ==
34 blink::WebMouseWheelEvent::kPhaseBegan) {
35 // Momentum phase has started, drop the pending wheel end event to make
36 // sure that no wheel end event will be sent during the momentum phase
37 // of scrolling.
38 IgnorePendingWheelEndEvent();
39 }
40 } else { // !has_phase
41 if (!mouse_wheel_end_dispatch_timer_.IsRunning()) {
42 mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan;
43 ScheduleMouseWheelEndDispatching(mouse_wheel_event, should_route_event);
44 } else { // mouse_wheel_end_dispatch_timer_.IsRunning()
45 bool non_zero_delta =
46 mouse_wheel_event.delta_x || mouse_wheel_event.delta_y;
47 mouse_wheel_event.phase =
48 non_zero_delta ? blink::WebMouseWheelEvent::kPhaseChanged
49 : blink::WebMouseWheelEvent::kPhaseStationary;
50 mouse_wheel_end_dispatch_timer_.Reset();
51 }
52 }
53 }
54
55 void MouseWheelPhaseHandler::DispatchPendingWheelEndEvent() {
56 if (!mouse_wheel_end_dispatch_timer_.IsRunning())
57 return;
58
59 base::Closure task = mouse_wheel_end_dispatch_timer_.user_task();
60 mouse_wheel_end_dispatch_timer_.Stop();
61 task.Run();
62 }
63
64 void MouseWheelPhaseHandler::IgnorePendingWheelEndEvent() {
65 mouse_wheel_end_dispatch_timer_.Stop();
66 }
67
68 void MouseWheelPhaseHandler::SendSyntheticWheelEventWithPhaseEnded(
69 blink::WebMouseWheelEvent last_mouse_wheel_event,
70 bool should_route_event) {
71 DCHECK(host_view_->wheel_scroll_latching_enabled());
72 blink::WebMouseWheelEvent mouse_wheel_event = last_mouse_wheel_event;
73 mouse_wheel_event.delta_x = 0;
74 mouse_wheel_event.delta_y = 0;
75 mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
76 mouse_wheel_event.dispatch_type =
77 blink::WebInputEvent::DispatchType::kEventNonBlocking;
78 if (should_route_event) {
79 host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent(
80 host_view_, &mouse_wheel_event,
81 ui::LatencyInfo(ui::SourceEventType::WHEEL));
82 } else {
83 host_view_->ProcessMouseWheelEvent(
84 mouse_wheel_event, ui::LatencyInfo(ui::SourceEventType::WHEEL));
85 }
86 }
87
88 void MouseWheelPhaseHandler::ScheduleMouseWheelEndDispatching(
89 blink::WebMouseWheelEvent wheel_event,
90 bool should_route_event) {
91 mouse_wheel_end_dispatch_timer_.Start(
92 FROM_HERE,
93 base::TimeDelta::FromMilliseconds(
94 kDefaultMouseWheelLatchingTransactionMs),
95 base::Bind(&MouseWheelPhaseHandler::SendSyntheticWheelEventWithPhaseEnded,
96 base::Unretained(this), wheel_event, should_route_event));
97 }
98
99 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698