Index: content/renderer/pepper/resource_converter.cc |
diff --git a/content/renderer/pepper/resource_converter.cc b/content/renderer/pepper/resource_converter.cc |
index 118a1ac4dfe81cd18bee3c643f7e073aa1322aea..870db539115d64ab28f8af7749fa59aa122674dc 100644 |
--- a/content/renderer/pepper/resource_converter.cc |
+++ b/content/renderer/pepper/resource_converter.cc |
@@ -7,9 +7,15 @@ |
#include "base/bind.h" |
#include "base/message_loop/message_loop.h" |
#include "content/public/renderer/renderer_ppapi_host.h" |
+#include "content/renderer/pepper/pepper_file_system_host.h" |
#include "ipc/ipc_message.h" |
+#include "ppapi/host/ppapi_host.h" |
+#include "ppapi/host/resource_host.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
#include "ppapi/shared_impl/resource_var.h" |
#include "ppapi/shared_impl/scoped_pp_var.h" |
+#include "third_party/WebKit/public/platform/WebFileSystem.h" |
+#include "third_party/WebKit/public/web/WebDOMFileSystem.h" |
namespace { |
@@ -24,6 +30,56 @@ void FlushComplete( |
callback.Run(true); |
} |
+// Converts a WebKit::WebFileSystem::Type to a PP_FileSystemType. |
+PP_FileSystemType WebFileSystemTypeToPPAPI(WebKit::WebFileSystem::Type type) { |
+ switch (type) { |
+ case WebKit::WebFileSystem::TypeTemporary: |
+ return PP_FILESYSTEMTYPE_LOCALTEMPORARY; |
+ case WebKit::WebFileSystem::TypePersistent: |
+ return PP_FILESYSTEMTYPE_LOCALPERSISTENT; |
+ case WebKit::WebFileSystem::TypeIsolated: |
+ return PP_FILESYSTEMTYPE_ISOLATED; |
+ case WebKit::WebFileSystem::TypeExternal: |
+ return PP_FILESYSTEMTYPE_EXTERNAL; |
+ default: |
+ NOTREACHED(); |
+ return PP_FILESYSTEMTYPE_LOCALTEMPORARY; |
+ } |
+} |
+ |
+// Given a V8 value containing a DOMFileSystem, creates a resource host and |
+// returns the resource information for serialization. |
+// On error, false. |
+bool DOMFileSystemToResource( |
+ PP_Instance instance, |
+ content::RendererPpapiHost* host, |
+ const WebKit::WebDOMFileSystem& dom_file_system, |
+ int* pending_renderer_id, |
+ scoped_ptr<IPC::Message>* create_message, |
+ scoped_ptr<IPC::Message>* browser_host_create_message) { |
+ // TODO(mgiuca): Ensure that external file systems are supported. |
+ DCHECK(!dom_file_system.isNull()); |
+ |
+ PP_FileSystemType file_system_type = |
+ WebFileSystemTypeToPPAPI(dom_file_system.type()); |
+ GURL root_url = dom_file_system.rootURL(); |
+ |
+ *pending_renderer_id = host->GetPpapiHost()->AddPendingResourceHost( |
+ scoped_ptr<ppapi::host::ResourceHost>( |
+ new content::PepperFileSystemHost(host, instance, 0, root_url, |
+ file_system_type))); |
+ if (*pending_renderer_id == 0) |
+ return false; |
+ |
+ create_message->reset( |
+ new PpapiPluginMsg_FileSystem_CreateFromPendingHost(file_system_type)); |
+ |
+ browser_host_create_message->reset( |
+ new PpapiHostMsg_FileSystem_CreateFromRenderer(root_url.spec(), |
+ file_system_type)); |
+ return true; |
+} |
+ |
} // namespace |
namespace content { |
@@ -50,9 +106,31 @@ bool ResourceConverterImpl::FromV8Value(v8::Handle<v8::Object> val, |
v8::HandleScope handle_scope(context->GetIsolate()); |
*was_resource = false; |
- // TODO(mgiuca): There are currently no values which can be converted to |
- // resources. |
+ WebKit::WebDOMFileSystem dom_file_system = |
+ WebKit::WebDOMFileSystem::fromV8Value(val); |
+ if (!dom_file_system.isNull()) { |
yzshen1
2013/10/23 18:29:24
nit, optional: it seems more clear to check the op
Matt Giuca
2013/10/24 01:00:11
No, I don't want to do that, because this function
|
+ int pending_renderer_id; |
+ scoped_ptr<IPC::Message> create_message; |
+ scoped_ptr<IPC::Message> browser_host_create_message; |
+ if (!DOMFileSystemToResource(instance_, host_, dom_file_system, |
+ &pending_renderer_id, &create_message, |
+ &browser_host_create_message)) { |
+ return false; |
+ } |
+ DCHECK(create_message); |
+ DCHECK(browser_host_create_message); |
+ scoped_refptr<HostResourceVar> result_var = |
+ CreateResourceVarWithBrowserHost( |
+ pending_renderer_id, *create_message, *browser_host_create_message); |
+ *result = result_var->GetPPVar(); |
+ *was_resource = true; |
+ return true; |
+ } |
+ |
+ // The value was not convertible to a resource. Return true with |
+ // |was_resource| set to false. As per the interface of FromV8Value, |result| |
+ // may be left unmodified in this case. |
return true; |
} |