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 c304baaec296e5f99f897ae0ab6091f63bd3c9e9..6450488490b1c5949fed59cd31aa523b2134cab8 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,15 +8,20 @@ |
#include "base/callback.h" |
#include "content/public/browser/browser_ppapi_host.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/plugin_service.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/storage_partition.h" |
+#include "content/public/common/pepper_plugin_info.h" |
+#include "net/base/mime_util.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/host/dispatch_host_message.h" |
#include "ppapi/host/ppapi_host.h" |
#include "ppapi/proxy/ppapi_messages.h" |
+#include "ppapi/shared_impl/file_system_util.h" |
#include "ppapi/shared_impl/file_type_conversion.h" |
#include "webkit/browser/fileapi/file_system_context.h" |
#include "webkit/browser/fileapi/file_system_operation_runner.h" |
+#include "webkit/browser/fileapi/isolated_context.h" |
#include "webkit/common/fileapi/file_system_util.h" |
namespace content { |
@@ -37,19 +42,6 @@ GetFileSystemContextFromRenderId(int render_process_id) { |
return storage_partition->GetFileSystemContext(); |
} |
-// TODO(nhiroki): Move this function somewhere else to be shared. |
-std::string IsolatedFileSystemTypeToRootName( |
- PP_IsolatedFileSystemType_Private type) { |
- switch (type) { |
- case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_INVALID: |
- break; |
- case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_CRX: |
- return "crxfs"; |
- } |
- NOTREACHED() << type; |
- return std::string(); |
-} |
- |
} // namespace |
PepperFileSystemBrowserHost::PepperFileSystemBrowserHost(BrowserPpapiHost* host, |
@@ -187,30 +179,88 @@ void PepperFileSystemBrowserHost::GotFileSystemContext( |
fs_context_ = fs_context; |
} |
+void PepperFileSystemBrowserHost::OpenFileSystemComplete( |
+ ppapi::host::ReplyMessageContext reply_context, |
+ const GURL& root, |
+ const std::string& /* unused */, |
+ base::PlatformFileError error) { |
+ int32 pp_error = ppapi::PlatformFileErrorToPepperError(error); |
+ if (pp_error == PP_OK) { |
+ opened_ = true; |
+ root_url_ = root; |
+ } |
+ reply_context.params.set_result(pp_error); |
+ host()->SendReply(reply_context, PpapiPluginMsg_FileSystem_OpenReply()); |
+} |
+ |
void PepperFileSystemBrowserHost::GotIsolatedFileSystemContext( |
ppapi::host::ReplyMessageContext reply_context, |
+ const std::string& fsid, |
+ PP_IsolatedFileSystemType_Private type, |
scoped_refptr<fileapi::FileSystemContext> fs_context) { |
fs_context_ = fs_context; |
- if (fs_context.get()) |
- reply_context.params.set_result(PP_OK); |
- else |
+ if (!fs_context.get()) { |
reply_context.params.set_result(PP_ERROR_FAILED); |
+ host()->SendReply(reply_context, |
+ PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); |
+ return; |
+ } |
+ |
+ root_url_ = GURL(fileapi::GetIsolatedFileSystemRootURIString( |
teravest
2013/11/12 18:04:53
Should we do anything if root_url_.is_valid() is f
nhiroki
2013/11/14 11:34:39
Done.
|
+ browser_ppapi_host_->GetDocumentURLForInstance(pp_instance()), |
+ fsid, ppapi::IsolatedFileSystemTypeToRootName(type))); |
+ |
+ switch (type) { |
+ case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_INVALID: |
teravest
2013/11/12 18:04:53
Should this just be the default case for the switc
nhiroki
2013/11/14 11:34:39
Done.
|
+ NOTREACHED(); |
+ reply_context.params.set_result(PP_ERROR_BADARGUMENT); |
+ break; |
+ case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_CRX: |
+ opened_ = true; |
+ reply_context.params.set_result(PP_OK); |
+ break; |
+ case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_PLUGINPRIVATE: |
+ OpenPluginPrivateFileSystem(reply_context, fsid, fs_context); |
+ return; |
+ } |
host()->SendReply(reply_context, |
PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); |
} |
-void PepperFileSystemBrowserHost::OpenFileSystemComplete( |
+void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystem( |
+ ppapi::host::ReplyMessageContext reply_context, |
+ const std::string& fsid, |
+ scoped_refptr<fileapi::FileSystemContext> fs_context) { |
+ GURL origin = browser_ppapi_host_->GetDocumentURLForInstance( |
teravest
2013/11/12 18:04:53
Should we do a validity check on origin here?
nhiroki
2013/11/14 11:34:39
Done.
|
+ pp_instance()).GetOrigin(); |
+ |
+ const std::string plugin_id = GeneratePluginId(); |
+ if (plugin_id.empty()) { |
+ fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); |
+ reply_context.params.set_result(PP_ERROR_BADARGUMENT); |
+ host()->SendReply(reply_context, |
+ PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); |
+ return; |
+ } |
+ |
+ fs_context->OpenPluginPrivateFileSystem( |
+ origin, fileapi::kFileSystemTypePluginPrivate, fsid, plugin_id, |
+ fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, |
+ base::Bind( |
+ &PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete, |
+ weak_factory_.GetWeakPtr(), reply_context)); |
+} |
+ |
+void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete( |
ppapi::host::ReplyMessageContext reply_context, |
- const GURL& root, |
- const std::string& /* unused */, |
base::PlatformFileError error) { |
int32 pp_error = ppapi::PlatformFileErrorToPepperError(error); |
- if (pp_error == PP_OK) { |
+ if (pp_error == PP_OK) |
opened_ = true; |
- root_url_ = root; |
- } |
reply_context.params.set_result(pp_error); |
- host()->SendReply(reply_context, PpapiPluginMsg_FileSystem_OpenReply()); |
+ host()->SendReply( |
+ reply_context, |
+ PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply()); |
} |
int32_t PepperFileSystemBrowserHost::OnHostMsgInitIsolatedFileSystem( |
@@ -226,16 +276,6 @@ int32_t PepperFileSystemBrowserHost::OnHostMsgInitIsolatedFileSystem( |
if (!fileapi::ValidateIsolatedFileSystemId(fsid)) |
return PP_ERROR_BADARGUMENT; |
- const GURL& url = |
- browser_ppapi_host_->GetDocumentURLForInstance(pp_instance()); |
- const std::string root_name = IsolatedFileSystemTypeToRootName(type); |
- if (root_name.empty()) |
- return PP_ERROR_BADARGUMENT; |
- |
- root_url_ = GURL(fileapi::GetIsolatedFileSystemRootURIString( |
- url.GetOrigin(), fsid, root_name)); |
- opened_ = true; |
- |
int render_process_id = 0; |
int unused; |
if (!browser_ppapi_host_->GetRenderViewIDsForInstance(pp_instance(), |
@@ -249,8 +289,35 @@ int32_t PepperFileSystemBrowserHost::OnHostMsgInitIsolatedFileSystem( |
base::Bind(&GetFileSystemContextFromRenderId, render_process_id), |
base::Bind(&PepperFileSystemBrowserHost::GotIsolatedFileSystemContext, |
weak_factory_.GetWeakPtr(), |
- context->MakeReplyMessageContext())); |
+ context->MakeReplyMessageContext(), fsid, type)); |
return PP_OK_COMPLETIONPENDING; |
} |
+std::string PepperFileSystemBrowserHost::GeneratePluginId() { |
+ base::FilePath plugin_path = browser_ppapi_host_->GetPluginPath(); |
+ PepperPluginInfo* info = |
+ PluginService::GetInstance()->GetRegisteredPpapiPluginInfo(plugin_path); |
+ if (!info || info->mime_types.empty()) |
+ return std::string(); |
+ |
+ // Use the first element in |info->mime_types| even if several elements exist. |
+ std::string output = info->mime_types[0].mime_type; |
+ if (!net::IsMimeType(output)) |
+ return std::string(); |
+ |
+ // Replace a slash used for type/subtype separator with an underscore. |
+ // NOTE: This assumes there is only one slash in the MIME type. |
+ ReplaceFirstSubstringAfterOffset(&output, 0, "/", "_"); |
+ |
+ // Verify |output| contains only alphabets, digits, or "._-". |
teravest
2013/11/12 18:04:53
This is stricter than what mime types require, rig
nhiroki
2013/11/14 11:34:39
That's right. MIME type requires at least one slas
|
+ for (std::string::const_iterator it = output.begin(); |
+ it != output.end(); ++it) { |
+ if (!IsAsciiAlpha(*it) && !IsAsciiDigit(*it) && |
+ *it != '.' && *it != '_' && *it != '-') { |
+ return std::string(); |
+ } |
+ } |
+ return output; |
+} |
+ |
} // namespace content |