OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/input/immediate_input_router.h" | 5 #include "content/browser/renderer_host/input/immediate_input_router.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "content/browser/renderer_host/input/gesture_event_filter.h" | 10 #include "content/browser/renderer_host/input/gesture_event_filter.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 case INPUT_EVENT_ACK_STATE_CONSUMED: return "CONSUMED"; | 63 case INPUT_EVENT_ACK_STATE_CONSUMED: return "CONSUMED"; |
64 case INPUT_EVENT_ACK_STATE_NOT_CONSUMED: return "NOT_CONSUMED"; | 64 case INPUT_EVENT_ACK_STATE_NOT_CONSUMED: return "NOT_CONSUMED"; |
65 case INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS: return "NO_CONSUMER_EXISTS"; | 65 case INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS: return "NO_CONSUMER_EXISTS"; |
66 default: | 66 default: |
67 DLOG(WARNING) << "Unhandled InputEventAckState in GetEventAckName.\n"; | 67 DLOG(WARNING) << "Unhandled InputEventAckState in GetEventAckName.\n"; |
68 break; | 68 break; |
69 } | 69 } |
70 return ""; | 70 return ""; |
71 } | 71 } |
72 | 72 |
| 73 bool BrowserSideFlingEnabled() { |
| 74 return CommandLine::ForCurrentProcess()->HasSwitch( |
| 75 switches::kEnableBrowserSideFling); |
| 76 } |
| 77 |
73 } // namespace | 78 } // namespace |
74 | 79 |
| 80 // A helper class that based on the value of the |kEnableBrowserSideFling| flag |
| 81 // does event filtering using either |BaseGestureEventFilter| or |
| 82 // |GestureEventFilter|. |
| 83 class ImmediateInputRouter::EventFilteringHelper { |
| 84 public: |
| 85 // |router| must outlive us. |
| 86 explicit EventFilteringHelper(ImmediateInputRouter* router) { |
| 87 if (BrowserSideFlingEnabled()) |
| 88 gesture_event_filter_.reset(new BaseGestureEventFilter(router)); |
| 89 else |
| 90 gesture_event_filter_.reset(new GestureEventFilter(router, router)); |
| 91 } |
| 92 virtual ~EventFilteringHelper() {} |
| 93 |
| 94 bool ShouldDeferMouseDown(const MouseEventWithLatencyInfo& mouse_event) { |
| 95 if (BrowserSideFlingEnabled()) |
| 96 return false; |
| 97 |
| 98 return static_cast<GestureEventFilter*>(gesture_event_filter_.get())-> |
| 99 GetTouchpadTapSuppressionController()->ShouldDeferMouseDown( |
| 100 mouse_event); |
| 101 } |
| 102 |
| 103 bool ShouldDeferMouseUp(const MouseEventWithLatencyInfo& mouse_event) { |
| 104 if (BrowserSideFlingEnabled()) |
| 105 return false; |
| 106 |
| 107 return static_cast<GestureEventFilter*>(gesture_event_filter_.get())-> |
| 108 GetTouchpadTapSuppressionController()->ShouldSuppressMouseUp(); |
| 109 } |
| 110 |
| 111 void FlingHasBeenHalted() { |
| 112 if (BrowserSideFlingEnabled()) |
| 113 return; |
| 114 |
| 115 static_cast<GestureEventFilter*>(gesture_event_filter_.get())-> |
| 116 FlingHasBeenHalted(); |
| 117 } |
| 118 |
| 119 bool ShouldForwardGesture(const GestureEventWithLatencyInfo& gesture_event) { |
| 120 return gesture_event_filter_->ShouldForward(gesture_event); |
| 121 } |
| 122 |
| 123 bool HasQueuedGestureEvents() { |
| 124 return gesture_event_filter_->HasQueuedGestureEvents(); |
| 125 } |
| 126 |
| 127 void ProcessGestureAck(InputEventAckState ack_result, |
| 128 blink::WebInputEvent::Type type, |
| 129 const ui::LatencyInfo& latency) { |
| 130 gesture_event_filter_->ProcessGestureAck(ack_result, type, latency); |
| 131 } |
| 132 |
| 133 private: |
| 134 friend class ImmediateInputRouter; |
| 135 scoped_ptr<BaseGestureEventFilter> gesture_event_filter_; |
| 136 |
| 137 DISALLOW_COPY_AND_ASSIGN(EventFilteringHelper); |
| 138 }; |
| 139 |
75 ImmediateInputRouter::ImmediateInputRouter(IPC::Sender* sender, | 140 ImmediateInputRouter::ImmediateInputRouter(IPC::Sender* sender, |
76 InputRouterClient* client, | 141 InputRouterClient* client, |
77 InputAckHandler* ack_handler, | 142 InputAckHandler* ack_handler, |
78 int routing_id) | 143 int routing_id) |
79 : sender_(sender), | 144 : sender_(sender), |
80 client_(client), | 145 client_(client), |
81 ack_handler_(ack_handler), | 146 ack_handler_(ack_handler), |
82 routing_id_(routing_id), | 147 routing_id_(routing_id), |
83 select_range_pending_(false), | 148 select_range_pending_(false), |
84 move_caret_pending_(false), | 149 move_caret_pending_(false), |
85 mouse_move_pending_(false), | 150 mouse_move_pending_(false), |
86 mouse_wheel_pending_(false), | 151 mouse_wheel_pending_(false), |
87 has_touch_handler_(false), | 152 has_touch_handler_(false), |
88 current_ack_source_(ACK_SOURCE_NONE), | 153 current_ack_source_(ACK_SOURCE_NONE), |
89 touch_event_queue_(new TouchEventQueue(this)), | 154 touch_event_queue_(new TouchEventQueue(this)), |
90 gesture_event_filter_(new GestureEventFilter(this, this)) { | 155 flinger_(new Flinger(this)), |
| 156 event_filter_(new EventFilteringHelper(this)) { |
91 DCHECK(sender); | 157 DCHECK(sender); |
92 DCHECK(client); | 158 DCHECK(client); |
93 DCHECK(ack_handler); | 159 DCHECK(ack_handler); |
94 } | 160 } |
95 | 161 |
96 ImmediateInputRouter::~ImmediateInputRouter() { | 162 ImmediateInputRouter::~ImmediateInputRouter() { |
97 } | 163 } |
98 | 164 |
99 void ImmediateInputRouter::Flush() { | 165 void ImmediateInputRouter::Flush() { |
100 NOTREACHED() << "ImmediateInputRouter will never request a flush."; | 166 NOTREACHED() << "ImmediateInputRouter will never request a flush."; |
(...skipping 18 matching lines...) Expand all Loading... |
119 void ImmediateInputRouter::SendMouseEvent( | 185 void ImmediateInputRouter::SendMouseEvent( |
120 const MouseEventWithLatencyInfo& mouse_event) { | 186 const MouseEventWithLatencyInfo& mouse_event) { |
121 // Order is important here; we need to convert all MouseEvents before they | 187 // Order is important here; we need to convert all MouseEvents before they |
122 // propagate further, e.g., to the tap suppression controller. | 188 // propagate further, e.g., to the tap suppression controller. |
123 if (CommandLine::ForCurrentProcess()->HasSwitch( | 189 if (CommandLine::ForCurrentProcess()->HasSwitch( |
124 switches::kSimulateTouchScreenWithMouse)) { | 190 switches::kSimulateTouchScreenWithMouse)) { |
125 SimulateTouchGestureWithMouse(mouse_event); | 191 SimulateTouchGestureWithMouse(mouse_event); |
126 return; | 192 return; |
127 } | 193 } |
128 | 194 |
| 195 if (BrowserSideFlingEnabled() && flinger_->HandleMouseEvent(mouse_event)) |
| 196 return; |
| 197 |
129 if (mouse_event.event.type == WebInputEvent::MouseDown && | 198 if (mouse_event.event.type == WebInputEvent::MouseDown && |
130 gesture_event_filter_->GetTouchpadTapSuppressionController()-> | 199 event_filter_->ShouldDeferMouseDown(mouse_event)) |
131 ShouldDeferMouseDown(mouse_event)) | |
132 return; | 200 return; |
133 if (mouse_event.event.type == WebInputEvent::MouseUp && | 201 if (mouse_event.event.type == WebInputEvent::MouseUp && |
134 gesture_event_filter_->GetTouchpadTapSuppressionController()-> | 202 event_filter_->ShouldDeferMouseUp(mouse_event)) |
135 ShouldSuppressMouseUp()) | |
136 return; | 203 return; |
137 | 204 |
138 SendMouseEventImmediately(mouse_event); | 205 SendMouseEventImmediately(mouse_event); |
139 } | 206 } |
140 | 207 |
141 void ImmediateInputRouter::SendWheelEvent( | 208 void ImmediateInputRouter::SendWheelEvent( |
142 const MouseWheelEventWithLatencyInfo& wheel_event) { | 209 const MouseWheelEventWithLatencyInfo& wheel_event) { |
| 210 if (BrowserSideFlingEnabled() && flinger_->HandleWheelEvent(wheel_event)) |
| 211 return; |
| 212 |
143 // If there's already a mouse wheel event waiting to be sent to the renderer, | 213 // If there's already a mouse wheel event waiting to be sent to the renderer, |
144 // add the new deltas to that event. Not doing so (e.g., by dropping the old | 214 // add the new deltas to that event. Not doing so (e.g., by dropping the old |
145 // event, as for mouse moves) results in very slow scrolling on the Mac (on | 215 // event, as for mouse moves) results in very slow scrolling on the Mac (on |
146 // which many, very small wheel events are sent). | 216 // which many, very small wheel events are sent). |
147 if (mouse_wheel_pending_) { | 217 if (mouse_wheel_pending_) { |
148 if (coalesced_mouse_wheel_events_.empty() || | 218 if (coalesced_mouse_wheel_events_.empty() || |
149 !coalesced_mouse_wheel_events_.back().CanCoalesceWith(wheel_event)) { | 219 !coalesced_mouse_wheel_events_.back().CanCoalesceWith(wheel_event)) { |
150 coalesced_mouse_wheel_events_.push_back(wheel_event); | 220 coalesced_mouse_wheel_events_.push_back(wheel_event); |
151 } else { | 221 } else { |
152 coalesced_mouse_wheel_events_.back().CoalesceWith(wheel_event); | 222 coalesced_mouse_wheel_events_.back().CoalesceWith(wheel_event); |
153 } | 223 } |
154 return; | 224 return; |
155 } | 225 } |
156 mouse_wheel_pending_ = true; | 226 mouse_wheel_pending_ = true; |
157 current_wheel_event_ = wheel_event; | 227 current_wheel_event_ = wheel_event; |
158 | 228 |
159 HISTOGRAM_COUNTS_100("Renderer.WheelQueueSize", | 229 HISTOGRAM_COUNTS_100("Renderer.WheelQueueSize", |
160 coalesced_mouse_wheel_events_.size()); | 230 coalesced_mouse_wheel_events_.size()); |
161 | 231 |
162 FilterAndSendWebInputEvent(wheel_event.event, wheel_event.latency, false); | 232 FilterAndSendWebInputEvent(wheel_event.event, wheel_event.latency, false); |
163 } | 233 } |
164 | 234 |
165 void ImmediateInputRouter::SendKeyboardEvent( | 235 void ImmediateInputRouter::SendKeyboardEvent( |
166 const NativeWebKeyboardEvent& key_event, | 236 const NativeWebKeyboardEvent& key_event, |
167 const ui::LatencyInfo& latency_info, | 237 const ui::LatencyInfo& latency_info, |
168 bool is_keyboard_shortcut) { | 238 bool is_keyboard_shortcut) { |
| 239 if (BrowserSideFlingEnabled() && flinger_->HandleKeyboardEvent()) |
| 240 return; |
| 241 |
169 // Put all WebKeyboardEvent objects in a queue since we can't trust the | 242 // Put all WebKeyboardEvent objects in a queue since we can't trust the |
170 // renderer and we need to give something to the HandleKeyboardEvent | 243 // renderer and we need to give something to the HandleKeyboardEvent |
171 // handler. | 244 // handler. |
172 key_queue_.push_back(key_event); | 245 key_queue_.push_back(key_event); |
173 HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); | 246 HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); |
174 | 247 |
175 gesture_event_filter_->FlingHasBeenHalted(); | 248 event_filter_->FlingHasBeenHalted(); |
176 | 249 |
177 // Only forward the non-native portions of our event. | 250 // Only forward the non-native portions of our event. |
178 FilterAndSendWebInputEvent(key_event, latency_info, is_keyboard_shortcut); | 251 FilterAndSendWebInputEvent(key_event, latency_info, is_keyboard_shortcut); |
179 } | 252 } |
180 | 253 |
181 void ImmediateInputRouter::SendGestureEvent( | 254 void ImmediateInputRouter::SendGestureEvent( |
182 const GestureEventWithLatencyInfo& gesture_event) { | 255 const GestureEventWithLatencyInfo& gesture_event) { |
183 HandleGestureScroll(gesture_event); | 256 HandleGestureScroll(gesture_event); |
184 | 257 |
| 258 if (BrowserSideFlingEnabled() && flinger_->HandleGestureEvent(gesture_event)) |
| 259 return; |
| 260 |
185 if (!IsInOverscrollGesture() && | 261 if (!IsInOverscrollGesture() && |
186 !gesture_event_filter_->ShouldForward(gesture_event)) { | 262 !event_filter_->ShouldForwardGesture(gesture_event)) { |
187 OverscrollController* controller = client_->GetOverscrollController(); | 263 OverscrollController* controller = client_->GetOverscrollController(); |
188 if (controller) | 264 if (controller) |
189 controller->DiscardingGestureEvent(gesture_event.event); | 265 controller->DiscardingGestureEvent(gesture_event.event); |
190 return; | 266 return; |
191 } | 267 } |
192 | 268 |
193 FilterAndSendWebInputEvent(gesture_event.event, gesture_event.latency, false); | 269 FilterAndSendWebInputEvent(gesture_event.event, gesture_event.latency, false); |
194 } | 270 } |
195 | 271 |
196 void ImmediateInputRouter::SendTouchEvent( | 272 void ImmediateInputRouter::SendTouchEvent( |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 ack_handler_->OnTouchEventAck(event, ack_result); | 346 ack_handler_->OnTouchEventAck(event, ack_result); |
271 } | 347 } |
272 | 348 |
273 void ImmediateInputRouter::OnGestureEventAck( | 349 void ImmediateInputRouter::OnGestureEventAck( |
274 const GestureEventWithLatencyInfo& event, | 350 const GestureEventWithLatencyInfo& event, |
275 InputEventAckState ack_result) { | 351 InputEventAckState ack_result) { |
276 ProcessAckForOverscroll(event.event, ack_result); | 352 ProcessAckForOverscroll(event.event, ack_result); |
277 ack_handler_->OnGestureEventAck(event, ack_result); | 353 ack_handler_->OnGestureEventAck(event, ack_result); |
278 } | 354 } |
279 | 355 |
| 356 void ImmediateInputRouter::SendEventForFling( |
| 357 const blink::WebInputEvent& event) { |
| 358 ui::LatencyInfo latency_info; |
| 359 if (Send(new InputMsg_HandleInputEvent( |
| 360 routing_id(), &event, latency_info, false))) |
| 361 in_process_messages_sources_.push(MESSAGE_SOURCE_FLING); |
| 362 } |
| 363 |
| 364 void ImmediateInputRouter::FlingFinished( |
| 365 blink::WebGestureEvent::SourceDevice source) { |
| 366 if (source == blink::WebGestureEvent::Touchscreen) { |
| 367 ui::LatencyInfo latency_info; |
| 368 blink::WebGestureEvent synthetic_gesture; |
| 369 synthetic_gesture.type = blink::WebInputEvent::GestureScrollEnd; |
| 370 synthetic_gesture.sourceDevice = blink::WebGestureEvent::Touchscreen; |
| 371 OfferToRenderer(synthetic_gesture, latency_info, false); |
| 372 } |
| 373 } |
| 374 |
280 bool ImmediateInputRouter::SendSelectRange(scoped_ptr<IPC::Message> message) { | 375 bool ImmediateInputRouter::SendSelectRange(scoped_ptr<IPC::Message> message) { |
281 DCHECK(message->type() == InputMsg_SelectRange::ID); | 376 DCHECK(message->type() == InputMsg_SelectRange::ID); |
282 if (select_range_pending_) { | 377 if (select_range_pending_) { |
283 next_selection_range_ = message.Pass(); | 378 next_selection_range_ = message.Pass(); |
284 return true; | 379 return true; |
285 } | 380 } |
286 | 381 |
287 select_range_pending_ = true; | 382 select_range_pending_ = true; |
288 return Send(message.release()); | 383 return Send(message.release()); |
289 } | 384 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 OverscrollController::Disposition disposition = | 446 OverscrollController::Disposition disposition = |
352 controller->DispatchEvent(input_event, latency_info); | 447 controller->DispatchEvent(input_event, latency_info); |
353 | 448 |
354 bool consumed = disposition == OverscrollController::CONSUMED; | 449 bool consumed = disposition == OverscrollController::CONSUMED; |
355 | 450 |
356 if (disposition == OverscrollController::SHOULD_FORWARD_TO_GESTURE_FILTER) { | 451 if (disposition == OverscrollController::SHOULD_FORWARD_TO_GESTURE_FILTER) { |
357 DCHECK(WebInputEvent::isGestureEventType(input_event.type)); | 452 DCHECK(WebInputEvent::isGestureEventType(input_event.type)); |
358 const blink::WebGestureEvent& gesture_event = | 453 const blink::WebGestureEvent& gesture_event = |
359 static_cast<const blink::WebGestureEvent&>(input_event); | 454 static_cast<const blink::WebGestureEvent&>(input_event); |
360 // An ACK is expected for the event, so mark it as consumed. | 455 // An ACK is expected for the event, so mark it as consumed. |
361 consumed = !gesture_event_filter_->ShouldForward( | 456 consumed = !event_filter_->ShouldForwardGesture( |
362 GestureEventWithLatencyInfo(gesture_event, latency_info)); | 457 GestureEventWithLatencyInfo(gesture_event, latency_info)); |
363 } | 458 } |
364 | 459 |
365 if (consumed) { | 460 if (consumed) { |
366 InputEventAckState overscroll_ack = | 461 InputEventAckState overscroll_ack = |
367 WebInputEvent::isTouchEventType(input_event.type) ? | 462 WebInputEvent::isTouchEventType(input_event.type) ? |
368 INPUT_EVENT_ACK_STATE_NOT_CONSUMED : INPUT_EVENT_ACK_STATE_CONSUMED; | 463 INPUT_EVENT_ACK_STATE_NOT_CONSUMED : INPUT_EVENT_ACK_STATE_CONSUMED; |
369 ProcessInputEventAck(input_event.type, | 464 ProcessInputEventAck(input_event.type, |
370 overscroll_ack, | 465 overscroll_ack, |
371 latency_info, | 466 latency_info, |
(...skipping 29 matching lines...) Expand all Loading... |
401 | 496 |
402 return consumed; | 497 return consumed; |
403 } | 498 } |
404 | 499 |
405 bool ImmediateInputRouter::OfferToRenderer(const WebInputEvent& input_event, | 500 bool ImmediateInputRouter::OfferToRenderer(const WebInputEvent& input_event, |
406 const ui::LatencyInfo& latency_info, | 501 const ui::LatencyInfo& latency_info, |
407 bool is_keyboard_shortcut) { | 502 bool is_keyboard_shortcut) { |
408 input_event_start_time_ = TimeTicks::Now(); | 503 input_event_start_time_ = TimeTicks::Now(); |
409 if (Send(new InputMsg_HandleInputEvent( | 504 if (Send(new InputMsg_HandleInputEvent( |
410 routing_id(), &input_event, latency_info, is_keyboard_shortcut))) { | 505 routing_id(), &input_event, latency_info, is_keyboard_shortcut))) { |
| 506 in_process_messages_sources_.push(MESSAGE_SOURCE_REGULAR); |
411 client_->IncrementInFlightEventCount(); | 507 client_->IncrementInFlightEventCount(); |
412 return true; | 508 return true; |
413 } | 509 } |
414 return false; | 510 return false; |
415 } | 511 } |
416 | 512 |
417 void ImmediateInputRouter::OnInputEventAck( | 513 void ImmediateInputRouter::OnInputEventAck( |
418 WebInputEvent::Type event_type, | 514 WebInputEvent::Type event_type, |
419 InputEventAckState ack_result, | 515 InputEventAckState ack_result, |
420 const ui::LatencyInfo& latency_info) { | 516 const ui::LatencyInfo& latency_info) { |
421 // Log the time delta for processing an input event. | 517 // Log the time delta for processing an input event. |
422 TimeDelta delta = TimeTicks::Now() - input_event_start_time_; | 518 TimeDelta delta = TimeTicks::Now() - input_event_start_time_; |
423 UMA_HISTOGRAM_TIMES("MPArch.IIR_InputEventDelta", delta); | 519 UMA_HISTOGRAM_TIMES("MPArch.IIR_InputEventDelta", delta); |
424 | 520 |
| 521 InputMessageSource source = in_process_messages_sources_.front(); |
| 522 in_process_messages_sources_.pop(); |
| 523 if (source == MESSAGE_SOURCE_FLING) { |
| 524 flinger_->ProcessEventAck(event_type, ack_result, latency_info); |
| 525 return; |
| 526 } |
| 527 |
425 client_->DecrementInFlightEventCount(); | 528 client_->DecrementInFlightEventCount(); |
426 | 529 |
427 ProcessInputEventAck(event_type, ack_result, latency_info, RENDERER); | 530 ProcessInputEventAck(event_type, ack_result, latency_info, RENDERER); |
428 // WARNING: |this| may be deleted at this point. | 531 // WARNING: |this| may be deleted at this point. |
429 | 532 |
430 // This is used only for testing, and the other end does not use the | 533 // This is used only for testing, and the other end does not use the |
431 // source object. On linux, specifying | 534 // source object. On linux, specifying |
432 // Source<RenderWidgetHost> results in a very strange | 535 // Source<RenderWidgetHost> results in a very strange |
433 // runtime error in the epilogue of the enclosing | 536 // runtime error in the epilogue of the enclosing |
434 // (ProcessInputEventAck) method, but not on other platforms; using | 537 // (ProcessInputEventAck) method, but not on other platforms; using |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 SendWheelEvent(next_wheel_event); | 656 SendWheelEvent(next_wheel_event); |
554 } | 657 } |
555 } | 658 } |
556 | 659 |
557 void ImmediateInputRouter::ProcessGestureAck(WebInputEvent::Type type, | 660 void ImmediateInputRouter::ProcessGestureAck(WebInputEvent::Type type, |
558 InputEventAckState ack_result, | 661 InputEventAckState ack_result, |
559 const ui::LatencyInfo& latency) { | 662 const ui::LatencyInfo& latency) { |
560 // If |ack_result| originated from the overscroll controller, only | 663 // If |ack_result| originated from the overscroll controller, only |
561 // feed |gesture_event_filter_| the ack if it was expecting one. | 664 // feed |gesture_event_filter_| the ack if it was expecting one. |
562 if (current_ack_source_ == OVERSCROLL_CONTROLLER && | 665 if (current_ack_source_ == OVERSCROLL_CONTROLLER && |
563 !gesture_event_filter_->HasQueuedGestureEvents()) { | 666 !event_filter_->HasQueuedGestureEvents()) { |
564 return; | 667 return; |
565 } | 668 } |
566 | 669 |
567 // |gesture_event_filter_| will forward to OnGestureEventAck when appropriate. | 670 // |gesture_event_filter_| will forward to OnGestureEventAck when appropriate. |
568 gesture_event_filter_->ProcessGestureAck(ack_result, type, latency); | 671 event_filter_->ProcessGestureAck(ack_result, type, latency); |
569 } | 672 } |
570 | 673 |
571 void ImmediateInputRouter::ProcessTouchAck( | 674 void ImmediateInputRouter::ProcessTouchAck( |
572 InputEventAckState ack_result, | 675 InputEventAckState ack_result, |
573 const ui::LatencyInfo& latency) { | 676 const ui::LatencyInfo& latency) { |
574 // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. | 677 // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. |
575 touch_event_queue_->ProcessTouchAck(ack_result, latency); | 678 touch_event_queue_->ProcessTouchAck(ack_result, latency); |
576 } | 679 } |
577 | 680 |
578 void ImmediateInputRouter::ProcessAckForOverscroll( | 681 void ImmediateInputRouter::ProcessAckForOverscroll( |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 case WebMouseEvent::ButtonNone: | 777 case WebMouseEvent::ButtonNone: |
675 break; | 778 break; |
676 } | 779 } |
677 } | 780 } |
678 | 781 |
679 bool ImmediateInputRouter::IsInOverscrollGesture() const { | 782 bool ImmediateInputRouter::IsInOverscrollGesture() const { |
680 OverscrollController* controller = client_->GetOverscrollController(); | 783 OverscrollController* controller = client_->GetOverscrollController(); |
681 return controller && controller->overscroll_mode() != OVERSCROLL_NONE; | 784 return controller && controller->overscroll_mode() != OVERSCROLL_NONE; |
682 } | 785 } |
683 | 786 |
| 787 BaseGestureEventFilter* ImmediateInputRouter::gesture_event_filter() { |
| 788 return event_filter_->gesture_event_filter_.get(); |
| 789 } |
| 790 |
684 } // namespace content | 791 } // namespace content |
OLD | NEW |