| Index: ppapi/proxy/ppb_instance_proxy.cc
|
| diff --git a/ppapi/proxy/ppb_instance_proxy.cc b/ppapi/proxy/ppb_instance_proxy.cc
|
| index e360ae71adca53eb48d6c24b78c746b466ab2450..021dc7220596b0be0e0bc13c226c4af3163a5737 100644
|
| --- a/ppapi/proxy/ppb_instance_proxy.cc
|
| +++ b/ppapi/proxy/ppb_instance_proxy.cc
|
| @@ -30,7 +30,7 @@
|
| #undef PostMessage
|
| #endif
|
|
|
| -using ppapi::thunk::EnterFunctionNoLock;
|
| +using ppapi::thunk::EnterInstanceNoLock;
|
| using ppapi::thunk::EnterResourceNoLock;
|
| using ppapi::thunk::PPB_Instance_FunctionAPI;
|
|
|
| @@ -39,12 +39,25 @@ namespace proxy {
|
|
|
| namespace {
|
|
|
| -typedef EnterFunctionNoLock<PPB_Instance_FunctionAPI> EnterInstanceNoLock;
|
| -
|
| InterfaceProxy* CreateInstanceProxy(Dispatcher* dispatcher) {
|
| return new PPB_Instance_Proxy(dispatcher);
|
| }
|
|
|
| +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_Instance_Proxy::PPB_Instance_Proxy(Dispatcher* dispatcher)
|
| @@ -113,6 +126,14 @@ bool PPB_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| OnHostMsgUnlockMouse)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_SetCursor,
|
| OnHostMsgSetCursor)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_SetTextInputType,
|
| + OnHostMsgSetTextInputType)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_UpdateCaretPosition,
|
| + OnHostMsgUpdateCaretPosition)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_CancelCompositionText,
|
| + OnHostMsgCancelCompositionText)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_UpdateSurroundingText,
|
| + OnHostMsgUpdateSurroundingText)
|
| #if !defined(OS_NACL)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_ResolveRelativeToDocument,
|
| OnHostMsgResolveRelativeToDocument)
|
| @@ -437,10 +458,52 @@ void PPB_Instance_Proxy::UnlockMouse(PP_Instance instance) {
|
| API_ID_PPB_INSTANCE, instance));
|
| }
|
|
|
| +void PPB_Instance_Proxy::SetTextInputType(PP_Instance instance,
|
| + PP_TextInput_Type type) {
|
| + dispatcher()->Send(new PpapiHostMsg_PPBInstance_SetTextInputType(
|
| + API_ID_PPB_INSTANCE, instance, type));
|
| +}
|
| +
|
| +void PPB_Instance_Proxy::UpdateCaretPosition(PP_Instance instance,
|
| + const PP_Rect& caret,
|
| + const PP_Rect& bounding_box) {
|
| + dispatcher()->Send(new PpapiHostMsg_PPBInstance_UpdateCaretPosition(
|
| + API_ID_PPB_INSTANCE, instance, caret, bounding_box));
|
| +}
|
| +
|
| +void PPB_Instance_Proxy::CancelCompositionText(PP_Instance instance) {
|
| + dispatcher()->Send(new PpapiHostMsg_PPBInstance_CancelCompositionText(
|
| + API_ID_PPB_INSTANCE, instance));
|
| +}
|
| +
|
| +void PPB_Instance_Proxy::SelectionChanged(PP_Instance 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_Instance_Proxy::UpdateSurroundingText(PP_Instance instance,
|
| + const char* text,
|
| + uint32_t caret,
|
| + uint32_t anchor) {
|
| + dispatcher()->Send(new PpapiHostMsg_PPBInstance_UpdateSurroundingText(
|
| + API_ID_PPB_INSTANCE, instance, text, caret, anchor));
|
| +}
|
| +
|
| void PPB_Instance_Proxy::OnHostMsgGetWindowObject(
|
| PP_Instance instance,
|
| SerializedVarReturnValue result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| result.Return(dispatcher(), enter.functions()->GetWindowObject(instance));
|
| }
|
| @@ -448,7 +511,7 @@ void PPB_Instance_Proxy::OnHostMsgGetWindowObject(
|
| void PPB_Instance_Proxy::OnHostMsgGetOwnerElementObject(
|
| PP_Instance instance,
|
| SerializedVarReturnValue result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| result.Return(dispatcher(),
|
| enter.functions()->GetOwnerElementObject(instance));
|
| @@ -458,7 +521,7 @@ void PPB_Instance_Proxy::OnHostMsgGetOwnerElementObject(
|
| void PPB_Instance_Proxy::OnHostMsgBindGraphics(PP_Instance instance,
|
| const HostResource& device,
|
| PP_Bool* result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| *result = enter.functions()->BindGraphics(instance,
|
| device.host_resource());
|
| @@ -467,21 +530,21 @@ void PPB_Instance_Proxy::OnHostMsgBindGraphics(PP_Instance instance,
|
|
|
| void PPB_Instance_Proxy::OnHostMsgGetAudioHardwareOutputSampleRate(
|
| PP_Instance instance, uint32_t* result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| *result = enter.functions()->GetAudioHardwareOutputSampleRate(instance);
|
| }
|
|
|
| void PPB_Instance_Proxy::OnHostMsgGetAudioHardwareOutputBufferSize(
|
| PP_Instance instance, uint32_t* result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| *result = enter.functions()->GetAudioHardwareOutputBufferSize(instance);
|
| }
|
|
|
| void PPB_Instance_Proxy::OnHostMsgIsFullFrame(PP_Instance instance,
|
| PP_Bool* result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| *result = enter.functions()->IsFullFrame(instance);
|
| }
|
| @@ -491,7 +554,7 @@ void PPB_Instance_Proxy::OnHostMsgExecuteScript(
|
| SerializedVarReceiveInput script,
|
| SerializedVarOutParam out_exception,
|
| SerializedVarReturnValue result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.failed())
|
| return;
|
|
|
| @@ -509,7 +572,7 @@ void PPB_Instance_Proxy::OnHostMsgExecuteScript(
|
| void PPB_Instance_Proxy::OnHostMsgGetDefaultCharSet(
|
| PP_Instance instance,
|
| SerializedVarReturnValue result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| result.Return(dispatcher(), enter.functions()->GetDefaultCharSet(instance));
|
| }
|
| @@ -517,7 +580,7 @@ void PPB_Instance_Proxy::OnHostMsgGetDefaultCharSet(
|
| void PPB_Instance_Proxy::OnHostMsgSetFullscreen(PP_Instance instance,
|
| PP_Bool fullscreen,
|
| PP_Bool* result) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| *result = enter.functions()->SetFullscreen(instance, fullscreen);
|
| }
|
| @@ -526,7 +589,7 @@ void PPB_Instance_Proxy::OnHostMsgSetFullscreen(PP_Instance instance,
|
| void PPB_Instance_Proxy::OnHostMsgGetScreenSize(PP_Instance instance,
|
| PP_Bool* result,
|
| PP_Size* size) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| *result = enter.functions()->GetScreenSize(instance, size);
|
| }
|
| @@ -534,7 +597,7 @@ void PPB_Instance_Proxy::OnHostMsgGetScreenSize(PP_Instance instance,
|
| void PPB_Instance_Proxy::OnHostMsgRequestInputEvents(PP_Instance instance,
|
| bool is_filtering,
|
| uint32_t event_classes) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| if (is_filtering)
|
| enter.functions()->RequestFilteringInputEvents(instance, event_classes);
|
| @@ -545,14 +608,14 @@ void PPB_Instance_Proxy::OnHostMsgRequestInputEvents(PP_Instance instance,
|
|
|
| void PPB_Instance_Proxy::OnHostMsgClearInputEvents(PP_Instance instance,
|
| uint32_t event_classes) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| enter.functions()->ClearInputEventRequest(instance, event_classes);
|
| }
|
|
|
| void PPB_Instance_Proxy::OnMsgHandleInputEventAck(PP_Instance instance,
|
| PP_TimeTicks timestamp) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| enter.functions()->ClosePendingUserGesture(instance, timestamp);
|
| }
|
| @@ -560,7 +623,7 @@ void PPB_Instance_Proxy::OnMsgHandleInputEventAck(PP_Instance instance,
|
| void PPB_Instance_Proxy::OnHostMsgPostMessage(
|
| PP_Instance instance,
|
| SerializedVarReceiveInput message) {
|
| - EnterInstanceNoLock enter(instance, false);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| enter.functions()->PostMessage(instance, message.Get(dispatcher()));
|
| }
|
| @@ -576,7 +639,7 @@ void PPB_Instance_Proxy::OnHostMsgLockMouse(PP_Instance instance) {
|
| }
|
|
|
| void PPB_Instance_Proxy::OnHostMsgUnlockMouse(PP_Instance instance) {
|
| - EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(instance, true);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded())
|
| enter.functions()->UnlockMouse(instance);
|
| }
|
| @@ -586,7 +649,7 @@ void PPB_Instance_Proxy::OnHostMsgResolveRelativeToDocument(
|
| PP_Instance instance,
|
| SerializedVarReceiveInput relative,
|
| SerializedVarReturnValue result) {
|
| - EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(instance, true);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| result.Return(dispatcher(),
|
| enter.functions()->ResolveRelativeToDocument(
|
| @@ -598,7 +661,7 @@ void PPB_Instance_Proxy::OnHostMsgDocumentCanRequest(
|
| PP_Instance instance,
|
| SerializedVarReceiveInput url,
|
| PP_Bool* result) {
|
| - EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(instance, true);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| *result = enter.functions()->DocumentCanRequest(instance,
|
| url.Get(dispatcher()));
|
| @@ -608,14 +671,14 @@ void PPB_Instance_Proxy::OnHostMsgDocumentCanRequest(
|
| void PPB_Instance_Proxy::OnHostMsgDocumentCanAccessDocument(PP_Instance active,
|
| PP_Instance target,
|
| PP_Bool* result) {
|
| - EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(active, true);
|
| + EnterInstanceNoLock enter(active);
|
| if (enter.succeeded())
|
| *result = enter.functions()->DocumentCanAccessDocument(active, target);
|
| }
|
|
|
| void PPB_Instance_Proxy::OnHostMsgGetDocumentURL(PP_Instance instance,
|
| SerializedVarReturnValue result) {
|
| - EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(instance, true);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| result.Return(dispatcher(),
|
| enter.functions()->GetDocumentURL(instance, NULL));
|
| @@ -625,7 +688,7 @@ void PPB_Instance_Proxy::OnHostMsgGetDocumentURL(PP_Instance instance,
|
| void PPB_Instance_Proxy::OnHostMsgGetPluginInstanceURL(
|
| PP_Instance instance,
|
| SerializedVarReturnValue result) {
|
| - EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(instance, true);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| result.Return(dispatcher(),
|
| enter.functions()->GetPluginInstanceURL(instance, NULL));
|
| @@ -638,7 +701,7 @@ void PPB_Instance_Proxy::OnHostMsgSetCursor(
|
| int32_t type,
|
| const ppapi::HostResource& custom_image,
|
| const PP_Point& hot_spot) {
|
| - EnterInstanceNoLock enter(instance, true);
|
| + EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| enter.functions()->SetCursor(
|
| instance, static_cast<PP_MouseCursor_Type>(type),
|
| @@ -646,6 +709,40 @@ void PPB_Instance_Proxy::OnHostMsgSetCursor(
|
| }
|
| }
|
|
|
| +void PPB_Instance_Proxy::OnHostMsgSetTextInputType(PP_Instance instance,
|
| + PP_TextInput_Type type) {
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.succeeded())
|
| + enter.functions()->SetTextInputType(instance, type);
|
| +}
|
| +
|
| +void PPB_Instance_Proxy::OnHostMsgUpdateCaretPosition(
|
| + PP_Instance instance,
|
| + const PP_Rect& caret,
|
| + const PP_Rect& bounding_box) {
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.succeeded())
|
| + enter.functions()->UpdateCaretPosition(instance, caret, bounding_box);
|
| +}
|
| +
|
| +void PPB_Instance_Proxy::OnHostMsgCancelCompositionText(PP_Instance instance) {
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.succeeded())
|
| + enter.functions()->CancelCompositionText(instance);
|
| +}
|
| +
|
| +void PPB_Instance_Proxy::OnHostMsgUpdateSurroundingText(
|
| + PP_Instance instance,
|
| + const std::string& text,
|
| + uint32_t caret,
|
| + uint32_t anchor) {
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.succeeded()) {
|
| + enter.functions()->UpdateSurroundingText(instance, text.c_str(), caret,
|
| + anchor);
|
| + }
|
| +}
|
| +
|
| void PPB_Instance_Proxy::OnPluginMsgMouseLockComplete(PP_Instance instance,
|
| int32_t result) {
|
| // Save the mouse callback on the instance data.
|
|
|