Cleanup: Move more recursive operation logic from FileUtilHelper to FileUtil
- To make each FileUtil methods more well-defined
- To further reduce the number of FileUtil calls (As a preparation to split recursive jobs into multiple tasks)
BUG=146215
TEST=content_unittests:.*File.*,content_browsertests:FileSystemLayoutTest.Op{Copy,Move}
Review URL: https://chromiumcodereview.appspot.com/11960003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178294 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/webkit/fileapi/obfuscated_file_util.cc b/webkit/fileapi/obfuscated_file_util.cc
index 09ed25c..4e743c6 100644
--- a/webkit/fileapi/obfuscated_file_util.cc
+++ b/webkit/fileapi/obfuscated_file_util.cc
@@ -572,31 +572,6 @@
return error;
}
-bool ObfuscatedFileUtil::IsDirectoryEmpty(
- FileSystemOperationContext* context,
- const FileSystemURL& url) {
- FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
- url.origin(), url.type(), false);
- if (!db)
- return true; // Not a great answer, but it's what others do.
- FileId file_id;
- if (!db->GetFileWithPath(url.path(), &file_id))
- return true; // Ditto.
- FileInfo file_info;
- if (!db->GetFileInfo(file_id, &file_info)) {
- DCHECK(!file_id);
- // It's the root directory and the database hasn't been initialized yet.
- return true;
- }
- if (!file_info.is_directory())
- return true;
- std::vector<FileId> children;
- // TODO(ericu): This could easily be made faster with help from the database.
- if (!db->ListChildren(file_id, &children))
- return true;
- return children.empty();
-}
-
PlatformFileError ObfuscatedFileUtil::CopyOrMoveFile(
FileSystemOperationContext* context,
const FileSystemURL& src_url,
@@ -628,7 +603,7 @@
if (error != base::PLATFORM_FILE_OK)
return error;
if (src_file_info.is_directory())
- return base::PLATFORM_FILE_ERROR_FAILED;
+ return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
FileInfo dest_file_info;
base::PlatformFileInfo dest_platform_file_info; // overwrite case only
@@ -642,13 +617,12 @@
else if (error != base::PLATFORM_FILE_OK)
return error;
else if (dest_file_info.is_directory())
- return base::PLATFORM_FILE_ERROR_FAILED;
+ return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
}
if (!overwrite) {
FileId dest_parent_id;
if (!db->GetFileWithPath(dest_url.path().DirName(),
&dest_parent_id)) {
- NOTREACHED(); // We shouldn't be called in this case.
return base::PLATFORM_FILE_ERROR_NOT_FOUND;
}
@@ -768,16 +742,16 @@
else if (error != base::PLATFORM_FILE_OK)
return error;
else if (dest_file_info.is_directory())
- return base::PLATFORM_FILE_ERROR_FAILED;
+ return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
}
if (!overwrite) {
FileId dest_parent_id;
if (!db->GetFileWithPath(dest_url.path().DirName(),
- &dest_parent_id) ||
- !dest_file_info.is_directory()) {
- NOTREACHED();
+ &dest_parent_id)) {
return base::PLATFORM_FILE_ERROR_NOT_FOUND;
}
+ if (!dest_file_info.is_directory())
+ return base::PLATFORM_FILE_ERROR_FAILED;
InitFileInfo(&dest_file_info, dest_parent_id,
VirtualPath::BaseName(dest_url.path()).value());
}
@@ -865,7 +839,7 @@
return base::PLATFORM_FILE_OK;
}
-PlatformFileError ObfuscatedFileUtil::DeleteSingleDirectory(
+PlatformFileError ObfuscatedFileUtil::DeleteDirectory(
FileSystemOperationContext* context,
const FileSystemURL& url) {
FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
@@ -877,10 +851,12 @@
if (!db->GetFileWithPath(url.path(), &file_id))
return base::PLATFORM_FILE_ERROR_NOT_FOUND;
FileInfo file_info;
- if (!db->GetFileInfo(file_id, &file_info) || !file_info.is_directory()) {
+ if (!db->GetFileInfo(file_id, &file_info)) {
NOTREACHED();
return base::PLATFORM_FILE_ERROR_FAILED;
}
+ if (!file_info.is_directory())
+ return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY;
if (!db->RemoveFileInfo(file_id))
return base::PLATFORM_FILE_ERROR_NOT_EMPTY;
int64 growth = -UsageForPath(file_info.name.size());
@@ -901,7 +877,36 @@
DCHECK(policy);
// We're just returning the local file information.
*policy = kSnapshotFileLocal;
- return GetFileInfo(context, url, file_info, platform_path);
+ base::PlatformFileError error = GetFileInfo(
+ context, url, file_info, platform_path);
+ if (error == base::PLATFORM_FILE_OK && file_info->is_directory)
+ return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
+ return error;
+}
+
+bool ObfuscatedFileUtil::IsDirectoryEmpty(
+ FileSystemOperationContext* context,
+ const FileSystemURL& url) {
+ FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
+ url.origin(), url.type(), false);
+ if (!db)
+ return true; // Not a great answer, but it's what others do.
+ FileId file_id;
+ if (!db->GetFileWithPath(url.path(), &file_id))
+ return true; // Ditto.
+ FileInfo file_info;
+ if (!db->GetFileInfo(file_id, &file_info)) {
+ DCHECK(!file_id);
+ // It's the root directory and the database hasn't been initialized yet.
+ return true;
+ }
+ if (!file_info.is_directory())
+ return true;
+ std::vector<FileId> children;
+ // TODO(ericu): This could easily be made faster with help from the database.
+ if (!db->ListChildren(file_id, &children))
+ return true;
+ return children.empty();
}
FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType(