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

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

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

Powered by Google App Engine
This is Rietveld 408576698