summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy/ppp_instance_proxy.cc
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-03 17:43:36 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-03 17:43:36 +0000
commite8f07ac77c1b27633eb7c6c2793d5b465e023f9f (patch)
tree6b1aa7de84dcb5f18adac114bba01c4f77a71e6b /ppapi/proxy/ppp_instance_proxy.cc
parent08d9dfe8c279ec894cdacdf5f0a89bd8c85a92fc (diff)
downloadchromium_src-e8f07ac77c1b27633eb7c6c2793d5b465e023f9f.zip
chromium_src-e8f07ac77c1b27633eb7c6c2793d5b465e023f9f.tar.gz
chromium_src-e8f07ac77c1b27633eb7c6c2793d5b465e023f9f.tar.bz2
Change the DidChangeView update to take a new ViewChanged resource.
This will allow us to be more flexible about adding data to view changed updates in the future. For now, I've incorporated fullscreen and tab foreground state into the view state. BUG= TEST= Review URL: http://codereview.chromium.org/8951014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@116142 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy/ppp_instance_proxy.cc')
-rw-r--r--ppapi/proxy/ppp_instance_proxy.cc142
1 files changed, 86 insertions, 56 deletions
diff --git a/ppapi/proxy/ppp_instance_proxy.cc b/ppapi/proxy/ppp_instance_proxy.cc
index 28f7b78..8ad8ae4 100644
--- a/ppapi/proxy/ppp_instance_proxy.cc
+++ b/ppapi/proxy/ppp_instance_proxy.cc
@@ -8,6 +8,7 @@
#include "ppapi/c/pp_var.h"
#include "ppapi/c/ppb_core.h"
+#include "ppapi/c/ppb_fullscreen.h"
#include "ppapi/c/ppp_instance.h"
#include "ppapi/c/private/ppb_flash_fullscreen.h"
#include "ppapi/proxy/host_dispatcher.h"
@@ -16,12 +17,36 @@
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppb_url_loader_proxy.h"
#include "ppapi/shared_impl/ppapi_globals.h"
+#include "ppapi/shared_impl/ppb_view_shared.h"
+#include "ppapi/shared_impl/scoped_pp_resource.h"
+#include "ppapi/thunk/enter.h"
+#include "ppapi/thunk/ppb_view_api.h"
namespace ppapi {
namespace proxy {
namespace {
+void GetFullscreenStates(PP_Instance instance,
+ HostDispatcher* dispatcher,
+ PP_Bool* fullscreen,
+ PP_Bool* flash_fullscreen) {
+ const PPB_Fullscreen* fullscreen_interface =
+ static_cast<const PPB_Fullscreen*>(
+ dispatcher->local_get_interface()(PPB_FULLSCREEN_INTERFACE));
+ DCHECK(fullscreen_interface);
+ *fullscreen = fullscreen_interface->IsFullscreen(instance);
+}
+
+PP_Bool IsFlashFullscreen(PP_Instance instance,
+ HostDispatcher* dispatcher) {
+ const PPB_FlashFullscreen* flash_fullscreen_interface =
+ static_cast<const PPB_FlashFullscreen*>(
+ dispatcher->local_get_interface()(PPB_FLASHFULLSCREEN_INTERFACE));
+ DCHECK(flash_fullscreen_interface);
+ return flash_fullscreen_interface->IsFullscreen(instance);
+}
+
PP_Bool DidCreate(PP_Instance instance,
uint32_t argc,
const char* argn[],
@@ -45,26 +70,18 @@ void DidDestroy(PP_Instance instance) {
new PpapiMsg_PPPInstance_DidDestroy(API_ID_PPP_INSTANCE, instance));
}
-void DidChangeView(PP_Instance instance,
- const PP_Rect* position,
- const PP_Rect* clip) {
+void DidChangeView(PP_Instance instance, PP_Resource view_resource) {
HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
- const PPB_FlashFullscreen* fullscreen_interface =
- static_cast<const PPB_FlashFullscreen*>(
- dispatcher->local_get_interface()(PPB_FLASHFULLSCREEN_INTERFACE));
- DCHECK(fullscreen_interface);
- const PPB_FlashFullscreen* flash_fullscreen_interface =
- static_cast<const PPB_FlashFullscreen*>(
- dispatcher->local_get_interface()(PPB_FLASHFULLSCREEN_INTERFACE));
- DCHECK(flash_fullscreen_interface);
- PP_Bool fullscreen = fullscreen_interface->IsFullscreen(instance);
- PP_Bool flash_fullscreen =
- flash_fullscreen_interface->IsFullscreen(instance);
- dispatcher->Send(
- new PpapiMsg_PPPInstance_DidChangeView(API_ID_PPP_INSTANCE,
- instance, *position, *clip,
- fullscreen,
- flash_fullscreen));
+
+ thunk::EnterResourceNoLock<thunk::PPB_View_API> enter(view_resource, false);
+ if (enter.failed()) {
+ NOTREACHED();
+ return;
+ }
+
+ dispatcher->Send(new PpapiMsg_PPPInstance_DidChangeView(
+ API_ID_PPP_INSTANCE, instance, enter.object()->GetData(),
+ IsFlashFullscreen(instance, dispatcher)));
}
void DidChangeFocus(PP_Instance instance, PP_Bool has_focus) {
@@ -105,7 +122,7 @@ PP_Bool HandleDocumentLoad(PP_Instance instance,
return result;
}
-static const PPP_Instance_1_0 instance_interface_1_0 = {
+static const PPP_Instance_1_1 instance_interface = {
&DidCreate,
&DidDestroy,
&DidChangeView,
@@ -113,18 +130,30 @@ static const PPP_Instance_1_0 instance_interface_1_0 = {
&HandleDocumentLoad
};
-InterfaceProxy* CreateInstanceProxy(Dispatcher* dispatcher) {
- return new PPP_Instance_Proxy(dispatcher);
-}
-
} // namespace
PPP_Instance_Proxy::PPP_Instance_Proxy(Dispatcher* dispatcher)
: InterfaceProxy(dispatcher) {
if (dispatcher->IsPlugin()) {
- combined_interface_.reset(
- new PPP_Instance_Combined(*static_cast<const PPP_Instance_1_0*>(
- dispatcher->local_get_interface()(PPP_INSTANCE_INTERFACE_1_0))));
+ // The PPP_Instance proxy works by always proxying the 1.1 version of the
+ // interface, and then detecting in the plugin process which one to use.
+ // PPP_Instance_Combined handles dispatching to whatever interface is
+ // supported.
+ //
+ // This means that if the plugin supports either 1.0 or 1.1 version of
+ // the interface, we want to say it supports the 1.1 version since we'll
+ // convert it here. This magic conversion code is hardcoded into
+ // PluginDispatcher::OnMsgSupportsInterface.
+ const PPP_Instance* instance = static_cast<const PPP_Instance*>(
+ dispatcher->local_get_interface()(PPP_INSTANCE_INTERFACE));
+ if (instance) {
+ combined_interface_.reset(new PPP_Instance_Combined(*instance));
+ } else {
+ const PPP_Instance_1_0* instance_1_0 =
+ static_cast<const PPP_Instance_1_0*>(
+ dispatcher->local_get_interface()(PPP_INSTANCE_INTERFACE_1_0));
+ combined_interface_.reset(new PPP_Instance_Combined(*instance_1_0));
+ }
}
}
@@ -132,36 +161,29 @@ PPP_Instance_Proxy::~PPP_Instance_Proxy() {
}
// static
-const InterfaceProxy::Info* PPP_Instance_Proxy::GetInfo1_0() {
- static const Info info = {
- &instance_interface_1_0,
- PPP_INSTANCE_INTERFACE_1_0,
- API_ID_PPP_INSTANCE,
- false,
- &CreateInstanceProxy
- };
- return &info;
+const PPP_Instance* PPP_Instance_Proxy::GetInstanceInterface() {
+ return &instance_interface;
}
bool PPP_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Proxy, msg)
IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidCreate,
- OnMsgDidCreate)
+ OnPluginMsgDidCreate)
IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidDestroy,
- OnMsgDidDestroy)
+ OnPluginMsgDidDestroy)
IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeView,
- OnMsgDidChangeView)
+ OnPluginMsgDidChangeView)
IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeFocus,
- OnMsgDidChangeFocus)
+ OnPluginMsgDidChangeFocus)
IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_HandleDocumentLoad,
- OnMsgHandleDocumentLoad)
+ OnPluginMsgHandleDocumentLoad)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
-void PPP_Instance_Proxy::OnMsgDidCreate(
+void PPP_Instance_Proxy::OnPluginMsgDidCreate(
PP_Instance instance,
const std::vector<std::string>& argn,
const std::vector<std::string>& argv,
@@ -195,37 +217,45 @@ void PPP_Instance_Proxy::OnMsgDidCreate(
&argn_array[0], &argv_array[0]);
}
-void PPP_Instance_Proxy::OnMsgDidDestroy(PP_Instance instance) {
+void PPP_Instance_Proxy::OnPluginMsgDidDestroy(PP_Instance instance) {
combined_interface_->DidDestroy(instance);
PpapiGlobals::Get()->GetResourceTracker()->DidDeleteInstance(instance);
static_cast<PluginDispatcher*>(dispatcher())->DidDestroyInstance(instance);
}
-void PPP_Instance_Proxy::OnMsgDidChangeView(PP_Instance instance,
- const PP_Rect& position,
- const PP_Rect& clip,
- PP_Bool fullscreen,
- PP_Bool flash_fullscreen) {
+void PPP_Instance_Proxy::OnPluginMsgDidChangeView(
+ PP_Instance instance,
+ const ViewData& new_data,
+ PP_Bool flash_fullscreen) {
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
if (!dispatcher)
return;
InstanceData* data = dispatcher->GetInstanceData(instance);
if (!data)
return;
- data->position = position;
- data->fullscreen = fullscreen;
+
+ data->view = new_data;
data->flash_fullscreen = flash_fullscreen;
- combined_interface_->DidChangeView(instance, &position, &clip);
+
+ ScopedPPResource resource(
+ ScopedPPResource::PassRef(),
+ (new PPB_View_Shared(PPB_View_Shared::InitAsProxy(),
+ instance, new_data))->GetReference());
+
+ combined_interface_->DidChangeView(instance, resource,
+ &new_data.rect,
+ &new_data.clip_rect);
}
-void PPP_Instance_Proxy::OnMsgDidChangeFocus(PP_Instance instance,
- PP_Bool has_focus) {
+void PPP_Instance_Proxy::OnPluginMsgDidChangeFocus(PP_Instance instance,
+ PP_Bool has_focus) {
combined_interface_->DidChangeFocus(instance, has_focus);
}
-void PPP_Instance_Proxy::OnMsgHandleDocumentLoad(PP_Instance instance,
- const HostResource& url_loader,
- PP_Bool* result) {
+void PPP_Instance_Proxy::OnPluginMsgHandleDocumentLoad(
+ PP_Instance instance,
+ const HostResource& url_loader,
+ PP_Bool* result) {
PP_Resource plugin_loader =
PPB_URLLoader_Proxy::TrackPluginResource(url_loader);
*result = combined_interface_->HandleDocumentLoad(instance, plugin_loader);