| Index: ppapi/proxy/ppb_text_input_proxy.cc
|
| ===================================================================
|
| --- ppapi/proxy/ppb_text_input_proxy.cc (revision 132273)
|
| +++ ppapi/proxy/ppb_text_input_proxy.cc (working copy)
|
| @@ -6,12 +6,32 @@
|
|
|
| #include "ppapi/proxy/plugin_dispatcher.h"
|
| #include "ppapi/proxy/ppapi_messages.h"
|
| +#include "ppapi/shared_impl/ppb_instance_shared.h"
|
| #include "ppapi/thunk/enter.h"
|
| #include "ppapi/thunk/thunk.h"
|
|
|
| namespace ppapi {
|
| namespace proxy {
|
|
|
| +namespace {
|
| +
|
| +void RequestSurroundingText(PP_Instance instance) {
|
| + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
|
| + if (!dispatcher)
|
| + return; // Instance has gone away while message was pending.
|
| +
|
| + // Just fake out a RequestSurroundingText message to the proxy for the PPP
|
| + // interface.
|
| + InterfaceProxy* proxy = dispatcher->GetInterfaceProxy(API_ID_PPB_TEXT_INPUT);
|
| + if (!proxy)
|
| + return;
|
| + proxy->OnMessageReceived(PpapiMsg_PPPTextInput_RequestSurroundingText(
|
| + API_ID_PPP_TEXT_INPUT, instance,
|
| + PPB_Instance_Shared::kExtraCharsForTextInput));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| PPB_TextInput_Proxy::PPB_TextInput_Proxy(Dispatcher* dispatcher)
|
| : InterfaceProxy(dispatcher) {
|
| }
|
| @@ -43,8 +63,19 @@
|
| }
|
|
|
| void PPB_TextInput_Proxy::SelectionChanged(PP_Instance instance) {
|
| - dispatcher()->Send(new PpapiHostMsg_PPBTextInput_SelectionChanged(
|
| - API_ID_PPB_TEXT_INPUT, instance));
|
| + // The "right" way to do this is to send the message to the host. However,
|
| + // all it will do it call RequestSurroundingText with a hardcoded number of
|
| + // characters in response, which is an entire IPC round-trip.
|
| + //
|
| + // We can avoid this round-trip by just implementing the
|
| + // RequestSurroundingText logic in the plugin process. If the logic in the
|
| + // host becomes more complex (like a more adaptive number of characters),
|
| + // we'll need to reevanuate whether we want to do the round trip instead.
|
| + //
|
| + // Be careful to post a task to avoid reentering the plugin.
|
| + MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&RequestSurroundingText, instance));
|
| }
|
|
|
| void PPB_TextInput_Proxy::UpdateSurroundingText(PP_Instance instance,
|
| @@ -64,8 +95,6 @@
|
| OnMsgUpdateCaretPosition)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTextInput_CancelCompositionText,
|
| OnMsgCancelCompositionText)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTextInput_SelectionChanged,
|
| - OnMsgSelectionChanged)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTextInput_UpdateSurroundingText,
|
| OnMsgUpdateSurroundingText)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| @@ -97,13 +126,6 @@
|
| enter.functions()->CancelCompositionText(instance);
|
| }
|
|
|
| -void PPB_TextInput_Proxy::OnMsgSelectionChanged(PP_Instance instance) {
|
| - ppapi::thunk::EnterFunctionNoLock<PPB_TextInput_FunctionAPI> enter(instance,
|
| - true);
|
| - if (enter.succeeded())
|
| - enter.functions()->SelectionChanged(instance);
|
| -}
|
| -
|
| void PPB_TextInput_Proxy::OnMsgUpdateSurroundingText(PP_Instance instance,
|
| const std::string& text,
|
| uint32_t caret,
|
|
|