| 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/command_line.h" |    7 #include "base/command_line.h" | 
|    8 #include "base/metrics/histogram.h" |    8 #include "base/metrics/histogram.h" | 
|    9 #include "content/browser/renderer_host/input/gesture_event_filter.h" |    9 #include "content/browser/renderer_host/input/gesture_event_filter.h" | 
 |   10 #include "content/browser/renderer_host/input/input_ack_handler.h" | 
|   10 #include "content/browser/renderer_host/input/input_router_client.h" |   11 #include "content/browser/renderer_host/input/input_router_client.h" | 
|   11 #include "content/browser/renderer_host/input/touch_event_queue.h" |   12 #include "content/browser/renderer_host/input/touch_event_queue.h" | 
|   12 #include "content/browser/renderer_host/input/touchpad_tap_suppression_controlle
     r.h" |   13 #include "content/browser/renderer_host/input/touchpad_tap_suppression_controlle
     r.h" | 
|   13 #include "content/browser/renderer_host/render_process_host_impl.h" |   14 #include "content/browser/renderer_host/render_process_host_impl.h" | 
|   14 #include "content/common/content_constants_internal.h" |   15 #include "content/common/content_constants_internal.h" | 
|   15 #include "content/common/edit_command.h" |   16 #include "content/common/edit_command.h" | 
|   16 #include "content/common/input_messages.h" |   17 #include "content/common/input_messages.h" | 
|   17 #include "content/common/view_messages.h" |   18 #include "content/common/view_messages.h" | 
|   18 #include "content/port/common/input_event_ack_state.h" |   19 #include "content/port/common/input_event_ack_state.h" | 
|   19 #include "content/public/browser/notification_service.h" |   20 #include "content/public/browser/notification_service.h" | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   64     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"; | 
|   65   default: |   66   default: | 
|   66     DLOG(WARNING) << "Unhandled InputEventAckState in GetEventAckName.\n"; |   67     DLOG(WARNING) << "Unhandled InputEventAckState in GetEventAckName.\n"; | 
|   67     break; |   68     break; | 
|   68   } |   69   } | 
|   69   return ""; |   70   return ""; | 
|   70 } |   71 } | 
|   71  |   72  | 
|   72 } // namespace |   73 } // namespace | 
|   73  |   74  | 
|   74 ImmediateInputRouter::ImmediateInputRouter( |   75 ImmediateInputRouter::ImmediateInputRouter(RenderProcessHost* process, | 
|   75     RenderProcessHost* process, |   76                                            InputRouterClient* client, | 
|   76     InputRouterClient* client, |   77                                            InputAckHandler* ack_handler, | 
|   77     int routing_id) |   78                                            int routing_id) | 
|   78     : process_(process), |   79     : process_(process), | 
|   79       client_(client), |   80       client_(client), | 
 |   81       ack_handler_(ack_handler), | 
