Index: ppapi/proxy/raw_var_data.cc |
diff --git a/ppapi/proxy/raw_var_data.cc b/ppapi/proxy/raw_var_data.cc |
index 91bcfbfd1f0b0448126f2da92cc6081076cd1f14..d7b63693021adfbcd946971653fb992467a4ea35 100644 |
--- a/ppapi/proxy/raw_var_data.cc |
+++ b/ppapi/proxy/raw_var_data.cc |
@@ -9,7 +9,12 @@ |
#include "base/containers/hash_tables.h" |
#include "base/stl_util.h" |
#include "ipc/ipc_message.h" |
+#include "ppapi/proxy/file_system_resource.h" |
+#include "ppapi/proxy/plugin_dispatcher.h" |
+#include "ppapi/proxy/plugin_globals.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
#include "ppapi/proxy/ppapi_param_traits.h" |
+#include "ppapi/proxy/resource_creation_proxy.h" |
#include "ppapi/shared_impl/array_var.h" |
#include "ppapi/shared_impl/dictionary_var.h" |
#include "ppapi/shared_impl/ppapi_globals.h" |
@@ -64,6 +69,14 @@ bool CanHaveChildren(PP_Var var) { |
return var.type == PP_VARTYPE_ARRAY || var.type == PP_VARTYPE_DICTIONARY; |
} |
+// Should only be called when the Pepper plugin is out of process. |
+Connection GetConnectionForInstance(PP_Instance instance) { |
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
+ // GetForInstance returns NULL in the in-process case. |
+ DCHECK(dispatcher); |
+ return Connection(PluginGlobals::Get()->GetBrowserSender(), dispatcher); |
+} |
+ |
} // namespace |
// RawVarDataGraph ------------------------------------------------------------ |
@@ -695,12 +708,40 @@ bool ResourceRawVarData::Init(const PP_Var& var, PP_Instance /*instance*/) { |
} |
PP_Var ResourceRawVarData::CreatePPVar(PP_Instance instance) { |
- // If pp_resource_ is NULL, it could be because we are on the plugin side and |
- // there is a pending resource host on the renderer. |
- // TODO(mgiuca): Create a plugin-side resource in this case. |
- // Currently, this should never occur. This will be needed when passing a |
- // resource from the renderer to the plugin (http://crbug.com/177017). |
- DCHECK(pp_resource_); |
+ // If we are on the plugin side, and the var is a pending resource host, |
+ // create a plugin-side resource. A var is a pending resource host if it has a |
+ // pp_resource of 0, and a non-null creation message. |
+ if (PpapiGlobals::Get()->IsPluginGlobals() && !pp_resource_ && |
+ creation_message_) { |
+ DCHECK(pending_renderer_host_id_); |
+ DCHECK(pending_browser_host_id_); |
+ switch (creation_message_->type()) { |
+ case PpapiPluginMsg_FileSystem_CreateFromPendingHost::ID: { |
+ PP_FileSystemType file_system_type; |
+ if (!UnpackMessage<PpapiPluginMsg_FileSystem_CreateFromPendingHost>( |
+ *creation_message_, &file_system_type)) { |
+ NOTREACHED() << "Invalid message of type " |
+ "PpapiPluginMsg_FileSystem_CreateFromPendingHost"; |
+ return PP_MakeNull(); |
+ } |
+ // Create a plugin-side resource and attach it to the host resource. |
+ // Note: This only makes sense when the plugin is out of process (which |
+ // should always be true when passing resource vars). |
+ pp_resource_ = |
+ (new FileSystemResource(GetConnectionForInstance(instance), |
+ instance, |
+ pending_renderer_host_id_, |
+ pending_browser_host_id_, |
+ file_system_type))->GetReference(); |
+ break; |
+ } |
+ default: { |
+ NOTREACHED() << "Creation message has unexpected type " |
+ << creation_message_->type(); |
+ return PP_MakeNull(); |
+ } |
+ } |
+ } |
return PpapiGlobals::Get()->GetVarTracker()->MakeResourcePPVar(pp_resource_); |
} |