Chromium Code Reviews| 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..da8afab26fbb09c88ca72b5bae5399269c9e3bb2 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; |
|
kinuko
2012/07/09 11:47:50
I'm afraid some of the callsites of this method re
Bernhard Bauer
2012/07/09 15:20:28
Good point. Would you prefer updating all callsite
|
| 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)))) { |
|
kinuko
2012/07/09 07:23:33
Could we instead check if the type directory is th
Bernhard Bauer
2012/07/09 09:03:29
Hmm, I think there can also be garbage directories
kinuko
2012/07/09 11:47:50
Ok...
|
| 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 |