Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1680)

Unified Diff: chrome/browser/extensions/api/file_system/file_system_api.cc

Issue 656733002: Fix filesystem.retainEntry API to handle non-native directory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/file_system/file_system_api.cc
diff --git a/chrome/browser/extensions/api/file_system/file_system_api.cc b/chrome/browser/extensions/api/file_system/file_system_api.cc
index a2b27a3cd126549ffdb5aaef5041d6d6ee9ab395..0cdb0e6ef8689d23ee1efa3b84238807a5fa9d71 100644
--- a/chrome/browser/extensions/api/file_system/file_system_api.cc
+++ b/chrome/browser/extensions/api/file_system/file_system_api.cc
@@ -20,6 +20,7 @@
#include "base/values.h"
#include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/path_util.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/profiles/profile.h"
@@ -32,6 +33,7 @@
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/app_window/app_window.h"
#include "extensions/browser/app_window/app_window_registry.h"
@@ -42,6 +44,7 @@
#include "extensions/common/permissions/permissions_data.h"
#include "net/base/mime_util.h"
#include "storage/browser/fileapi/external_mount_points.h"
+#include "storage/browser/fileapi/file_system_operation_runner.h"
#include "storage/browser/fileapi/isolated_context.h"
#include "storage/common/fileapi/file_system_types.h"
#include "storage/common/fileapi/file_system_util.h"
@@ -868,14 +871,33 @@ bool FileSystemRetainEntryFunction::RunAsync() {
return false;
}
- content::BrowserThread::PostTaskAndReply(
- content::BrowserThread::FILE,
+ std::string filesystem_id;
+ if (!storage::CrackIsolatedFileSystemName(filesystem_name, &filesystem_id))
+ return false;
+
+ const GURL site =
+ extensions::util::GetSiteForExtensionId(extension_id(), GetProfile());
+ storage::FileSystemContext* const context =
+ content::BrowserContext::GetStoragePartitionForSite(GetProfile(), site)
+ ->GetFileSystemContext();
+ const storage::FileSystemURL url = context->CreateCrackedFileSystemURL(
+ site,
+ storage::kFileSystemTypeIsolated,
+ IsolatedContext::GetInstance()
+ ->CreateVirtualRootPath(filesystem_id)
+ .Append(filesystem_path));
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO,
FROM_HERE,
- base::Bind(&FileSystemRetainEntryFunction::SetIsDirectoryOnFileThread,
- this),
- base::Bind(&FileSystemRetainEntryFunction::RetainFileEntry,
- this,
- entry_id));
+ base::Bind(
+ base::IgnoreResult(
+ &storage::FileSystemOperationRunner::GetMetadata),
+ context->operation_runner()->AsWeakPtr(),
+ url,
+ base::Bind(&FileSystemRetainEntryFunction::SetIsDirectoryOnIOThread,
+ this,
+ entry_id)));
return true;
}
@@ -886,6 +908,11 @@ bool FileSystemRetainEntryFunction::RunAsync() {
void FileSystemRetainEntryFunction::RetainFileEntry(
const std::string& entry_id) {
+ if (entry_id.empty()) {
+ SendResponse(false);
+ return;
+ }
+
SavedFilesService* saved_files_service = SavedFilesService::Get(GetProfile());
saved_files_service->RegisterFileEntry(
extension_->id(), entry_id, path_, is_directory_);
@@ -893,8 +920,21 @@ void FileSystemRetainEntryFunction::RetainFileEntry(
SendResponse(true);
}
-void FileSystemRetainEntryFunction::SetIsDirectoryOnFileThread() {
- is_directory_ = base::DirectoryExists(path_);
+void FileSystemRetainEntryFunction::SetIsDirectoryOnIOThread(
mtomasz 2014/10/14 06:08:49 Calling SetIsDirectoryOnIOThread should only set "
hirono 2014/10/14 09:22:10 I removed the method and aggregated the procedures
+ const std::string& entry_id,
+ base::File::Error result,
+ const base::File::Info& file_info) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+ if (result == base::File::FILE_OK)
+ is_directory_ = file_info.is_directory;
+
+ content::BrowserThread::PostTask(
mtomasz 2014/10/14 06:08:50 IO -> UI?
hirono 2014/10/14 09:22:10 Thank you for catching it. Done.
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&FileSystemRetainEntryFunction::RetainFileEntry,
+ this,
+ result == base::File::FILE_OK ? entry_id : ""));
}
bool FileSystemIsRestorableFunction::RunSync() {

Powered by Google App Engine
This is Rietveld 408576698