Index: content/browser/renderer_host/input/input_router_impl.cc |
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc |
index 1028668e51100a582df1f4d54792935b6419897d..129f34698a3b97b521c3dbc4f61b1194154da54f 100644 |
--- a/content/browser/renderer_host/input/input_router_impl.cc |
+++ b/content/browser/renderer_host/input/input_router_impl.cc |
@@ -146,12 +146,14 @@ InputRouterImpl::InputRouterImpl(IPC::Sender* sender, |
touch_ack_timeout_supported_(false), |
current_view_flags_(0), |
current_ack_source_(ACK_SOURCE_NONE), |
- gesture_event_queue_(new GestureEventQueue(this, this)) { |
+ flush_requested_(false), |
+ touch_event_queue_(this, |
+ GetTouchScrollingMode(), |
+ GetTouchMoveSlopSuppressionLengthDips()), |
+ gesture_event_queue_(this, this) { |
DCHECK(sender); |
DCHECK(client); |
DCHECK(ack_handler); |
- touch_event_queue_.reset(new TouchEventQueue( |
- this, GetTouchScrollingMode(), GetTouchMoveSlopSuppressionLengthDips())); |
touch_ack_timeout_supported_ = |
GetTouchAckTimeoutDelay(&touch_ack_timeout_delay_); |
UpdateTouchAckTimeoutEnabled(); |
@@ -159,7 +161,10 @@ InputRouterImpl::InputRouterImpl(IPC::Sender* sender, |
InputRouterImpl::~InputRouterImpl() {} |
-void InputRouterImpl::Flush() {} |
+void InputRouterImpl::Flush() { |
+ flush_requested_ = true; |
+ SignalFlushedIfNecessary(); |
+} |
bool InputRouterImpl::SendInput(scoped_ptr<IPC::Message> message) { |
DCHECK(IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart); |
@@ -188,11 +193,11 @@ void InputRouterImpl::SendMouseEvent( |
} |
if (mouse_event.event.type == WebInputEvent::MouseDown && |
- gesture_event_queue_->GetTouchpadTapSuppressionController()-> |
+ gesture_event_queue_.GetTouchpadTapSuppressionController()-> |
ShouldDeferMouseDown(mouse_event)) |
return; |
if (mouse_event.event.type == WebInputEvent::MouseUp && |
- gesture_event_queue_->GetTouchpadTapSuppressionController()-> |
+ gesture_event_queue_.GetTouchpadTapSuppressionController()-> |
ShouldSuppressMouseUp()) |
return; |
@@ -232,7 +237,7 @@ void InputRouterImpl::SendKeyboardEvent(const NativeWebKeyboardEvent& key_event, |
key_queue_.push_back(key_event); |
HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); |
- gesture_event_queue_->FlingHasBeenHalted(); |
+ gesture_event_queue_.FlingHasBeenHalted(); |
// Only forward the non-native portions of our event. |
FilterAndSendWebInputEvent(key_event, latency_info, is_keyboard_shortcut); |
@@ -246,10 +251,10 @@ void InputRouterImpl::SendGestureEvent( |
if (touch_action_filter_.FilterGestureEvent(&gesture_event.event)) |
return; |
- touch_event_queue_->OnGestureScrollEvent(gesture_event); |
+ touch_event_queue_.OnGestureScrollEvent(gesture_event); |
if (!IsInOverscrollGesture() && |
- !gesture_event_queue_->ShouldForward(gesture_event)) { |
+ !gesture_event_queue_.ShouldForward(gesture_event)) { |
OverscrollController* controller = client_->GetOverscrollController(); |
if (controller) |
controller->DiscardingGestureEvent(gesture_event.event); |
@@ -261,7 +266,7 @@ void InputRouterImpl::SendGestureEvent( |
void InputRouterImpl::SendTouchEvent( |
const TouchEventWithLatencyInfo& touch_event) { |
- touch_event_queue_->QueueEvent(touch_event); |
+ touch_event_queue_.QueueEvent(touch_event); |
} |
// Forwards MouseEvent without passing it through |
@@ -314,7 +319,7 @@ const NativeWebKeyboardEvent* InputRouterImpl::GetLastKeyboardEvent() const { |
bool InputRouterImpl::ShouldForwardTouchEvent() const { |
// Always send a touch event if the renderer has a touch-event handler or |
// there are pending touch events. |
- return touch_event_queue_->has_handlers() || !touch_event_queue_->empty(); |
+ return touch_event_queue_.has_handlers() || !touch_event_queue_.empty(); |
} |
void InputRouterImpl::OnViewUpdated(int view_flags) { |
@@ -359,7 +364,7 @@ void InputRouterImpl::OnTouchEventAck(const TouchEventWithLatencyInfo& event, |
void InputRouterImpl::OnGestureEventAck( |
const GestureEventWithLatencyInfo& event, |
InputEventAckState ack_result) { |
- touch_event_queue_->OnGestureEventAck(event, ack_result); |
+ touch_event_queue_.OnGestureEventAck(event, ack_result); |
ProcessAckForOverscroll(event.event, ack_result); |
ack_handler_->OnGestureEventAck(event, ack_result); |
} |
@@ -467,7 +472,7 @@ bool InputRouterImpl::OfferToOverscrollController( |
const blink::WebGestureEvent& gesture_event = |
static_cast<const blink::WebGestureEvent&>(input_event); |
// An ACK is expected for the event, so mark it as consumed. |
- consumed = !gesture_event_queue_->ShouldForward( |
+ consumed = !gesture_event_queue_.ShouldForward( |
GestureEventWithLatencyInfo(gesture_event, latency_info)); |
} |
@@ -575,13 +580,13 @@ void InputRouterImpl::OnHasTouchEventHandlers(bool has_handlers) { |
TRACE_EVENT1("input", "InputRouterImpl::OnHasTouchEventHandlers", |
"has_handlers", has_handlers); |
- touch_event_queue_->OnHasTouchEventHandlers(has_handlers); |
+ touch_event_queue_.OnHasTouchEventHandlers(has_handlers); |
client_->OnHasTouchEventHandlers(has_handlers); |
} |
void InputRouterImpl::OnSetTouchAction(TouchAction touch_action) { |
// Synthetic touchstart events should get filtered out in RenderWidget. |
- DCHECK(touch_event_queue_->IsPendingAckTouchStart()); |
+ DCHECK(touch_event_queue_.IsPendingAckTouchStart()); |
TRACE_EVENT1("input", "InputRouterImpl::OnSetTouchAction", |
"action", touch_action); |
@@ -623,6 +628,8 @@ void InputRouterImpl::ProcessInputEventAck( |
} else if (event_type != WebInputEvent::Undefined) { |
ack_handler_->OnUnexpectedEventAck(InputAckHandler::BAD_ACK_MESSAGE); |
} |
+ |
+ SignalFlushedIfNecessary(); |
} |
void InputRouterImpl::ProcessKeyboardAck(blink::WebInputEvent::Type type, |
@@ -688,19 +695,19 @@ void InputRouterImpl::ProcessGestureAck(WebInputEvent::Type type, |
// If |ack_result| originated from the overscroll controller, only |
// feed |gesture_event_queue_| the ack if it was expecting one. |
if (current_ack_source_ == OVERSCROLL_CONTROLLER && |
- !gesture_event_queue_->HasQueuedGestureEvents()) { |
+ !gesture_event_queue_.ExpectingGestureAck()) { |
return; |
} |
// |gesture_event_queue_| will forward to OnGestureEventAck when appropriate. |
- gesture_event_queue_->ProcessGestureAck(ack_result, type, latency); |
+ gesture_event_queue_.ProcessGestureAck(ack_result, type, latency); |
} |
void InputRouterImpl::ProcessTouchAck( |
InputEventAckState ack_result, |
const ui::LatencyInfo& latency) { |
// |touch_event_queue_| will forward to OnTouchEventAck when appropriate. |
- touch_event_queue_->ProcessTouchAck(ack_result, latency); |
+ touch_event_queue_.ProcessTouchAck(ack_result, latency); |
} |
void InputRouterImpl::ProcessAckForOverscroll(const WebInputEvent& event, |
@@ -800,7 +807,7 @@ void InputRouterImpl::SimulateTouchGestureWithMouse( |
void InputRouterImpl::UpdateTouchAckTimeoutEnabled() { |
if (!touch_ack_timeout_supported_) { |
- touch_event_queue_->SetAckTimeoutEnabled(false, base::TimeDelta()); |
+ touch_event_queue_.SetAckTimeoutEnabled(false, base::TimeDelta()); |
return; |
} |
@@ -818,8 +825,29 @@ void InputRouterImpl::UpdateTouchAckTimeoutEnabled() { |
const bool touch_ack_timeout_enabled = !fixed_page_scale && |
!mobile_viewport && |
!touch_action_none; |
- touch_event_queue_->SetAckTimeoutEnabled(touch_ack_timeout_enabled, |
- touch_ack_timeout_delay_); |
+ touch_event_queue_.SetAckTimeoutEnabled(touch_ack_timeout_enabled, |
+ touch_ack_timeout_delay_); |
+} |
+ |
+void InputRouterImpl::SignalFlushedIfNecessary() { |
+ if (!flush_requested_) |
+ return; |
+ |
+ if (HasPendingEvents()) |
+ return; |
+ |
+ flush_requested_ = false; |
+ client_->DidFlush(); |
+} |
+ |
+bool InputRouterImpl::HasPendingEvents() const { |
+ return !touch_event_queue_.empty() || |
+ !gesture_event_queue_.empty() || |
+ !key_queue_.empty() || |
+ mouse_move_pending_ || |
+ mouse_wheel_pending_ || |
+ select_range_pending_ || |
+ move_caret_pending_; |
} |
bool InputRouterImpl::IsInOverscrollGesture() const { |