Index: chrome/browser/chromeos/extensions/file_browser_private_api.cc |
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api.cc b/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
index 25ecffe5c801934df81b46b45c86b76a15cd1df0..cce6d8cc29187b874d1053fcfa6846b0a365f55d 100644 |
--- a/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
@@ -95,6 +95,7 @@ using content::WebContents; |
using extensions::Extension; |
using extensions::ZipFileCreator; |
using file_handler_util::FileTaskExecutor; |
+using fileapi::FileSystemURL; |
using google_apis::InstalledApp; |
namespace { |
@@ -327,8 +328,9 @@ void GetSizeStatsOnFileThread(const std::string& mount_path, |
// isn't of the type CrosMountPointProvider handles, return an empty FilePath. |
// |
// Virtual paths will look like "Downloads/foo/bar.txt" or "drive/foo/bar.txt". |
-FilePath GetVirtualPathFromURL(const GURL& url) { |
- fileapi::FileSystemURL filesystem_url(url); |
+FilePath GetVirtualPathFromURL(fileapi::FileSystemContext* context, |
+ const GURL& url) { |
+ fileapi::FileSystemURL filesystem_url(context->CrackURL(url)); |
if (!chromeos::CrosMountPointProvider::CanHandleURL(filesystem_url)) |
return FilePath(); |
return filesystem_url.virtual_path(); |
@@ -339,26 +341,28 @@ FilePath GetVirtualPathFromURL(const GURL& url) { |
// |
// Local paths will look like "/home/chronos/user/Downloads/foo/bar.txt" or |
// "/special/drive/foo/bar.txt". |
-FilePath GetLocalPathFromURL(const GURL& url) { |
- fileapi::FileSystemURL filesystem_url(url); |
+FilePath GetLocalPathFromURL(fileapi::FileSystemContext* context, |
+ const GURL& url) { |
+ fileapi::FileSystemURL filesystem_url(context->CrackURL(url)); |
if (!chromeos::CrosMountPointProvider::CanHandleURL(filesystem_url)) |
return FilePath(); |
return filesystem_url.path(); |
} |
// Make a set of unique filename suffixes out of the list of file URLs. |
-std::set<std::string> GetUniqueSuffixes(base::ListValue* file_url_list) { |
+std::set<std::string> GetUniqueSuffixes(base::ListValue* file_url_list, |
+ fileapi::FileSystemContext* context) { |
std::set<std::string> suffixes; |
for (size_t i = 0; i < file_url_list->GetSize(); ++i) { |
- std::string url; |
- if (!file_url_list->GetString(i, &url)) |
+ std::string url_str; |
+ if (!file_url_list->GetString(i, &url_str)) |
return std::set<std::string>(); |
- FilePath path = GetVirtualPathFromURL(GURL(url)); |
- if (path.empty()) |
+ FileSystemURL url = context->CrackURL(GURL(url_str)); |
+ if (!url.is_valid() || url.path().empty()) |
return std::set<std::string>(); |
// We'll skip empty suffixes. |
- if (!path.Extension().empty()) |
- suffixes.insert(path.Extension()); |
+ if (!url.path().Extension().empty()) |
+ suffixes.insert(url.path().Extension()); |
} |
return suffixes; |
} |
@@ -441,6 +445,30 @@ void FillDriveFilePropertiesValue( |
file_specific_info.content_mime_type()); |
} |
+void GetMimeTypesForFileURLs(const std::vector<FilePath>& file_paths, |
+ std::set<std::string>* mime_types) { |
+ for (std::vector<FilePath>::const_iterator iter = file_paths.begin(); |
+ iter != file_paths.end(); ++iter) { |
+ const FilePath::StringType file_extension = |
+ StringToLowerASCII(iter->Extension()); |
+ |
+ // TODO(thorogood): Rearchitect this call so it can run on the File thread; |
+ // GetMimeTypeFromFile requires this on Linux. Right now, we use |
+ // Chrome-level knowledge only. |
+ std::string mime_type; |
+ if (file_extension.empty() || |
+ !net::GetWellKnownMimeTypeFromExtension(file_extension.substr(1), |
+ &mime_type)) { |
+ // If the file doesn't have an extension or its mime-type cannot be |
+ // determined, then indicate that it has the empty mime-type. This will |
+ // only be matched if the Web Intents accepts "*" or "*/*". |
+ mime_types->insert(""); |
+ } else { |
+ mime_types->insert(mime_type); |
+ } |
+ } |
+} |
+ |
} // namespace |
class RequestLocalFileSystemFunction::LocalFileSystemCallbackDispatcher { |
@@ -674,7 +702,12 @@ bool FileWatchBrowserFunctionBase::RunImpl() { |
if (!args_->GetString(0, &url) || url.empty()) |
return false; |
- GURL file_watch_url(url); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FileSystemURL file_watch_url = file_system_context->CrackURL(GURL(url)); |
BrowserThread::PostTask( |
BrowserThread::FILE, FROM_HERE, |
base::Bind( |
@@ -689,9 +722,9 @@ bool FileWatchBrowserFunctionBase::RunImpl() { |
void FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread( |
scoped_refptr<FileBrowserEventRouter> event_router, |
- const GURL& file_url, const std::string& extension_id) { |
- FilePath local_path = GetLocalPathFromURL(file_url); |
- FilePath virtual_path = GetVirtualPathFromURL(file_url); |
+ const FileSystemURL& file_url, const std::string& extension_id) { |
+ FilePath local_path = file_url.path(); |
+ FilePath virtual_path = file_url.virtual_path(); |
bool result = !local_path.empty() && PerformFileWatchOperation( |
event_router, local_path, virtual_path, extension_id); |
@@ -876,40 +909,16 @@ bool GetFileTasksFileBrowserFunction::FindDriveAppTasks( |
return true; |
} |
-static void GetMimeTypesForFileURLs(const std::vector<GURL>& file_urls, |
- std::set<std::string>* mime_types) { |
- for (std::vector<GURL>::const_iterator iter = file_urls.begin(); |
- iter != file_urls.end(); ++iter) { |
- const FilePath file = FilePath(GURL(iter->spec()).ExtractFileName()); |
- const FilePath::StringType file_extension = |
- StringToLowerASCII(file.Extension()); |
- |
- // TODO(thorogood): Rearchitect this call so it can run on the File thread; |
- // GetMimeTypeFromFile requires this on Linux. Right now, we use |
- // Chrome-level knowledge only. |
- std::string mime_type; |
- if (file_extension.empty() || !net::GetWellKnownMimeTypeFromExtension( |
- file_extension.substr(1), &mime_type)) { |
- // If the file doesn't have an extension or its mime-type cannot be |
- // determined, then indicate that it has the empty mime-type. This will |
- // only be matched if the Web Intents accepts "*" or "*/*". |
- mime_types->insert(""); |
- } else { |
- mime_types->insert(mime_type); |
- } |
- } |
-} |
- |
bool GetFileTasksFileBrowserFunction::FindAppTasks( |
- const std::vector<GURL>& file_urls, |
+ const std::vector<FilePath>& file_paths, |
ListValue* result_list) { |
- DCHECK(!file_urls.empty()); |
+ DCHECK(!file_paths.empty()); |
ExtensionService* service = profile_->GetExtensionService(); |
if (!service) |
return false; |
std::set<std::string> mime_types; |
- GetMimeTypesForFileURLs(file_urls, &mime_types); |
+ GetMimeTypesForFileURLs(file_paths, &mime_types); |
for (ExtensionSet::const_iterator iter = service->extensions()->begin(); |
iter != service->extensions()->end(); |
@@ -958,15 +967,15 @@ bool GetFileTasksFileBrowserFunction::FindAppTasks( |
// Find Web Intent platform apps that support the View task, and add them to |
// the |result_list|. These will be marked as kTaskWebIntent. |
bool GetFileTasksFileBrowserFunction::FindWebIntentTasks( |
- const std::vector<GURL>& file_urls, |
+ const std::vector<FilePath>& file_paths, |
ListValue* result_list) { |
- DCHECK(!file_urls.empty()); |
+ DCHECK(!file_paths.empty()); |
ExtensionService* service = profile_->GetExtensionService(); |
if (!service) |
return false; |
std::set<std::string> mime_types; |
- GetMimeTypesForFileURLs(file_urls, &mime_types); |
+ GetMimeTypesForFileURLs(file_paths, &mime_types); |
for (ExtensionSet::const_iterator iter = service->extensions()->begin(); |
iter != service->extensions()->end(); |
@@ -1023,24 +1032,37 @@ bool GetFileTasksFileBrowserFunction::RunImpl() { |
mime_types_list->GetSize() != 0) |
return false; |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
// Collect all the URLs, convert them to GURLs, and crack all the urls into |
// file paths. |
FileInfoList info_list; |
std::vector<GURL> file_urls; |
+ std::vector<FilePath> file_paths; |
for (size_t i = 0; i < files_list->GetSize(); ++i) { |
FileInfo info; |
- std::string file_url; |
- if (!files_list->GetString(i, &file_url)) |
+ std::string file_url_str; |
+ if (!files_list->GetString(i, &file_url_str)) |
return false; |
- info.file_url = GURL(file_url); |
- file_urls.push_back(info.file_url); |
+ |
if (mime_types_list->GetSize() != 0 && |
!mime_types_list->GetString(i, &info.mime_type)) |
return false; |
- fileapi::FileSystemURL file_system_url(info.file_url); |
- if (chromeos::CrosMountPointProvider::CanHandleURL(file_system_url)) { |
- info.file_path = file_system_url.path(); |
- } |
+ |
+ GURL file_url(file_url_str); |
+ fileapi::FileSystemURL file_system_url( |
+ file_system_context->CrackURL(file_url)); |
+ if (!chromeos::CrosMountPointProvider::CanHandleURL(file_system_url)) |
+ continue; |
+ |
+ file_urls.push_back(file_url); |
+ file_paths.push_back(file_system_url.path()); |
+ |
+ info.file_url = file_url; |
+ info.file_path = file_system_url.path(); |
info_list.push_back(info); |
} |
@@ -1063,7 +1085,7 @@ bool GetFileTasksFileBrowserFunction::RunImpl() { |
std::set<const FileBrowserHandler*> default_tasks; |
if (!file_handler_util::FindCommonTasks(profile_, file_urls, &common_tasks)) |
return false; |
- file_handler_util::FindDefaultTasks(profile_, file_urls, |
+ file_handler_util::FindDefaultTasks(profile_, file_paths, |
common_tasks, &default_tasks); |
ExtensionService* service = |
@@ -1106,12 +1128,12 @@ bool GetFileTasksFileBrowserFunction::RunImpl() { |
// apps may accept, and all previous Drive and extension tasks. As above, we |
// know there aren't duplicates because they're entirely different kinds of |
// tasks. |
- if (!FindAppTasks(file_urls, result_list)) |
+ if (!FindAppTasks(file_paths, result_list)) |
return false; |
// TODO(benwells): remove the web intents tasks once we no longer support |
// them. |
- if (!FindWebIntentTasks(file_urls, result_list)) |
+ if (!FindWebIntentTasks(file_paths, result_list)) |
return false; |
if (VLOG_IS_ON(1)) { |
@@ -1163,14 +1185,24 @@ bool ExecuteTasksFileBrowserFunction::RunImpl() { |
if (!files_list->GetSize()) |
return true; |
- std::vector<GURL> file_urls; |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ std::vector<FileSystemURL> file_urls; |
for (size_t i = 0; i < files_list->GetSize(); i++) { |
- std::string origin_file_url; |
- if (!files_list->GetString(i, &origin_file_url)) { |
+ std::string file_url_str; |
+ if (!files_list->GetString(i, &file_url_str)) { |
error_ = kInvalidFileUrl; |
return false; |
} |
- file_urls.push_back(GURL(origin_file_url)); |
+ FileSystemURL url = file_system_context->CrackURL(GURL(file_url_str)); |
+ if (!chromeos::CrosMountPointProvider::CanHandleURL(url)) { |
+ error_ = kInvalidFileUrl; |
+ return false; |
+ } |
+ file_urls.push_back(url); |
} |
WebContents* web_contents = |
@@ -1210,7 +1242,13 @@ bool SetDefaultTaskFileBrowserFunction::RunImpl() { |
base::ListValue* file_url_list; |
if (!args_->GetList(1, &file_url_list)) |
return false; |
- std::set<std::string> suffixes = GetUniqueSuffixes(file_url_list); |
+ |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ std::set<std::string> suffixes = GetUniqueSuffixes(file_url_list, context); |
// MIME types are an optional parameter. |
base::ListValue* mime_type_list; |
@@ -1331,7 +1369,7 @@ void FileBrowserFunction::GetLocalPathsOnFileThread( |
} |
// Extract the path from |file_url|. |
- fileapi::FileSystemURL url(file_url); |
+ fileapi::FileSystemURL url(file_system_context->CrackURL(file_url)); |
if (!chromeos::CrosMountPointProvider::CanHandleURL(url)) |
continue; |
@@ -1395,11 +1433,17 @@ bool ViewFilesFunction::RunImpl() { |
std::string internal_task_id; |
args_->GetString(1, &internal_task_id); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
std::vector<FilePath> files; |
for (size_t i = 0; i < path_list->GetSize(); ++i) { |
std::string url_as_string; |
path_list->GetString(i, &url_as_string); |
- FilePath path = GetLocalPathFromURL(GURL(url_as_string)); |
+ FilePath path = GetLocalPathFromURL(file_system_context, |
+ GURL(url_as_string)); |
if (path.empty()) |
return false; |
files.push_back(path); |
@@ -1672,7 +1716,13 @@ void SetLastModifiedFunction::RunOperationOnFileThread(std::string file_url, |
time_t timestamp) { |
bool succeeded = false; |
- FilePath local_path = GetLocalPathFromURL(GURL(file_url)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath local_path = GetLocalPathFromURL(file_system_context, |
+ GURL(file_url)); |
if (!local_path.empty()) { |
struct stat sb; |
if (stat(local_path.value().c_str(), &sb) == 0) { |
@@ -1708,7 +1758,13 @@ bool GetSizeStatsFunction::RunImpl() { |
if (!args_->GetString(0, &mount_url)) |
return false; |
- FilePath file_path = GetLocalPathFromURL(GURL(mount_url)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath file_path = GetLocalPathFromURL(file_system_context, |
+ GURL(mount_url)); |
if (file_path.empty()) |
return false; |
@@ -1804,7 +1860,13 @@ bool FormatDeviceFunction::RunImpl() { |
return false; |
} |
- FilePath file_path = GetLocalPathFromURL(GURL(volume_file_url)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath file_path = GetLocalPathFromURL(file_system_context, |
+ GURL(volume_file_url)); |
if (file_path.empty()) |
return false; |
@@ -1831,7 +1893,13 @@ bool GetVolumeMetadataFunction::RunImpl() { |
return false; |
} |
- FilePath file_path = GetLocalPathFromURL(GURL(volume_mount_url)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath file_path = GetLocalPathFromURL(file_system_context, |
+ GURL(volume_mount_url)); |
if (file_path.empty()) { |
error_ = "Invalid mount path."; |
return false; |
@@ -2280,10 +2348,16 @@ void GetDriveFilePropertiesFunction::GetNextFileProperties() { |
return; |
} |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
std::string file_str; |
path_list_->GetString(current_index_, &file_str); |
GURL file_url = GURL(file_str); |
- FilePath file_path = GetVirtualPathFromURL(file_url); |
+ FilePath file_path = GetVirtualPathFromURL(file_system_context, |
+ file_url); |
base::DictionaryValue* property_dict = new base::DictionaryValue; |
property_dict->SetString("fileUrl", file_url.spec()); |
@@ -2501,6 +2575,11 @@ bool GetFileLocationsFunction::RunImpl() { |
if (!args_->GetList(0, &file_urls_as_strings)) |
return false; |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
// Convert the list of strings to a list of GURLs. |
scoped_ptr<ListValue> locations(new ListValue); |
for (size_t i = 0; i < file_urls_as_strings->GetSize(); ++i) { |
@@ -2508,7 +2587,8 @@ bool GetFileLocationsFunction::RunImpl() { |
if (!file_urls_as_strings->GetString(i, &file_url_as_string)) |
return false; |
- fileapi::FileSystemURL url((GURL(file_url_as_string))); |
+ fileapi::FileSystemURL url( |
+ file_system_context->CrackURL(GURL(file_url_as_string))); |
if (url.type() == fileapi::kFileSystemTypeDrive) |
locations->Append(new base::StringValue("drive")); |
else |
@@ -2664,12 +2744,18 @@ bool CancelFileTransfersFunction::RunImpl() { |
if (!system_service) |
return false; |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
scoped_ptr<ListValue> responses(new ListValue()); |
for (size_t i = 0; i < url_list->GetSize(); ++i) { |
std::string url_as_string; |
url_list->GetString(i, &url_as_string); |
- FilePath file_path = GetLocalPathFromURL(GURL(url_as_string)); |
+ FilePath file_path = GetLocalPathFromURL(file_system_context, |
+ GURL(url_as_string)); |
if (file_path.empty()) |
continue; |
@@ -2711,8 +2797,15 @@ bool TransferFileFunction::RunImpl() { |
if (!system_service) |
return false; |
- FilePath source_file = GetLocalPathFromURL(GURL(source_file_url)); |
- FilePath destination_file = GetLocalPathFromURL(GURL(destination_file_url)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath source_file = GetLocalPathFromURL(file_system_context, |
+ GURL(source_file_url)); |
+ FilePath destination_file = GetLocalPathFromURL(file_system_context, |
+ GURL(destination_file_url)); |
if (source_file.empty() || destination_file.empty()) |
return false; |
@@ -2960,7 +3053,13 @@ bool RequestDirectoryRefreshFunction::RunImpl() { |
if (!system_service || !system_service->file_system()) |
return false; |
- FilePath directory_path = GetVirtualPathFromURL(GURL(file_url_as_string)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath directory_path = GetVirtualPathFromURL(file_system_context, |
+ GURL(file_url_as_string)); |
system_service->file_system()->RequestDirectoryRefresh(directory_path); |
return true; |
@@ -2982,7 +3081,13 @@ bool ZipSelectionFunction::RunImpl() { |
if (!args_->GetString(0, &dir_url) || dir_url.empty()) |
return false; |
- FilePath src_dir = GetLocalPathFromURL(GURL(dir_url)); |
+ content::SiteInstance* site_instance = render_view_host()->GetSiteInstance(); |
+ scoped_refptr<fileapi::FileSystemContext> file_system_context = |
+ BrowserContext::GetStoragePartition(profile(), site_instance)-> |
+ GetFileSystemContext(); |
+ |
+ FilePath src_dir = GetLocalPathFromURL(file_system_context, |
+ GURL(dir_url)); |
if (src_dir.empty()) |
return false; |
@@ -2996,7 +3101,7 @@ bool ZipSelectionFunction::RunImpl() { |
for (size_t i = 0; i < selection_urls->GetSize(); ++i) { |
std::string file_url; |
selection_urls->GetString(i, &file_url); |
- FilePath path = GetLocalPathFromURL(GURL(file_url)); |
+ FilePath path = GetLocalPathFromURL(file_system_context, GURL(file_url)); |
if (path.empty()) |
return false; |
files.push_back(path); |