Index: webkit/fileapi/obfuscated_file_util.cc |
diff --git a/webkit/fileapi/obfuscated_file_util.cc b/webkit/fileapi/obfuscated_file_util.cc |
index 4b3ac347b4602fed578feecbf4013cf9111db030..79ef2bb1e050ffa87a35386263eb318447117231 100644 |
--- a/webkit/fileapi/obfuscated_file_util.cc |
+++ b/webkit/fileapi/obfuscated_file_util.cc |
@@ -908,45 +908,66 @@ FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType( |
return FilePath(); |
} |
FilePath path = origin_dir.Append(type_string); |
+ base::PlatformFileError error = base::PLATFORM_FILE_OK; |
if (!file_util::DirectoryExists(path) && |
(!create || !file_util::CreateDirectory(path))) { |
- if (error_code) { |
- *error_code = create ? |
+ error = create ? |
base::PLATFORM_FILE_ERROR_FAILED : |
base::PLATFORM_FILE_ERROR_NOT_FOUND; |
- } |
- return FilePath(); |
} |
if (error_code) |
- *error_code = base::PLATFORM_FILE_OK; |
+ *error_code = error; |
return path; |
} |
bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType( |
const GURL& origin, FileSystemType type) { |
- FilePath origin_type_path = GetDirectoryForOriginAndType(origin, type, false); |
- if (!file_util::PathExists(origin_type_path)) |
+ base::PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath origin_type_path = GetDirectoryForOriginAndType(origin, type, false, |
+ &error); |
+ if (origin_type_path.empty()) |
return true; |
- // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. |
- // We ignore its error now since 1) it doesn't matter the final result, and |
- // 2) it always returns false in Windows because of LevelDB's implementation. |
- // Information about failure would be useful for debugging. |
- DestroyDirectoryDatabase(origin, type); |
- if (!file_util::Delete(origin_type_path, true /* recursive */)) |
- return false; |
+ if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND) { |
+ // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. |
+ // We ignore its error now since 1) it doesn't matter the final result, and |
+ // 2) it always returns false in Windows because of LevelDB's |
+ // implementation. |
+ // Information about failure would be useful for debugging. |
+ DestroyDirectoryDatabase(origin, type); |
+ if (!file_util::Delete(origin_type_path, true /* recursive */)) |
+ return false; |
+ } |
FilePath origin_path = origin_type_path.DirName(); |
DCHECK_EQ(origin_path.value(), |
GetDirectoryForOrigin(origin, false, NULL).value()); |
// Delete the origin directory if the deleted one was the last remaining |
- // type for the origin. |
- if (file_util::Delete(origin_path, false /* recursive */)) { |
+ // type for the origin, i.e. if the *other* type doesn't exist. |
+ FileSystemType other_type = kFileSystemTypeUnknown; |
+ switch (type) { |
+ case kFileSystemTypeTemporary: |
+ other_type = kFileSystemTypePersistent; |
+ break; |
+ case kFileSystemTypePersistent: |
+ other_type = kFileSystemTypeTemporary; |
+ break; |
+ // These types shouldn't be used. |
+ case kFileSystemTypeUnknown: |
+ case kFileSystemTypeIsolated: |
+ case kFileSystemTypeExternal: |
+ case kFileSystemTypeTest: |
+ NOTREACHED(); |
+ } |
+ if (!file_util::DirectoryExists( |
+ origin_path.Append(GetDirectoryNameForType(other_type)))) { |
InitOriginDatabase(false); |
if (origin_database_.get()) |
origin_database_->RemovePathForOrigin(GetOriginIdentifierFromURL(origin)); |
+ if (!file_util::Delete(origin_path, true /* recursive */)) |
+ return false; |
} |
// At this point we are sure we had successfully deleted the origin/type |
@@ -958,8 +979,10 @@ bool ObfuscatedFileUtil::MigrateFromOldSandbox( |
const GURL& origin_url, FileSystemType type, const FilePath& src_root) { |
if (!DestroyDirectoryDatabase(origin_url, type)) |
return false; |
- FilePath dest_root = GetDirectoryForOriginAndType(origin_url, type, true); |
- if (dest_root.empty()) |
+ base::PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath dest_root = GetDirectoryForOriginAndType(origin_url, type, true, |
+ &error); |
+ if (error != base::PLATFORM_FILE_OK) |
return false; |
FileSystemDirectoryDatabase* db = GetDirectoryDatabase( |
origin_url, type, true); |
@@ -1063,10 +1086,9 @@ bool ObfuscatedFileUtil::DestroyDirectoryDatabase( |
delete database; |
} |
- FilePath path = GetDirectoryForOriginAndType(origin, type, false); |
- if (path.empty()) |
- return true; |
- if (!file_util::DirectoryExists(path)) |
+ PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath path = GetDirectoryForOriginAndType(origin, type, false, &error); |
+ if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND) |
return true; |
return FileSystemDirectoryDatabase::DestroyDatabase(path); |
} |
@@ -1137,13 +1159,15 @@ PlatformFileError ObfuscatedFileUtil::CreateFile( |
FileSystemDirectoryDatabase* db = GetDirectoryDatabase( |
dest_origin, dest_type, true); |
- FilePath root = GetDirectoryForOriginAndType(dest_origin, dest_type, false); |
- if (root.empty()) |
- return base::PLATFORM_FILE_ERROR_FAILED; |
+ PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath root = GetDirectoryForOriginAndType(dest_origin, dest_type, false, |
+ &error); |
+ if (error != base::PLATFORM_FILE_OK) |
+ return error; |
FilePath dest_local_path; |
- PlatformFileError error = GenerateNewLocalPath( |
- db, context, dest_origin, dest_type, &dest_local_path); |
+ error = GenerateNewLocalPath(db, context, dest_origin, dest_type, |
+ &dest_local_path); |
if (error != base::PLATFORM_FILE_OK) |
return error; |
@@ -1207,9 +1231,10 @@ PlatformFileError ObfuscatedFileUtil::CreateFile( |
FilePath ObfuscatedFileUtil::DataPathToLocalPath( |
const GURL& origin, FileSystemType type, const FilePath& data_path) { |
- FilePath root = GetDirectoryForOriginAndType(origin, type, false); |
- if (root.empty()) |
- return root; |
+ PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath root = GetDirectoryForOriginAndType(origin, type, false, &error); |
+ if (error != base::PLATFORM_FILE_OK) |
+ return FilePath(); |
return root.Append(data_path); |
} |
@@ -1230,14 +1255,11 @@ FileSystemDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase( |
return iter->second; |
} |
- FilePath path = GetDirectoryForOriginAndType(origin, type, create); |
- if (path.empty()) |
+ PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath path = GetDirectoryForOriginAndType(origin, type, create, &error); |
+ if (error != base::PLATFORM_FILE_OK) { |
+ LOG(WARNING) << "Failed to get origin+type directory: " << path.value(); |
return NULL; |
- if (!file_util::DirectoryExists(path)) { |
- if (!file_util::CreateDirectory(path)) { |
- LOG(WARNING) << "Failed to origin+type directory: " << path.value(); |
- return NULL; |
- } |
} |
MarkUsed(); |
FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path); |
@@ -1346,16 +1368,18 @@ PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath( |
if (!db || !db->GetNextInteger(&number)) |
return base::PLATFORM_FILE_ERROR_FAILED; |
- // We use the third- and fourth-to-last digits as the directory. |
- int64 directory_number = number % 10000 / 100; |
- FilePath new_local_path = GetDirectoryForOriginAndType(origin, type, false); |
- if (new_local_path.empty()) |
+ PlatformFileError error = base::PLATFORM_FILE_OK; |
+ FilePath new_local_path = GetDirectoryForOriginAndType(origin, type, false, |
+ &error); |
+ if (error != base::PLATFORM_FILE_OK) |
return base::PLATFORM_FILE_ERROR_FAILED; |
+ // We use the third- and fourth-to-last digits as the directory. |
+ int64 directory_number = number % 10000 / 100; |
new_local_path = new_local_path.AppendASCII( |
StringPrintf("%02" PRId64, directory_number)); |
- PlatformFileError error = NativeFileUtil::CreateDirectory( |
+ error = NativeFileUtil::CreateDirectory( |
new_local_path, false /* exclusive */, false /* recursive */); |
if (error != base::PLATFORM_FILE_OK) |
return error; |