| 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 f8417c001a37b51632ceb2c51ce2028500511d72..6f6d5312e9e2c044be35e57a27c1d13106b3325d 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,8 +8,11 @@
|
| #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"
|
| @@ -18,6 +21,7 @@
|
| #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 {
|
| @@ -36,19 +40,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,
|
| @@ -131,6 +122,7 @@ int32_t PepperFileSystemBrowserHost::OnHostMsgOpen(
|
| &unused)) {
|
| return PP_ERROR_FAILED;
|
| }
|
| +
|
| BrowserThread::PostTaskAndReplyWithResult(
|
| BrowserThread::UI,
|
| FROM_HERE,
|
| @@ -171,23 +163,10 @@ void PepperFileSystemBrowserHost::GotFileSystemContext(
|
| fs_context->OpenFileSystem(origin, file_system_type,
|
| fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
|
| base::Bind(&PepperFileSystemBrowserHost::OpenFileSystemComplete,
|
| - weak_factory_.GetWeakPtr(),
|
| - reply_context));
|
| + weak_factory_.GetWeakPtr(), reply_context));
|
| fs_context_ = fs_context;
|
| }
|
|
|
| -void PepperFileSystemBrowserHost::GotIsolatedFileSystemContext(
|
| - ppapi::host::ReplyMessageContext reply_context,
|
| - scoped_refptr<fileapi::FileSystemContext> fs_context) {
|
| - fs_context_ = fs_context;
|
| - if (fs_context.get())
|
| - reply_context.params.set_result(PP_OK);
|
| - else
|
| - reply_context.params.set_result(PP_ERROR_FAILED);
|
| - host()->SendReply(reply_context,
|
| - PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply());
|
| -}
|
| -
|
| void PepperFileSystemBrowserHost::OpenFileSystemComplete(
|
| ppapi::host::ReplyMessageContext reply_context,
|
| const GURL& root,
|
| @@ -202,6 +181,75 @@ void PepperFileSystemBrowserHost::OpenFileSystemComplete(
|
| 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()) {
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED);
|
| + return;
|
| + }
|
| +
|
| + root_url_ = GURL(fileapi::GetIsolatedFileSystemRootURIString(
|
| + browser_ppapi_host_->GetDocumentURLForInstance(pp_instance()).GetOrigin(),
|
| + fsid, ppapi::IsolatedFileSystemTypeToRootName(type)));
|
| + if (!root_url_.is_valid()) {
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED);
|
| + return;
|
| + }
|
| +
|
| + switch (type) {
|
| + case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_CRX:
|
| + opened_ = true;
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, PP_OK);
|
| + return;
|
| + case PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_PLUGINPRIVATE:
|
| + OpenPluginPrivateFileSystem(reply_context, fsid, fs_context);
|
| + return;
|
| + default:
|
| + NOTREACHED();
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT);
|
| + return;
|
| + }
|
| +}
|
| +
|
| +void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystem(
|
| + ppapi::host::ReplyMessageContext reply_context,
|
| + const std::string& fsid,
|
| + scoped_refptr<fileapi::FileSystemContext> fs_context) {
|
| + GURL origin = browser_ppapi_host_->GetDocumentURLForInstance(
|
| + pp_instance()).GetOrigin();
|
| + if (!origin.is_valid()) {
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_FAILED);
|
| + return;
|
| + }
|
| +
|
| + const std::string& plugin_id = GeneratePluginId(GetPluginMimeType());
|
| + if (plugin_id.empty()) {
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT);
|
| + 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, fsid));
|
| +}
|
| +
|
| +void PepperFileSystemBrowserHost::OpenPluginPrivateFileSystemComplete(
|
| + ppapi::host::ReplyMessageContext reply_context,
|
| + const std::string& fsid,
|
| + base::PlatformFileError error) {
|
| + int32 pp_error = ppapi::PlatformFileErrorToPepperError(error);
|
| + if (pp_error == PP_OK)
|
| + opened_ = true;
|
| + SendReplyForIsolatedFileSystem(reply_context, fsid, pp_error);
|
| +}
|
| +
|
| int32_t PepperFileSystemBrowserHost::OnHostMsgInitIsolatedFileSystem(
|
| ppapi::host::HostMessageContext* context,
|
| const std::string& fsid,
|
| @@ -215,31 +263,70 @@ 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(),
|
| &render_process_id,
|
| &unused)) {
|
| + fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid);
|
| return PP_ERROR_FAILED;
|
| }
|
| +
|
| BrowserThread::PostTaskAndReplyWithResult(
|
| BrowserThread::UI,
|
| FROM_HERE,
|
| base::Bind(&GetFileSystemContextFromRenderId, render_process_id),
|
| base::Bind(&PepperFileSystemBrowserHost::GotIsolatedFileSystemContext,
|
| weak_factory_.GetWeakPtr(),
|
| - context->MakeReplyMessageContext()));
|
| + context->MakeReplyMessageContext(), fsid, type));
|
| return PP_OK_COMPLETIONPENDING;
|
| }
|
|
|
| +void PepperFileSystemBrowserHost::SendReplyForIsolatedFileSystem(
|
| + ppapi::host::ReplyMessageContext reply_context,
|
| + const std::string& fsid,
|
| + int32_t error) {
|
| + if (error != PP_OK)
|
| + fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid);
|
| + reply_context.params.set_result(error);
|
| + host()->SendReply(reply_context,
|
| + PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply());
|
| +}
|
| +
|
| +std::string PepperFileSystemBrowserHost::GetPluginMimeType() const {
|
| + 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.
|
| + return info->mime_types[0].mime_type;
|
| +}
|
| +
|
| +std::string PepperFileSystemBrowserHost::GeneratePluginId(
|
| + const std::string& mime_type) const {
|
| + // TODO(nhiroki): This function is very specialized for specific plugins (MIME
|
| + // types). If we bring this API to stable, we might have to make it more
|
| + // general.
|
| +
|
| + if (!net::IsMimeType(mime_type))
|
| + return std::string();
|
| + std::string output = mime_type;
|
| +
|
| + // 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 "._-".
|
| + for (std::string::const_iterator it = output.begin();
|
| + it != output.end(); ++it) {
|
| + if (!IsAsciiAlpha(*it) && !IsAsciiDigit(*it) &&
|
| + *it != '.' && *it != '_' && *it != '-') {
|
| + LOG(WARNING) << "Failed to generate a plugin id.";
|
| + return std::string();
|
| + }
|
| + }
|
| + return output;
|
| +}
|
| +
|
| } // namespace content
|
|
|