|   80       routing_id_(routing_id), |   82       routing_id_(routing_id), | 
|   81       select_range_pending_(false), |   83       select_range_pending_(false), | 
|   82       move_caret_pending_(false), |   84       move_caret_pending_(false), | 
|   83       mouse_move_pending_(false), |   85       mouse_move_pending_(false), | 
|   84       mouse_wheel_pending_(false), |   86       mouse_wheel_pending_(false), | 
|   85       has_touch_handler_(false), |   87       has_touch_handler_(false), | 
|   86       touch_event_queue_(new TouchEventQueue(this)), |   88       touch_event_queue_(new TouchEventQueue(this)), | 
|   87       gesture_event_filter_(new GestureEventFilter(this)) { |   89       gesture_event_filter_(new GestureEventFilter(this)) { | 
|   88   enable_no_touch_to_renderer_while_scrolling_ = |   90   enable_no_touch_to_renderer_while_scrolling_ = | 
|   89       CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |   91       CommandLine::ForCurrentProcess()->HasSwitch( | 
|   90           switches::kNoTouchToRendererWhileScrolling) == "1"; |   92           switches::kNoTouchToRendererWhileScrolling); | 
|   91   DCHECK(process); |   93   DCHECK(process); | 
|   92   DCHECK(client); |   94   DCHECK(client); | 
|   93 } |   95 } | 
|   94  |   96  | 
|   95 ImmediateInputRouter::~ImmediateInputRouter() { |   97 ImmediateInputRouter::~ImmediateInputRouter() { | 
|   96 } |   98 } | 
|   97  |   99  | 
|   98 bool ImmediateInputRouter::SendInput(IPC::Message* message) { |  100 void ImmediateInputRouter::Flush() { | 
 |  101   NOTREACHED() << "ImmediateInputRouter will never request a flush."; | 
 |  102 } | 
 |  103  | 
 |  104 bool ImmediateInputRouter::SendInput(scoped_ptr<IPC::Message> message) { | 
|   99   DCHECK(IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart); |  105   DCHECK(IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart); | 
|  100   scoped_ptr<IPC::Message> scoped_message(message); |  106   switch (message->type()) { | 
|  101   switch (scoped_message->type()) { |  | 
|  102     // Check for types that require an ACK. |  107     // Check for types that require an ACK. | 
|  103     case InputMsg_SelectRange::ID: |  108     case InputMsg_SelectRange::ID: | 
|  104       return SendSelectRange(scoped_message.release()); |  109       return SendSelectRange(message.Pass()); | 
|  105     case InputMsg_MoveCaret::ID: |  110     case InputMsg_MoveCaret::ID: | 
|  106       return SendMoveCaret(scoped_message.release()); |  111       return SendMoveCaret(message.Pass()); | 
|  107     case InputMsg_HandleInputEvent::ID: |  112     case InputMsg_HandleInputEvent::ID: | 
|  108       NOTREACHED() << "WebInputEvents should never be sent via SendInput."; |  113       NOTREACHED() << "WebInputEvents should never be sent via SendInput."; | 
|  109       return false; |  114       return false; | 
|  110     default: |  115     default: | 
|  111       return Send(scoped_message.release()); |  116       return Send(message.release()); | 
|  112   } |  117   } | 
|  113 } |  118 } | 
|  114  |  119  | 
|  115 void ImmediateInputRouter::SendMouseEvent( |  120 void ImmediateInputRouter::SendMouseEvent( | 
|  116     const MouseEventWithLatencyInfo& mouse_event) { |  121     const MouseEventWithLatencyInfo& mouse_event) { | 
|  117   if (!client_->OnSendMouseEvent(mouse_event)) |  122   if (!client_->OnSendMouseEvent(mouse_event)) | 
|  118     return; |  123     return; | 
|  119  |  124  | 
|  120   if (mouse_event.event.type == WebInputEvent::MouseDown && |  125   if (mouse_event.event.type == WebInputEvent::MouseDown && | 
|  121       gesture_event_filter_->GetTouchpadTapSuppressionController()-> |  126       gesture_event_filter_->GetTouchpadTapSuppressionController()-> | 
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  292   IPC_BEGIN_MESSAGE_MAP_EX(ImmediateInputRouter, message, message_is_ok) |  297   IPC_BEGIN_MESSAGE_MAP_EX(ImmediateInputRouter, message, message_is_ok) | 
|  293     IPC_MESSAGE_HANDLER(InputHostMsg_HandleInputEvent_ACK, OnInputEventAck) |  298     IPC_MESSAGE_HANDLER(InputHostMsg_HandleInputEvent_ACK, OnInputEventAck) | 
|  294     IPC_MESSAGE_HANDLER(ViewHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) |  299     IPC_MESSAGE_HANDLER(ViewHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) | 
|  295     IPC_MESSAGE_HANDLER(ViewHostMsg_SelectRange_ACK, OnSelectRangeAck) |  300     IPC_MESSAGE_HANDLER(ViewHostMsg_SelectRange_ACK, OnSelectRangeAck) | 
|  296     IPC_MESSAGE_HANDLER(ViewHostMsg_HasTouchEventHandlers, |  301     IPC_MESSAGE_HANDLER(ViewHostMsg_HasTouchEventHandlers, | 
|  297                         OnHasTouchEventHandlers) |  302                         OnHasTouchEventHandlers) | 
|  298     IPC_MESSAGE_UNHANDLED(handled = false) |  303     IPC_MESSAGE_UNHANDLED(handled = false) | 
|  299   IPC_END_MESSAGE_MAP() |  304   IPC_END_MESSAGE_MAP() | 
|  300  |  305  | 
|  301   if (!message_is_ok) |  306   if (!message_is_ok) | 
|  302     client_->OnUnexpectedEventAck(true); |  307     ack_handler_->OnUnexpectedEventAck(InputAckHandler::BAD_ACK_MESSAGE); | 
|  303  |  308  | 
|  304   return handled; |  309   return handled; | 
|  305 } |  310 } | 
|  306  |  311  | 
|  307 void ImmediateInputRouter::OnTouchEventAck( |  312 void ImmediateInputRouter::OnTouchEventAck( | 
|  308     const TouchEventWithLatencyInfo& event, |  313     const TouchEventWithLatencyInfo& event, | 
|  309     InputEventAckState ack_result) { |  314     InputEventAckState ack_result) { | 
|  310   client_->OnTouchEventAck(event, ack_result); |  315   ack_handler_->OnTouchEventAck(event, ack_result); | 
|  311 } |  316 } | 
|  312  |  317  | 
|  313 bool ImmediateInputRouter::SendSelectRange(IPC::Message* message) { |  318 bool ImmediateInputRouter::SendSelectRange(scoped_ptr<IPC::Message> message) { | 
|  314   DCHECK(message->type() == InputMsg_SelectRange::ID); |  319   DCHECK(message->type() == InputMsg_SelectRange::ID); | 
|  315   if (select_range_pending_) { |  320   if (select_range_pending_) { | 
|  316     next_selection_range_.reset(message); |  321     next_selection_range_ = message.Pass(); | 
|  317     return true; |  322     return true; | 
|  318   } |  323   } | 
|  319  |  324  | 
|  320   select_range_pending_ = true; |  325   select_range_pending_ = true; | 
|  321   return Send(message); |  326   return Send(message.release()); | 
|  322 } |  327 } | 
|  323  |  328  | 
|  324 bool ImmediateInputRouter::SendMoveCaret(IPC::Message* message) { |  329 bool ImmediateInputRouter::SendMoveCaret(scoped_ptr<IPC::Message> message) { | 
|  325   DCHECK(message->type() == InputMsg_MoveCaret::ID); |  330   DCHECK(message->type() == InputMsg_MoveCaret::ID); | 
|  326   if (move_caret_pending_) { |  331   if (move_caret_pending_) { | 
|  327     next_move_caret_.reset(message); |  332     next_move_caret_ = message.Pass(); | 
|  328     return true; |  333     return true; | 
|  329   } |  334   } | 
|  330  |  335  | 
|  331   move_caret_pending_ = true; |  336   move_caret_pending_ = true; | 
|  332   return Send(message); |  337   return Send(message.release()); | 
|  333 } |  338 } | 
|  334  |  339  | 
|  335 bool ImmediateInputRouter::Send(IPC::Message* message) { |  340 bool ImmediateInputRouter::Send(IPC::Message* message) { | 
|  336   return process_->Send(message); |  341   return process_->Send(message); | 
|  337 } |  342 } | 
|  338  |  343  | 
|  339 void ImmediateInputRouter::SendWebInputEvent( |  344 void ImmediateInputRouter::SendWebInputEvent( | 
|  340     const WebInputEvent& input_event, |  345     const WebInputEvent& input_event, | 
|  341     const ui::LatencyInfo& latency_info, |  346     const ui::LatencyInfo& latency_info, | 
|  342     bool is_keyboard_shortcut) { |  347     bool is_keyboard_shortcut) { | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  396         // the overscroll is updated properly. |  401         // the overscroll is updated properly. | 
|  397         touch_event_queue_->ProcessTouchAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, |  402         touch_event_queue_->ProcessTouchAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, | 
|  398                                             latency_info); |  403                                             latency_info); | 
|  399       } |  404       } | 
|  400       return; |  405       return; | 
|  401     } |  406     } | 
|  402  |  407  | 
|  403     // Proceed as normal. |  408     // Proceed as normal. | 
|  404     case INPUT_EVENT_ACK_STATE_NOT_CONSUMED: |  409     case INPUT_EVENT_ACK_STATE_NOT_CONSUMED: | 
|  405       break; |  410       break; | 
|  406   }; |  411   } | 
|  407  |  412  | 
|  408   // Transmit any pending wheel events on a non-wheel event. This ensures that |  413   // Transmit any pending wheel events on a non-wheel event. This ensures that | 
|  409   // the renderer receives the final PhaseEnded wheel event, which is necessary |  414   // the renderer receives the final PhaseEnded wheel event, which is necessary | 
|  410   // to terminate rubber-banding, for example. |  415   // to terminate rubber-banding, for example. | 
|  411   if (input_event.type != WebInputEvent::MouseWheel) { |  416   if (input_event.type != WebInputEvent::MouseWheel) { | 
|  412     for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) { |  417     for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) { | 
|  413       SendWebInputEvent(coalesced_mouse_wheel_events_[i].event, |  418       SendWebInputEvent(coalesced_mouse_wheel_events_[i].event, | 
|  414                        coalesced_mouse_wheel_events_[i].latency, |  419                        coalesced_mouse_wheel_events_[i].latency, | 
|  415                       false); |  420                       false); | 
|  416     } |  421     } | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|  432   UMA_HISTOGRAM_TIMES("MPArch.IIR_InputEventDelta", delta); |  437   UMA_HISTOGRAM_TIMES("MPArch.IIR_InputEventDelta", delta); | 
|  433  |  438  | 
|  434   client_->DecrementInFlightEventCount(); |  439   client_->DecrementInFlightEventCount(); | 
|  435  |  440  | 
|  436   ProcessInputEventAck(event_type, ack_result, latency_info); |  441   ProcessInputEventAck(event_type, ack_result, latency_info); | 
|  437 } |  442 } | 
|  438  |  443  | 
|  439 void ImmediateInputRouter::OnMsgMoveCaretAck() { |  444 void ImmediateInputRouter::OnMsgMoveCaretAck() { | 
|  440   move_caret_pending_ = false; |  445   move_caret_pending_ = false; | 
|  441   if (next_move_caret_) |  446   if (next_move_caret_) | 
|  442     SendMoveCaret(next_move_caret_.release()); |  447     SendMoveCaret(next_move_caret_.Pass()); | 
|  443 } |  448 } | 
|  444  |  449  | 
|  445 void ImmediateInputRouter::OnSelectRangeAck() { |  450 void ImmediateInputRouter::OnSelectRangeAck() { | 
|  446   select_range_pending_ = false; |  451   select_range_pending_ = false; | 
|  447   if (next_selection_range_) |  452   if (next_selection_range_) | 
|  448     SendSelectRange(next_selection_range_.release()); |  453     SendSelectRange(next_selection_range_.Pass()); | 
|  449 } |  454 } | 
|  450  |  455  | 
|  451 void ImmediateInputRouter::OnHasTouchEventHandlers(bool has_handlers) { |  456 void ImmediateInputRouter::OnHasTouchEventHandlers(bool has_handlers) { | 
|  452  if (has_touch_handler_ == has_handlers) |  457  if (has_touch_handler_ == has_handlers) | 
|  453     return; |  458     return; | 
|  454   has_touch_handler_ = has_handlers; |  459   has_touch_handler_ = has_handlers; | 
|  455   if (!has_handlers) |  460   if (!has_handlers) | 
|  456     touch_event_queue_->FlushQueue(); |  461     touch_event_queue_->FlushQueue(); | 
|  457   client_->OnHasTouchEventHandlers(has_handlers); |  462   client_->OnHasTouchEventHandlers(has_handlers); | 
|  458 } |  463 } | 
|  459  |  464  | 
|  460 void ImmediateInputRouter::ProcessInputEventAck( |  465 void ImmediateInputRouter::ProcessInputEventAck( | 
|  461     WebInputEvent::Type event_type, |  466     WebInputEvent::Type event_type, | 
|  462     InputEventAckState ack_result, |  467     InputEventAckState ack_result, | 
|  463     const ui::LatencyInfo& latency_info) { |  468     const ui::LatencyInfo& latency_info) { | 
|  464   TRACE_EVENT1("input", "ImmediateInputRouter::ProcessInputEventAck", |  469   TRACE_EVENT1("input", "ImmediateInputRouter::ProcessInputEventAck", | 
|  465                "ack", GetEventAckName(ack_result)); |  470                "ack", GetEventAckName(ack_result)); | 
|  466  |  471  | 
|  467   int type = static_cast<int>(event_type); |  472   int type = static_cast<int>(event_type); | 
|  468   if (type < WebInputEvent::Undefined) { |  473   if (type < WebInputEvent::Undefined) { | 
|  469     client_->OnUnexpectedEventAck(true); |  474     ack_handler_->OnUnexpectedEventAck(InputAckHandler::BAD_ACK_MESSAGE); | 
|  470   } else if (type == WebInputEvent::MouseMove) { |  475   } else if (type == WebInputEvent::MouseMove) { | 
|  471     mouse_move_pending_ = false; |  476     mouse_move_pending_ = false; | 
|  472  |  477  | 
|  473     // now, we can send the next mouse move event |  478     // now, we can send the next mouse move event | 
|  474     if (next_mouse_move_) { |  479     if (next_mouse_move_) { | 
|  475       DCHECK(next_mouse_move_->event.type == WebInputEvent::MouseMove); |  480       DCHECK(next_mouse_move_->event.type == WebInputEvent::MouseMove); | 
|  476       scoped_ptr<MouseEventWithLatencyInfo> next_mouse_move |  481       scoped_ptr<MouseEventWithLatencyInfo> next_mouse_move | 
|  477           = next_mouse_move_.Pass(); |  482           = next_mouse_move_.Pass(); | 
|  478       SendMouseEvent(*next_mouse_move); |  483       SendMouseEvent(*next_mouse_move); | 
|  479     } |  484     } | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|  499   NotificationService::current()->Notify( |  504   NotificationService::current()->Notify( | 
|  500       NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_INPUT_EVENT_ACK, |  505       NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_INPUT_EVENT_ACK, | 
|  501       Source<void>(this), |  506       Source<void>(this), | 
|  502       Details<int>(&type)); |  507       Details<int>(&type)); | 
|  503 } |  508 } | 
|  504  |  509  | 
|  505 void ImmediateInputRouter::ProcessKeyboardAck( |  510 void ImmediateInputRouter::ProcessKeyboardAck( | 
|  506     int type, |  511     int type, | 
|  507     InputEventAckState ack_result) { |  512     InputEventAckState ack_result) { | 
|  508   if (key_queue_.empty()) { |  513   if (key_queue_.empty()) { | 
|  509     LOG(ERROR) << "Got a KeyEvent back from the renderer but we " |  514     ack_handler_->OnUnexpectedEventAck(InputAckHandler::UNEXPECTED_ACK); | 
|  510                << "don't seem to have sent it to the renderer!"; |  | 
|  511   } else if (key_queue_.front().type != type) { |  515   } else if (key_queue_.front().type != type) { | 
|  512     LOG(ERROR) << "We seem to have a different key type sent from " |  | 
|  513                << "the renderer. (" << key_queue_.front().type << " vs. " |  | 
|  514                << type << "). Ignoring event."; |  | 
|  515  |  | 
|  516     // Something must be wrong. Clear the |key_queue_| and char event |  516     // Something must be wrong. Clear the |key_queue_| and char event | 
|  517     // suppression so that we can resume from the error. |  517     // suppression so that we can resume from the error. | 
|  518     key_queue_.clear(); |  518     key_queue_.clear(); | 
|  519     client_->OnUnexpectedEventAck(false); |  519     ack_handler_->OnUnexpectedEventAck(InputAckHandler::UNEXPECTED_EVENT_TYPE); | 
|  520   } else { |  520   } else { | 
|  521     NativeWebKeyboardEvent front_item = key_queue_.front(); |  521     NativeWebKeyboardEvent front_item = key_queue_.front(); | 
|  522     key_queue_.pop_front(); |  522     key_queue_.pop_front(); | 
|  523  |  523  | 
|  524     client_->OnKeyboardEventAck(front_item, ack_result); |  524     ack_handler_->OnKeyboardEventAck(front_item, ack_result); | 
|  525  |  | 
|  526     // WARNING: This ImmediateInputRouter can be deallocated at this point |  525     // WARNING: This ImmediateInputRouter can be deallocated at this point | 
|  527     // (i.e.  in the case of Ctrl+W, where the call to |  526     // (i.e.  in the case of Ctrl+W, where the call to | 
|  528     // HandleKeyboardEvent destroys this ImmediateInputRouter). |  527     // HandleKeyboardEvent destroys this ImmediateInputRouter). | 
|  529   } |  528   } | 
|  530 } |  529 } | 
|  531  |  530  | 
|  532 void ImmediateInputRouter::ProcessWheelAck(InputEventAckState ack_result) { |  531 void ImmediateInputRouter::ProcessWheelAck(InputEventAckState ack_result) { | 
|  533   mouse_wheel_pending_ = false; |  532   mouse_wheel_pending_ = false; | 
|  534  |  533  | 
|  535   // Process the unhandled wheel event here before calling |  534   // Process the unhandled wheel event here before calling | 
|  536   // ForwardWheelEventWithLatencyInfo() since it will mutate |  535   // ForwardWheelEventWithLatencyInfo() since it will mutate | 
|  537   // current_wheel_event_. |  536   // current_wheel_event_. | 
|  538   client_->OnWheelEventAck(current_wheel_event_.event, ack_result); |  537   ack_handler_->OnWheelEventAck(current_wheel_event_.event, ack_result); | 
|  539  |  538  | 
|  540   // Now send the next (coalesced) mouse wheel event. |  539   // Now send the next (coalesced) mouse wheel event. | 
|  541   if (!coalesced_mouse_wheel_events_.empty()) { |  540   if (!coalesced_mouse_wheel_events_.empty()) { | 
|  542     MouseWheelEventWithLatencyInfo next_wheel_event = |  541     MouseWheelEventWithLatencyInfo next_wheel_event = | 
|  543         coalesced_mouse_wheel_events_.front(); |  542         coalesced_mouse_wheel_events_.front(); | 
|  544     coalesced_mouse_wheel_events_.pop_front(); |  543     coalesced_mouse_wheel_events_.pop_front(); | 
|  545     SendWheelEvent(next_wheel_event); |  544     SendWheelEvent(next_wheel_event); | 
|  546   } |  545   } | 
|  547 } |  546 } | 
|  548  |  547  | 
|  549 void ImmediateInputRouter::ProcessGestureAck(int type, |  548 void ImmediateInputRouter::ProcessGestureAck(int type, | 
|  550                                              InputEventAckState ack_result) { |  549                                              InputEventAckState ack_result) { | 
|  551   const bool processed = (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result); |  550   const bool processed = (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result); | 
|  552   client_->OnGestureEventAck( |  551   ack_handler_->OnGestureEventAck( | 
|  553       gesture_event_filter_->GetGestureEventAwaitingAck(), ack_result); |  552       gesture_event_filter_->GetGestureEventAwaitingAck(), ack_result); | 
|  554   gesture_event_filter_->ProcessGestureAck(processed, type); |  553   gesture_event_filter_->ProcessGestureAck(processed, type); | 
|  555 } |  554 } | 
|  556  |  555  | 
|  557 void ImmediateInputRouter::ProcessTouchAck( |  556 void ImmediateInputRouter::ProcessTouchAck( | 
|  558     InputEventAckState ack_result, |  557     InputEventAckState ack_result, | 
|  559     const ui::LatencyInfo& latency_info) { |  558     const ui::LatencyInfo& latency_info) { | 
|  560   // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. |  559   // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. | 
|  561   touch_event_queue_->ProcessTouchAck(ack_result, latency_info); |  560   touch_event_queue_->ProcessTouchAck(ack_result, latency_info); | 
|  562 } |  561 } | 
|  563  |  562  | 
|  564 void ImmediateInputRouter::HandleGestureScroll( |  563 void ImmediateInputRouter::HandleGestureScroll( | 
|  565     const GestureEventWithLatencyInfo& gesture_event) { |  564     const GestureEventWithLatencyInfo& gesture_event) { | 
|  566   if (!enable_no_touch_to_renderer_while_scrolling_) |  565   if (!enable_no_touch_to_renderer_while_scrolling_) | 
|  567     return; |  566     return; | 
|  568  |  567  | 
|  569   // Once scrolling is started stop forwarding touch move events to renderer. |  568   // Once scrolling is started stop forwarding touch move events to renderer. | 
|  570   if (gesture_event.event.type == WebInputEvent::GestureScrollBegin) |  569   if (gesture_event.event.type == WebInputEvent::GestureScrollBegin) | 
|  571     touch_event_queue_->set_no_touch_move_to_renderer(true); |  570     touch_event_queue_->set_no_touch_move_to_renderer(true); | 
|  572  |  571  | 
|  573   if (gesture_event.event.type == WebInputEvent::GestureScrollEnd || |  572   if (gesture_event.event.type == WebInputEvent::GestureScrollEnd || | 
|  574       gesture_event.event.type == WebInputEvent::GestureFlingStart) { |  573       gesture_event.event.type == WebInputEvent::GestureFlingStart) { | 
|  575     touch_event_queue_->set_no_touch_move_to_renderer(false); |  574     touch_event_queue_->set_no_touch_move_to_renderer(false); | 
|  576   } |  575   } | 
|  577 } |  576 } | 
|  578  |  577  | 
|  579 }  // namespace content |  578 }  // namespace content | 
| OLD | NEW |