diff options
author | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-31 09:19:17 +0000 |
---|---|---|
committer | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-31 09:19:17 +0000 |
commit | cd2af395e8429a30bcee9e7ad7ec9f4b680c924d (patch) | |
tree | acdc2fa6ef032a0c88b2a2f7729e15ae07a73254 /ppapi/proxy | |
parent | befff0575c078d9353e48a125575b429e4b8b5f1 (diff) | |
download | chromium_src-cd2af395e8429a30bcee9e7ad7ec9f4b680c924d.zip chromium_src-cd2af395e8429a30bcee9e7ad7ec9f4b680c924d.tar.gz chromium_src-cd2af395e8429a30bcee9e7ad7ec9f4b680c924d.tar.bz2 |
Introduce PPB_Flash_MessageLoop interface for Pepper Flash.
Comparing with PPB_Flash.RunMessageLoop/QuitMessageLoop, this new interface avoids leaking nested message loops. If Quit() is not called to balance the call to Run(), the outermost message loop will be quitted when the resource is destroyed.
BUG=109340
TEST=test_flash_message_loop.{h,cc}
Review URL: http://codereview.chromium.org/9188045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119873 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy')
-rw-r--r-- | ppapi/proxy/interface_list.cc | 7 | ||||
-rw-r--r-- | ppapi/proxy/ppapi_messages.h | 10 | ||||
-rw-r--r-- | ppapi/proxy/ppb_flash_message_loop_proxy.cc | 157 | ||||
-rw-r--r-- | ppapi/proxy/ppb_flash_message_loop_proxy.h | 52 | ||||
-rw-r--r-- | ppapi/proxy/resource_creation_proxy.cc | 6 | ||||
-rw-r--r-- | ppapi/proxy/resource_creation_proxy.h | 1 |
6 files changed, 233 insertions, 0 deletions
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc index 5833a8d..f33d17e 100644 --- a/ppapi/proxy/interface_list.cc +++ b/ppapi/proxy/interface_list.cc @@ -51,6 +51,7 @@ #include "ppapi/c/private/ppb_flash_fullscreen.h" #include "ppapi/c/private/ppb_flash.h" #include "ppapi/c/private/ppb_flash_menu.h" +#include "ppapi/c/private/ppb_flash_message_loop.h" #include "ppapi/c/private/ppb_flash_net_connector.h" #include "ppapi/c/private/ppb_flash_tcp_socket.h" #include "ppapi/c/private/ppb_net_address_private.h" @@ -74,6 +75,7 @@ #include "ppapi/proxy/ppb_flash_clipboard_proxy.h" #include "ppapi/proxy/ppb_flash_file_proxy.h" #include "ppapi/proxy/ppb_flash_menu_proxy.h" +#include "ppapi/proxy/ppb_flash_message_loop_proxy.h" #include "ppapi/proxy/ppb_flash_net_connector_proxy.h" #include "ppapi/proxy/ppb_flash_proxy.h" #include "ppapi/proxy/ppb_font_proxy.h" @@ -287,6 +289,11 @@ void InterfaceList::AddFlashInterfaces() { AddPPB(PPB_FLASH_MENU_INTERFACE_0_2, API_ID_PPB_FLASH_MENU, thunk::GetPPB_Flash_Menu_0_2_Thunk()); + AddProxy(API_ID_PPB_FLASH_MESSAGELOOP, + &ProxyFactory<PPB_Flash_MessageLoop_Proxy>); + AddPPB(PPB_FLASH_MESSAGELOOP_INTERFACE_0_1, API_ID_PPB_FLASH_MESSAGELOOP, + thunk::GetPPB_Flash_MessageLoop_0_1_Thunk()); + // Only add the interface; PPB_TCPSocket_Private provides the API ID's proxy. AddPPB(PPB_FLASH_TCPSOCKET_INTERFACE_0_2, API_ID_PPB_TCPSOCKET_PRIVATE, thunk::GetPPB_TCPSocket_Private_0_3_Thunk()); diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h index 6947f49..57901c5 100644 --- a/ppapi/proxy/ppapi_messages.h +++ b/ppapi/proxy/ppapi_messages.h @@ -766,6 +766,16 @@ IPC_MESSAGE_ROUTED3(PpapiMsg_PPBFlashMenu_ShowACK, int32_t /* selected_id */, int32_t /* result */) +// PPB_Flash_MessageLoop. +IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBFlashMessageLoop_Create, + PP_Instance /* instance */, + ppapi::HostResource /* result */) +IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBFlashMessageLoop_Run, + ppapi::HostResource /* flash_message_loop */, + int32_t /* result */) +IPC_SYNC_MESSAGE_ROUTED1_0(PpapiHostMsg_PPBFlashMessageLoop_Quit, + ppapi::HostResource /* flash_message_loop */) + // PPB_Flash_NetConnector. IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBFlashNetConnector_Create, PP_Instance /* instance_id */, diff --git a/ppapi/proxy/ppb_flash_message_loop_proxy.cc b/ppapi/proxy/ppb_flash_message_loop_proxy.cc new file mode 100644 index 0000000..a06e8c8 --- /dev/null +++ b/ppapi/proxy/ppb_flash_message_loop_proxy.cc @@ -0,0 +1,157 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ppapi/proxy/ppb_flash_message_loop_proxy.h" + +#include "base/bind.h" +#include "ppapi/c/pp_errors.h" +#include "ppapi/c/private/ppb_flash_message_loop.h" +#include "ppapi/proxy/enter_proxy.h" +#include "ppapi/proxy/plugin_dispatcher.h" +#include "ppapi/proxy/ppapi_messages.h" +#include "ppapi/shared_impl/resource.h" +#include "ppapi/thunk/enter.h" +#include "ppapi/thunk/ppb_flash_message_loop_api.h" +#include "ppapi/thunk/resource_creation_api.h" + +using ppapi::thunk::PPB_Flash_MessageLoop_API; + +namespace ppapi { +namespace proxy { +namespace { + +class FlashMessageLoop : public PPB_Flash_MessageLoop_API, public Resource { + public: + explicit FlashMessageLoop(const HostResource& resource); + virtual ~FlashMessageLoop(); + + // Resource overrides. + virtual PPB_Flash_MessageLoop_API* AsPPB_Flash_MessageLoop_API() OVERRIDE; + + // PPB_Flash_MesssageLoop_API implementation. + virtual int32_t Run() OVERRIDE; + virtual void Quit() OVERRIDE; + virtual void RunFromHostProxy( + const RunFromHostProxyCallback& callback) OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(FlashMessageLoop); +}; + +FlashMessageLoop::FlashMessageLoop(const HostResource& resource) + : Resource(resource) { +} + +FlashMessageLoop::~FlashMessageLoop() { +} + +PPB_Flash_MessageLoop_API* FlashMessageLoop::AsPPB_Flash_MessageLoop_API() { + return this; +} + +int32_t FlashMessageLoop::Run() { + int32_t result = PP_ERROR_FAILED; + IPC::SyncMessage* msg = new PpapiHostMsg_PPBFlashMessageLoop_Run( + API_ID_PPB_FLASH_MESSAGELOOP, host_resource(), &result); + msg->EnableMessagePumping(); + PluginDispatcher::GetForResource(this)->Send(msg); + return result; +} + +void FlashMessageLoop::Quit() { + PluginDispatcher::GetForResource(this)->Send( + new PpapiHostMsg_PPBFlashMessageLoop_Quit( + API_ID_PPB_FLASH_MESSAGELOOP, host_resource())); +} + +void FlashMessageLoop::RunFromHostProxy( + const RunFromHostProxyCallback& callback) { + // This should never be called on the plugin side. + NOTREACHED(); +} + +} // namespace + +PPB_Flash_MessageLoop_Proxy::PPB_Flash_MessageLoop_Proxy(Dispatcher* dispatcher) + : InterfaceProxy(dispatcher) { +} + +PPB_Flash_MessageLoop_Proxy::~PPB_Flash_MessageLoop_Proxy() { +} + +// static +PP_Resource PPB_Flash_MessageLoop_Proxy::CreateProxyResource( + PP_Instance instance) { + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); + if (!dispatcher) + return 0; + + HostResource result; + dispatcher->Send(new PpapiHostMsg_PPBFlashMessageLoop_Create( + API_ID_PPB_FLASH_MESSAGELOOP, instance, &result)); + if (result.is_null()) + return 0; + return (new FlashMessageLoop(result))->GetReference(); +} + +bool PPB_Flash_MessageLoop_Proxy::OnMessageReceived(const IPC::Message& msg) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(PPB_Flash_MessageLoop_Proxy, msg) + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashMessageLoop_Create, + OnMsgCreate) + // We cannot use IPC_MESSAGE_HANDLER here. Because it tries to send the sync + // message reply after the handler returns. However, in this case, the + // PPB_Flash_MessageLoop_Proxy object may be destroyed before the handler + // returns. + IPC_MESSAGE_HANDLER_DELAY_REPLY(PpapiHostMsg_PPBFlashMessageLoop_Run, + OnMsgRun) + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashMessageLoop_Quit, + OnMsgQuit) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void PPB_Flash_MessageLoop_Proxy::OnMsgCreate(PP_Instance instance, + HostResource* result) { + thunk::EnterResourceCreation enter(instance); + if (enter.succeeded()) { + result->SetHostResource( + instance, enter.functions()->CreateFlashMessageLoop(instance)); + } +} + +void PPB_Flash_MessageLoop_Proxy::OnMsgRun( + const HostResource& flash_message_loop, + IPC::Message* reply) { + PPB_Flash_MessageLoop_API::RunFromHostProxyCallback callback = + base::Bind(&PPB_Flash_MessageLoop_Proxy::WillQuitSoon, AsWeakPtr(), + base::Passed(scoped_ptr<IPC::Message>(reply))); + + EnterHostFromHostResource<PPB_Flash_MessageLoop_API> + enter(flash_message_loop); + if (enter.succeeded()) + enter.object()->RunFromHostProxy(callback); + else + callback.Run(PP_ERROR_BADRESOURCE); +} + +void PPB_Flash_MessageLoop_Proxy::OnMsgQuit( + const ppapi::HostResource& flash_message_loop) { + EnterHostFromHostResource<PPB_Flash_MessageLoop_API> + enter(flash_message_loop); + if (enter.succeeded()) + enter.object()->Quit(); +} + +void PPB_Flash_MessageLoop_Proxy::WillQuitSoon( + scoped_ptr<IPC::Message> reply_message, + int32_t result) { + PpapiHostMsg_PPBFlashMessageLoop_Run::WriteReplyParams(reply_message.get(), + result); + Send(reply_message.release()); +} + +} // namespace proxy +} // namespace ppapi diff --git a/ppapi/proxy/ppb_flash_message_loop_proxy.h b/ppapi/proxy/ppb_flash_message_loop_proxy.h new file mode 100644 index 0000000..aaf33f9 --- /dev/null +++ b/ppapi/proxy/ppb_flash_message_loop_proxy.h @@ -0,0 +1,52 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PPAPI_PPB_FLASH_MESSAGE_LOOP_PROXY_H_ +#define PPAPI_PPB_FLASH_MESSAGE_LOOP_PROXY_H_ + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "ppapi/c/pp_instance.h" +#include "ppapi/c/pp_resource.h" +#include "ppapi/proxy/interface_proxy.h" + +namespace IPC { +class Message; +} + +namespace ppapi { + +class HostResource; + +namespace proxy { + +class PPB_Flash_MessageLoop_Proxy + : public InterfaceProxy, + public base::SupportsWeakPtr<PPB_Flash_MessageLoop_Proxy> { + public: + explicit PPB_Flash_MessageLoop_Proxy(Dispatcher* dispatcher); + virtual ~PPB_Flash_MessageLoop_Proxy(); + + static PP_Resource CreateProxyResource(PP_Instance instance); + + // InterfaceProxy implementation. + virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; + + private: + void OnMsgCreate(PP_Instance instance, ppapi::HostResource* resource); + void OnMsgRun(const ppapi::HostResource& flash_message_loop, + IPC::Message* reply); + void OnMsgQuit(const ppapi::HostResource& flash_message_loop); + + void WillQuitSoon(scoped_ptr<IPC::Message> reply_message, int32_t result); + + DISALLOW_COPY_AND_ASSIGN(PPB_Flash_MessageLoop_Proxy); +}; + +} // namespace proxy +} // namespace ppapi + +#endif // PPAPI_PPB_FLASH_MESSAGE_LOOP_PROXY_H_ diff --git a/ppapi/proxy/resource_creation_proxy.cc b/ppapi/proxy/resource_creation_proxy.cc index 6c99ac1..c77e3c6 100644 --- a/ppapi/proxy/resource_creation_proxy.cc +++ b/ppapi/proxy/resource_creation_proxy.cc @@ -19,6 +19,7 @@ #include "ppapi/proxy/ppb_file_ref_proxy.h" #include "ppapi/proxy/ppb_file_system_proxy.h" #include "ppapi/proxy/ppb_flash_menu_proxy.h" +#include "ppapi/proxy/ppb_flash_message_loop_proxy.h" #include "ppapi/proxy/ppb_flash_net_connector_proxy.h" #include "ppapi/proxy/ppb_font_proxy.h" #include "ppapi/proxy/ppb_graphics_2d_proxy.h" @@ -144,6 +145,11 @@ PP_Resource ResourceCreationProxy::CreateFlashMenu( return PPB_Flash_Menu_Proxy::CreateProxyResource(instance, menu_data); } +PP_Resource ResourceCreationProxy::CreateFlashMessageLoop( + PP_Instance instance) { + return PPB_Flash_MessageLoop_Proxy::CreateProxyResource(instance); +} + PP_Resource ResourceCreationProxy::CreateFlashNetConnector( PP_Instance instance) { return PPB_Flash_NetConnector_Proxy::CreateProxyResource(instance); diff --git a/ppapi/proxy/resource_creation_proxy.h b/ppapi/proxy/resource_creation_proxy.h index 6fed5e9..d28f153 100644 --- a/ppapi/proxy/resource_creation_proxy.h +++ b/ppapi/proxy/resource_creation_proxy.h @@ -67,6 +67,7 @@ class ResourceCreationProxy : public InterfaceProxy, PP_FileSystemType type) OVERRIDE; virtual PP_Resource CreateFlashMenu(PP_Instance instance, const PP_Flash_Menu* menu_data) OVERRIDE; + virtual PP_Resource CreateFlashMessageLoop(PP_Instance instance) OVERRIDE; virtual PP_Resource CreateFlashNetConnector(PP_Instance instance) OVERRIDE; virtual PP_Resource CreateFontObject( PP_Instance instance, |