Index: content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc |
diff --git a/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc b/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc |
index af3ec67b22717eaecba02235507d6a57b08a3685..f91491c06370ab90b198cb574d2fdb8e6fde2712 100644 |
--- a/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc |
+++ b/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc |
@@ -8,6 +8,7 @@ |
#include "base/callback.h" |
#include "content/public/browser/browser_ppapi_host.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/child_process_security_policy.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/storage_partition.h" |
#include "ppapi/c/pp_errors.h" |
@@ -96,6 +97,9 @@ int32_t PepperFileSystemBrowserHost::OnResourceMessageReceived( |
PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
PpapiHostMsg_FileSystem_InitIsolatedFileSystem, |
OnHostMsgInitIsolatedFileSystem) |
+ PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( |
+ PpapiHostMsg_FileSystem_OpenPluginPrivateFileSystem, |
+ OnHostMsgOpenPluginPrivateFileSystem) |
IPC_END_MESSAGE_MAP() |
return PP_ERROR_FAILED; |
} |
@@ -179,6 +183,29 @@ void PepperFileSystemBrowserHost::GotIsolatedFileSystemContext( |
PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); |
} |
+void PepperFileSystemBrowserHost::GotFileSystemContextForPluginPrivate( |
+ ppapi::host::ReplyMessageContext reply_context, |
+ scoped_refptr<fileapi::FileSystemContext> fs_context) { |
+ if (!fs_context.get()) { |
+ OpenFileSystemComplete( |
+ reply_context, GURL(), std::string(), base::PLATFORM_FILE_ERROR_FAILED); |
+ return; |
+ } |
+ fs_context_ = fs_context; |
+ |
+ GURL origin = browser_ppapi_host_->GetDocumentURLForInstance( |
+ pp_instance()).GetOrigin(); |
+ |
+ // TODO(nhiroki): Generate a real plugin_id from the plugin's MIME type. |
+ std::string dummy_plugin_id = "plugin_id"; |
+ fs_context->OpenPluginPrivateFileSystem( |
+ origin, fileapi::kFileSystemTypePluginPrivate, dummy_plugin_id, |
+ fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, |
+ base::Bind( |
+ &PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete, |
+ weak_factory_.GetWeakPtr(), reply_context)); |
+} |
+ |
void PepperFileSystemBrowserHost::OpenFileSystemComplete( |
ppapi::host::ReplyMessageContext reply_context, |
const GURL& root, |
@@ -193,6 +220,47 @@ void PepperFileSystemBrowserHost::OpenFileSystemComplete( |
host()->SendReply(reply_context, PpapiPluginMsg_FileSystem_OpenReply()); |
} |
+void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete( |
+ ppapi::host::ReplyMessageContext reply_context, |
+ const GURL& root, |
+ const std::string& fsid, |
+ base::PlatformFileError error) { |
+ int32 pp_error = ppapi::PlatformFileErrorToPepperError(error); |
+ if (pp_error != PP_OK) { |
+ reply_context.params.set_result(pp_error); |
+ host()->SendReply( |
+ reply_context, |
+ PpapiPluginMsg_FileSystem_OpenPluginPrivateFileSystemReply( |
+ std::string())); |
+ return; |
+ } |
+ |
+ int render_process_id = 0; |
+ int unused; |
+ if (!browser_ppapi_host_->GetRenderViewIDsForInstance(pp_instance(), |
+ &render_process_id, |
+ &unused)) { |
+ reply_context.params.set_result(PP_ERROR_FAILED); |
+ host()->SendReply( |
+ reply_context, |
+ PpapiPluginMsg_FileSystem_OpenPluginPrivateFileSystemReply( |
+ std::string())); |
+ return; |
+ } |
+ |
+ opened_ = true; |
+ root_url_ = root; |
+ |
+ content::ChildProcessSecurityPolicy* policy = |
+ content::ChildProcessSecurityPolicy::GetInstance(); |
+ policy->GrantCreateReadWriteFileSystem(render_process_id, fsid); |
+ |
+ reply_context.params.set_result(PP_OK); |
+ host()->SendReply( |
+ reply_context, |
+ PpapiPluginMsg_FileSystem_OpenPluginPrivateFileSystemReply(fsid)); |
+} |
+ |
int32_t PepperFileSystemBrowserHost::OnHostMsgInitIsolatedFileSystem( |
ppapi::host::HostMessageContext* context, |
const std::string& fsid) { |
@@ -226,4 +294,29 @@ int32_t PepperFileSystemBrowserHost::OnHostMsgInitIsolatedFileSystem( |
return PP_OK_COMPLETIONPENDING; |
} |
+int32_t PepperFileSystemBrowserHost::OnHostMsgOpenPluginPrivateFileSystem( |
+ ppapi::host::HostMessageContext* context) { |
+ // Do not allow multiple opens. |
+ if (called_open_) |
+ return PP_ERROR_INPROGRESS; |
+ called_open_ = true; |
+ |
+ int render_process_id = 0; |
+ int unused; |
+ if (!browser_ppapi_host_->GetRenderViewIDsForInstance(pp_instance(), |
+ &render_process_id, |
+ &unused)) { |
+ return PP_ERROR_FAILED; |
+ } |
+ |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GetFileSystemContextFromRenderId, render_process_id), |
+ base::Bind( |
+ &PepperFileSystemBrowserHost::GotFileSystemContextForPluginPrivate, |
+ weak_factory_.GetWeakPtr(), context->MakeReplyMessageContext())); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
} // namespace content |