Chromium Code Reviews| 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/input_router_impl.h" | 5 #include "content/browser/renderer_host/input/input_router_impl.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 client_(client), | 69 client_(client), |
| 70 ack_handler_(ack_handler), | 70 ack_handler_(ack_handler), |
| 71 routing_id_(routing_id), | 71 routing_id_(routing_id), |
| 72 select_message_pending_(false), | 72 select_message_pending_(false), |
| 73 move_caret_pending_(false), | 73 move_caret_pending_(false), |
| 74 mouse_move_pending_(false), | 74 mouse_move_pending_(false), |
| 75 mouse_wheel_pending_(false), | 75 mouse_wheel_pending_(false), |
| 76 current_view_flags_(0), | 76 current_view_flags_(0), |
| 77 current_ack_source_(ACK_SOURCE_NONE), | 77 current_ack_source_(ACK_SOURCE_NONE), |
| 78 flush_requested_(false), | 78 flush_requested_(false), |
| 79 active_fling_count_(0), | |
| 79 touch_event_queue_(this, config.touch_config), | 80 touch_event_queue_(this, config.touch_config), |
| 80 gesture_event_queue_(this, this, config.gesture_config) { | 81 gesture_event_queue_(this, this, config.gesture_config) { |
| 81 DCHECK(sender); | 82 DCHECK(sender); |
| 82 DCHECK(client); | 83 DCHECK(client); |
| 83 DCHECK(ack_handler); | 84 DCHECK(ack_handler); |
| 84 UpdateTouchAckTimeoutEnabled(); | 85 UpdateTouchAckTimeoutEnabled(); |
| 85 } | 86 } |
| 86 | 87 |
| 87 InputRouterImpl::~InputRouterImpl() { | 88 InputRouterImpl::~InputRouterImpl() { |
| 88 STLDeleteElements(&pending_select_messages_); | 89 STLDeleteElements(&pending_select_messages_); |
| 89 } | 90 } |
| 90 | 91 |
| 91 void InputRouterImpl::Flush() { | |
| 92 flush_requested_ = true; | |
| 93 SignalFlushedIfNecessary(); | |
| 94 } | |
| 95 | |
| 96 bool InputRouterImpl::SendInput(scoped_ptr<IPC::Message> message) { | 92 bool InputRouterImpl::SendInput(scoped_ptr<IPC::Message> message) { |
| 97 DCHECK(IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart); | 93 DCHECK(IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart); |
| 98 switch (message->type()) { | 94 switch (message->type()) { |
| 99 // Check for types that require an ACK. | 95 // Check for types that require an ACK. |
| 100 case InputMsg_SelectRange::ID: | 96 case InputMsg_SelectRange::ID: |
| 101 case InputMsg_MoveRangeSelectionExtent::ID: | 97 case InputMsg_MoveRangeSelectionExtent::ID: |
| 102 return SendSelectMessage(message.Pass()); | 98 return SendSelectMessage(message.Pass()); |
| 103 case InputMsg_MoveCaret::ID: | 99 case InputMsg_MoveCaret::ID: |
| 104 return SendMoveCaret(message.Pass()); | 100 return SendMoveCaret(message.Pass()); |
| 105 case InputMsg_HandleInputEvent::ID: | 101 case InputMsg_HandleInputEvent::ID: |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 237 return &key_queue_.front(); | 233 return &key_queue_.front(); |
| 238 } | 234 } |
| 239 | 235 |
| 240 void InputRouterImpl::OnViewUpdated(int view_flags) { | 236 void InputRouterImpl::OnViewUpdated(int view_flags) { |
| 241 current_view_flags_ = view_flags; | 237 current_view_flags_ = view_flags; |
| 242 | 238 |
| 243 // A fixed page scale or mobile viewport should disable the touch ack timeout. | 239 // A fixed page scale or mobile viewport should disable the touch ack timeout. |
| 244 UpdateTouchAckTimeoutEnabled(); | 240 UpdateTouchAckTimeoutEnabled(); |
| 245 } | 241 } |
| 246 | 242 |
| 243 void InputRouterImpl::RequestNotificationWhenFlushed() { | |
| 244 flush_requested_ = true; | |
| 245 SignalFlushedIfNecessary(); | |
| 246 } | |
| 247 | |
| 248 bool InputRouterImpl::HasPendingEvents() const { | |
| 249 return !touch_event_queue_.empty() || | |
| 250 !gesture_event_queue_.empty() || | |
| 251 !key_queue_.empty() || | |
| 252 mouse_move_pending_ || | |
| 253 mouse_wheel_pending_ || | |
| 254 select_message_pending_ || | |
| 255 move_caret_pending_ || | |
| 256 active_fling_count_ > 0; | |
| 257 } | |
| 258 | |
| 247 bool InputRouterImpl::OnMessageReceived(const IPC::Message& message) { | 259 bool InputRouterImpl::OnMessageReceived(const IPC::Message& message) { |
| 248 bool handled = true; | 260 bool handled = true; |
| 249 IPC_BEGIN_MESSAGE_MAP(InputRouterImpl, message) | 261 IPC_BEGIN_MESSAGE_MAP(InputRouterImpl, message) |
| 250 IPC_MESSAGE_HANDLER(InputHostMsg_HandleInputEvent_ACK, OnInputEventAck) | 262 IPC_MESSAGE_HANDLER(InputHostMsg_HandleInputEvent_ACK, OnInputEventAck) |
| 251 IPC_MESSAGE_HANDLER(InputHostMsg_DidOverscroll, OnDidOverscroll) | 263 IPC_MESSAGE_HANDLER(InputHostMsg_DidOverscroll, OnDidOverscroll) |
| 252 IPC_MESSAGE_HANDLER(InputHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) | 264 IPC_MESSAGE_HANDLER(InputHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) |
| 253 IPC_MESSAGE_HANDLER(InputHostMsg_SelectRange_ACK, OnSelectMessageAck) | 265 IPC_MESSAGE_HANDLER(InputHostMsg_SelectRange_ACK, OnSelectMessageAck) |
| 254 IPC_MESSAGE_HANDLER(InputHostMsg_MoveRangeSelectionExtent_ACK, | 266 IPC_MESSAGE_HANDLER(InputHostMsg_MoveRangeSelectionExtent_ACK, |
| 255 OnSelectMessageAck) | 267 OnSelectMessageAck) |
| 256 IPC_MESSAGE_HANDLER(ViewHostMsg_HasTouchEventHandlers, | 268 IPC_MESSAGE_HANDLER(ViewHostMsg_HasTouchEventHandlers, |
| 257 OnHasTouchEventHandlers) | 269 OnHasTouchEventHandlers) |
| 258 IPC_MESSAGE_HANDLER(InputHostMsg_SetTouchAction, | 270 IPC_MESSAGE_HANDLER(InputHostMsg_SetTouchAction, |
| 259 OnSetTouchAction) | 271 OnSetTouchAction) |
| 272 IPC_MESSAGE_HANDLER(InputHostMsg_DidStopFlinging, OnFlingingStopped) | |
| 260 IPC_MESSAGE_UNHANDLED(handled = false) | 273 IPC_MESSAGE_UNHANDLED(handled = false) |
| 261 IPC_END_MESSAGE_MAP() | 274 IPC_END_MESSAGE_MAP() |
| 262 | 275 |
| 263 return handled; | 276 return handled; |
| 264 } | 277 } |
| 265 | 278 |
| 266 void InputRouterImpl::OnTouchEventAck(const TouchEventWithLatencyInfo& event, | 279 void InputRouterImpl::OnTouchEventAck(const TouchEventWithLatencyInfo& event, |
| 267 InputEventAckState ack_result) { | 280 InputEventAckState ack_result) { |
| 268 // Touchstart events sent to the renderer indicate a new touch sequence, but | 281 // Touchstart events sent to the renderer indicate a new touch sequence, but |
| 269 // in some cases we may filter out sending the touchstart - catch those here. | 282 // in some cases we may filter out sending the touchstart - catch those here. |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 DCHECK(touch_event_queue_.IsPendingAckTouchStart()); | 491 DCHECK(touch_event_queue_.IsPendingAckTouchStart()); |
| 479 TRACE_EVENT1("input", "InputRouterImpl::OnSetTouchAction", | 492 TRACE_EVENT1("input", "InputRouterImpl::OnSetTouchAction", |
| 480 "action", touch_action); | 493 "action", touch_action); |
| 481 | 494 |
| 482 touch_action_filter_.OnSetTouchAction(touch_action); | 495 touch_action_filter_.OnSetTouchAction(touch_action); |
| 483 | 496 |
| 484 // TOUCH_ACTION_NONE should disable the touch ack timeout. | 497 // TOUCH_ACTION_NONE should disable the touch ack timeout. |
| 485 UpdateTouchAckTimeoutEnabled(); | 498 UpdateTouchAckTimeoutEnabled(); |
| 486 } | 499 } |
| 487 | 500 |
| 501 void InputRouterImpl::OnFlingingStopped() { | |
| 502 DCHECK_GT(active_fling_count_, 0); | |
| 503 --active_fling_count_; | |
| 504 SignalFlushedIfNecessary(); | |
| 505 client_->DidStopFlinging(); | |
| 506 } | |
| 507 | |
| 488 void InputRouterImpl::ProcessInputEventAck( | 508 void InputRouterImpl::ProcessInputEventAck( |
| 489 WebInputEvent::Type event_type, | 509 WebInputEvent::Type event_type, |
| 490 InputEventAckState ack_result, | 510 InputEventAckState ack_result, |
| 491 const ui::LatencyInfo& latency_info, | 511 const ui::LatencyInfo& latency_info, |
| 492 AckSource ack_source) { | 512 AckSource ack_source) { |
| 493 TRACE_EVENT2("input", "InputRouterImpl::ProcessInputEventAck", | 513 TRACE_EVENT2("input", "InputRouterImpl::ProcessInputEventAck", |
| 494 "type", WebInputEventTraits::GetName(event_type), | 514 "type", WebInputEventTraits::GetName(event_type), |
| 495 "ack", GetEventAckName(ack_result)); | 515 "ack", GetEventAckName(ack_result)); |
| 496 | 516 |
| 497 // Note: The keyboard ack must be treated carefully, as it may result in | 517 // Note: The keyboard ack must be treated carefully, as it may result in |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 579 MouseWheelEventWithLatencyInfo next_wheel_event = | 599 MouseWheelEventWithLatencyInfo next_wheel_event = |
| 580 coalesced_mouse_wheel_events_.front(); | 600 coalesced_mouse_wheel_events_.front(); |
| 581 coalesced_mouse_wheel_events_.pop_front(); | 601 coalesced_mouse_wheel_events_.pop_front(); |
| 582 SendWheelEvent(next_wheel_event); | 602 SendWheelEvent(next_wheel_event); |
| 583 } | 603 } |
| 584 } | 604 } |
| 585 | 605 |
| 586 void InputRouterImpl::ProcessGestureAck(WebInputEvent::Type type, | 606 void InputRouterImpl::ProcessGestureAck(WebInputEvent::Type type, |
| 587 InputEventAckState ack_result, | 607 InputEventAckState ack_result, |
| 588 const ui::LatencyInfo& latency) { | 608 const ui::LatencyInfo& latency) { |
| 609 if (type == blink::WebInputEvent::GestureFlingStart && | |
| 610 ack_result == INPUT_EVENT_ACK_STATE_CONSUMED) { | |
| 611 ++active_fling_count_; | |
| 612 } | |
|
Yufeng Shen (Slow to review)
2015/03/13 15:53:42
I saw that gesture event queue also maintains a fl
jdduke (slow)
2015/03/13 16:08:04
Probably, although the gesture queue fling in prog
| |
| 613 | |
| 589 // |gesture_event_queue_| will forward to OnGestureEventAck when appropriate. | 614 // |gesture_event_queue_| will forward to OnGestureEventAck when appropriate. |
| 590 gesture_event_queue_.ProcessGestureAck(ack_result, type, latency); | 615 gesture_event_queue_.ProcessGestureAck(ack_result, type, latency); |
| 591 } | 616 } |
| 592 | 617 |
| 593 void InputRouterImpl::ProcessTouchAck( | 618 void InputRouterImpl::ProcessTouchAck( |
| 594 InputEventAckState ack_result, | 619 InputEventAckState ack_result, |
| 595 const ui::LatencyInfo& latency) { | 620 const ui::LatencyInfo& latency) { |
| 596 // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. | 621 // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. |
| 597 touch_event_queue_.ProcessTouchAck(ack_result, latency); | 622 touch_event_queue_.ProcessTouchAck(ack_result, latency); |
| 598 } | 623 } |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 619 if (!flush_requested_) | 644 if (!flush_requested_) |
| 620 return; | 645 return; |
| 621 | 646 |
| 622 if (HasPendingEvents()) | 647 if (HasPendingEvents()) |
| 623 return; | 648 return; |
| 624 | 649 |
| 625 flush_requested_ = false; | 650 flush_requested_ = false; |
| 626 client_->DidFlush(); | 651 client_->DidFlush(); |
| 627 } | 652 } |
| 628 | 653 |
| 629 bool InputRouterImpl::HasPendingEvents() const { | |
| 630 return !touch_event_queue_.empty() || | |
| 631 !gesture_event_queue_.empty() || | |
| 632 !key_queue_.empty() || | |
| 633 mouse_move_pending_ || | |
| 634 mouse_wheel_pending_ || | |
| 635 select_message_pending_ || | |
| 636 move_caret_pending_; | |
| 637 } | |
| 638 | |
| 639 } // namespace content | 654 } // namespace content |
| OLD | NEW |