| Index: content/renderer/gpu/input_event_filter.cc
|
| diff --git a/content/renderer/gpu/input_event_filter.cc b/content/renderer/gpu/input_event_filter.cc
|
| index df1abf36f7a421bb7a01647aa002e2c5c9884eb2..89cccdd2ab4ebe182a34d606faaca84b8713af07 100644
|
| --- a/content/renderer/gpu/input_event_filter.cc
|
| +++ b/content/renderer/gpu/input_event_filter.cc
|
| @@ -11,6 +11,18 @@
|
|
|
| using WebKit::WebInputEvent;
|
|
|
| +namespace {
|
| +
|
| +bool IsImeEvent(const IPC::Message& message) {
|
| + return (message.type() == ViewMsg_ImeSetComposition::ID ||
|
| + message.type() == ViewMsg_ImeConfirmComposition::ID ||
|
| + message.type() == ViewMsg_SetCompositionFromExistingText::ID ||
|
| + message.type() == ViewMsg_SetEditableSelectionOffsets::ID ||
|
| + message.type() == ViewMsg_ExtendSelectionAndDelete::ID);
|
| +}
|
| +
|
| +}
|
| +
|
| namespace content {
|
|
|
| InputEventFilter::InputEventFilter(IPC::Listener* main_listener,
|
| @@ -40,6 +52,7 @@ void InputEventFilter::DidHandleInputEvent() {
|
|
|
| SendACK(messages_.front(), INPUT_EVENT_ACK_STATE_CONSUMED);
|
| messages_.pop();
|
| + ForwardPendingImeEvents();
|
| }
|
|
|
| void InputEventFilter::DidNotHandleInputEvent(bool send_to_widget) {
|
| @@ -58,6 +71,7 @@ void InputEventFilter::DidNotHandleInputEvent(bool send_to_widget) {
|
| SendACK(messages_.front(), INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
|
| }
|
| messages_.pop();
|
| + ForwardPendingImeEvents();
|
| }
|
|
|
| void InputEventFilter::OnFilterAdded(IPC::Channel* channel) {
|
| @@ -74,6 +88,9 @@ void InputEventFilter::OnChannelClosing() {
|
| }
|
|
|
| bool InputEventFilter::OnMessageReceived(const IPC::Message& message) {
|
| + if (IsImeEvent(message))
|
| + return QueueImeEvent(message);
|
| +
|
| if (message.type() != ViewMsg_HandleInputEvent::ID)
|
| return false;
|
|
|
| @@ -152,4 +169,21 @@ void InputEventFilter::SendACKOnIOThread(
|
| new ViewHostMsg_HandleInputEvent_ACK(routing_id, event_type, ack_result));
|
| }
|
|
|
| +bool InputEventFilter::QueueImeEvent(const IPC::Message& message) {
|
| + if (messages_.empty())
|
| + return false;
|
| + messages_.push(message);
|
| + return true;
|
| +}
|
| +
|
| +void InputEventFilter::ForwardPendingImeEvents() {
|
| + while (!messages_.empty() && IsImeEvent(messages_.front())) {
|
| + main_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&InputEventFilter::ForwardToMainListener,
|
| + this, messages_.front()));
|
| + messages_.pop();
|
| + }
|
| +}
|
| +
|
| } // namespace content
|
|
|