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 364f7ca5a9d884f7cb1d0809517fe7fdd5834fac..4848f6dc6f41075434b458e3baa78175298962aa 100644 |
--- a/content/browser/renderer_host/input/input_router_impl.cc |
+++ b/content/browser/renderer_host/input/input_router_impl.cc |
@@ -68,7 +68,7 @@ InputRouterImpl::InputRouterImpl(IPC::Sender* sender, |
client_(client), |
ack_handler_(ack_handler), |
routing_id_(routing_id), |
- select_range_pending_(false), |
+ select_message_pending_(false), |
move_caret_pending_(false), |
mouse_move_pending_(false), |
mouse_wheel_pending_(false), |
@@ -83,7 +83,9 @@ InputRouterImpl::InputRouterImpl(IPC::Sender* sender, |
UpdateTouchAckTimeoutEnabled(); |
} |
-InputRouterImpl::~InputRouterImpl() {} |
+InputRouterImpl::~InputRouterImpl() { |
+ STLDeleteElements(&pending_select_messages_); |
+} |
void InputRouterImpl::Flush() { |
flush_requested_ = true; |
@@ -95,7 +97,8 @@ bool InputRouterImpl::SendInput(scoped_ptr<IPC::Message> message) { |
switch (message->type()) { |
// Check for types that require an ACK. |
case InputMsg_SelectRange::ID: |
- return SendSelectRange(message.Pass()); |
+ case InputMsg_MoveRangeSelectionExtent::ID: |
+ return SendSelectMessage(message.Pass()); |
case InputMsg_MoveCaret::ID: |
return SendMoveCaret(message.Pass()); |
case InputMsg_HandleInputEvent::ID: |
@@ -267,8 +270,10 @@ bool InputRouterImpl::OnMessageReceived(const IPC::Message& message) { |
IPC_BEGIN_MESSAGE_MAP(InputRouterImpl, message) |
IPC_MESSAGE_HANDLER(InputHostMsg_HandleInputEvent_ACK, OnInputEventAck) |
IPC_MESSAGE_HANDLER(InputHostMsg_DidOverscroll, OnDidOverscroll) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_SelectRange_ACK, OnSelectRangeAck) |
+ IPC_MESSAGE_HANDLER(InputHostMsg_MoveCaret_ACK, OnMsgMoveCaretAck) |
+ IPC_MESSAGE_HANDLER(InputHostMsg_SelectRange_ACK, OnSelectMessageAck) |
+ IPC_MESSAGE_HANDLER(InputHostMsg_MoveRangeSelectionExtent_ACK, |
+ OnSelectMessageAck) |
IPC_MESSAGE_HANDLER(ViewHostMsg_HasTouchEventHandlers, |
OnHasTouchEventHandlers) |
IPC_MESSAGE_HANDLER(InputHostMsg_SetTouchAction, |
@@ -298,14 +303,25 @@ void InputRouterImpl::OnGestureEventAck( |
ack_handler_->OnGestureEventAck(event, ack_result); |
} |
-bool InputRouterImpl::SendSelectRange(scoped_ptr<IPC::Message> message) { |
- DCHECK(message->type() == InputMsg_SelectRange::ID); |
- if (select_range_pending_) { |
- next_selection_range_ = message.Pass(); |
+bool InputRouterImpl::SendSelectMessage( |
+ scoped_ptr<IPC::Message> message) { |
+ DCHECK(message->type() == InputMsg_SelectRange::ID || |
+ message->type() == InputMsg_MoveRangeSelectionExtent::ID); |
+ |
+ // TODO(jdduke): Factor out common logic between selection and caret-related |
+ // IPC messages. |
+ if (select_message_pending_) { |
+ if (!pending_select_messages_.empty() && |
+ pending_select_messages_.back()->type() == message->type()) { |
+ delete pending_select_messages_.back(); |
+ pending_select_messages_.pop_back(); |
+ } |
+ |
+ pending_select_messages_.push_back(message.release()); |
return true; |
} |
- select_range_pending_ = true; |
+ select_message_pending_ = true; |
return Send(message.release()); |
} |
@@ -487,10 +503,15 @@ void InputRouterImpl::OnMsgMoveCaretAck() { |
SendMoveCaret(next_move_caret_.Pass()); |
} |
-void InputRouterImpl::OnSelectRangeAck() { |
- select_range_pending_ = false; |
- if (next_selection_range_) |
- SendSelectRange(next_selection_range_.Pass()); |
+void InputRouterImpl::OnSelectMessageAck() { |
+ select_message_pending_ = false; |
+ if (!pending_select_messages_.empty()) { |
+ scoped_ptr<IPC::Message> next_message = |
+ make_scoped_ptr(pending_select_messages_.front()); |
+ pending_select_messages_.pop_front(); |
+ |
+ SendSelectMessage(next_message.Pass()); |
+ } |
} |
void InputRouterImpl::OnHasTouchEventHandlers(bool has_handlers) { |
@@ -679,7 +700,7 @@ bool InputRouterImpl::HasPendingEvents() const { |
!key_queue_.empty() || |
mouse_move_pending_ || |
mouse_wheel_pending_ || |
- select_range_pending_ || |
+ select_message_pending_ || |
move_caret_pending_; |
} |