Index: webkit/fileapi/obfuscated_file_system_file_util.cc |
diff --git a/webkit/fileapi/obfuscated_file_system_file_util.cc b/webkit/fileapi/obfuscated_file_system_file_util.cc |
index ee284e2b3d8bca34c006c3548260e4dd70552927..3a7f2b38d25fa51f87f629e7e9082dfa0948b2a4 100644 |
--- a/webkit/fileapi/obfuscated_file_system_file_util.cc |
+++ b/webkit/fileapi/obfuscated_file_system_file_util.cc |
@@ -155,10 +155,20 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen( |
} |
if (file_info.is_directory()) |
return base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
- FilePath data_path = DataPathToLocalPath(context->src_origin_url(), |
+ FilePath local_path = DataPathToLocalPath(context->src_origin_url(), |
context->src_type(), file_info.data_path); |
- return underlying_file_util_->CreateOrOpen( |
- context, data_path, file_flags, file_handle, created); |
+ base::PlatformFileError error = underlying_file_util_->CreateOrOpen( |
+ context, local_path, file_flags, file_handle, created); |
+ if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { |
+ // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. |
+ // TODO(tzik): Delete database entry after ensuring the file lost. |
+ context->file_system_context()->GetQuotaUtil(context->src_type())-> |
+ InvalidateUsageCache(context->src_origin_url(), |
+ context->src_type()); |
+ LOG(WARNING) << "Lost a backing file."; |
+ error = base::PLATFORM_FILE_ERROR_FAILED; |
+ } |
+ return error; |
} |
PlatformFileError ObfuscatedFileSystemFileUtil::EnsureFileExists( |
@@ -385,6 +395,15 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile( |
if (copy) { |
FilePath src_data_path = DataPathToLocalPath(context->src_origin_url(), |
context->src_type(), src_file_info.data_path); |
+ if (!underlying_file_util_->PathExists(context, src_data_path)) { |
+ // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. |
+ context->file_system_context()->GetQuotaUtil(context->src_type())-> |
+ InvalidateUsageCache(context->src_origin_url(), |
+ context->src_type()); |
+ LOG(WARNING) << "Lost a backing file."; |
+ return base::PLATFORM_FILE_ERROR_FAILED; |
+ } |
+ |
if (overwrite) { |
FilePath dest_data_path = DataPathToLocalPath(context->src_origin_url(), |
context->src_type(), dest_file_info.data_path); |
@@ -824,19 +843,22 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
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 path = |
+ // TODO(ericu): local_path is an OS path; underlying_file_util_ isn't |
+ // guaranteed to understand OS paths. |
+ FilePath local_path = |
GetDirectoryForOriginAndType(origin_url, type, false); |
- if (path.empty()) |
+ if (local_path.empty()) |
return base::PLATFORM_FILE_ERROR_FAILED; |
- path = path.AppendASCII(StringPrintf("%02" PRIu64, directory_number)); |
+ local_path = local_path.AppendASCII(StringPrintf("%02" PRIu64, |
+ directory_number)); |
PlatformFileError error; |
error = underlying_file_util_->CreateDirectory( |
- context, path, false /* exclusive */, false /* recursive */); |
+ context, local_path, false /* exclusive */, false /* recursive */); |
if (base::PLATFORM_FILE_OK != error) |
return error; |
- path = path.AppendASCII(StringPrintf("%08" PRIu64, number)); |
- FilePath data_path = LocalPathToDataPath(origin_url, type, path); |
+ local_path = local_path.AppendASCII(StringPrintf("%08" PRIu64, number)); |
+ FilePath data_path = LocalPathToDataPath(origin_url, type, local_path); |
if (data_path.empty()) |
return base::PLATFORM_FILE_ERROR_FAILED; |
bool created = false; |
@@ -844,17 +866,29 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
DCHECK(!file_flags); |
DCHECK(!handle); |
error = underlying_file_util_->CopyOrMoveFile( |
- context, source_path, path, true /* copy */); |
+ context, source_path, local_path, true /* copy */); |
created = true; |
} else { |
+ FilePath path; |
+ underlying_file_util_->GetLocalFilePath(context, local_path, &path); |
+ if (file_util::PathExists(path)) { |
+ if (!file_util::Delete(path, true)) { |
+ NOTREACHED(); |
+ return base::PLATFORM_FILE_ERROR_FAILED; |
+ } |
+ LOG(WARNING) << "A stray file detected"; |
+ context->file_system_context()->GetQuotaUtil(context->src_type())-> |
+ InvalidateUsageCache(context->src_origin_url(), context->src_type()); |
+ } |
+ |
if (handle) { |
error = underlying_file_util_->CreateOrOpen( |
- context, path, file_flags, handle, &created); |
+ context, local_path, file_flags, handle, &created); |
// If this succeeds, we must close handle on any subsequent error. |
} else { |
DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. |
error = underlying_file_util_->EnsureFileExists( |
- context, path, &created); |
+ context, local_path, &created); |
} |
} |
if (error != base::PLATFORM_FILE_OK) |
@@ -865,7 +899,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
if (handle) { |
DCHECK_NE(base::kInvalidPlatformFileValue, *handle); |
base::ClosePlatformFile(*handle); |
- underlying_file_util_->DeleteFile(context, path); |
+ underlying_file_util_->DeleteFile(context, local_path); |
} |
return base::PLATFORM_FILE_ERROR_FAILED; |
} |
@@ -876,7 +910,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
DCHECK_NE(base::kInvalidPlatformFileValue, *handle); |
base::ClosePlatformFile(*handle); |
} |
- underlying_file_util_->DeleteFile(context, path); |
+ underlying_file_util_->DeleteFile(context, local_path); |
return base::PLATFORM_FILE_ERROR_FAILED; |
} |
UpdatePathQuotaUsage(context, origin_url, type, 1, file_info->name.size()); |
@@ -1093,14 +1127,26 @@ FilePath ObfuscatedFileSystemFileUtil::GetDirectoryForOrigin( |
return FilePath(); |
FilePath directory_name; |
std::string id = GetOriginIdentifierFromURL(origin); |
- if (!create && !origin_database_->HasOriginPath(id)) |
+ |
+ bool exists_in_db = origin_database_->HasOriginPath(id); |
+ if (!exists_in_db && !create) |
return FilePath(); |
if (!origin_database_->GetPathForOrigin(id, &directory_name)) |
return FilePath(); |
+ |
FilePath path = file_system_directory_.Append(directory_name); |
- if (!file_util::DirectoryExists(path) && |
- (!create || !file_util::CreateDirectory(path))) |
- return FilePath(); |
+ bool exists_in_fs = file_util::DirectoryExists(path); |
+ if (!exists_in_db && exists_in_fs) { |
+ if (!file_util::Delete(path, true)) |
+ return FilePath(); |
+ exists_in_fs = false; |
+ } |
+ |
+ if (!exists_in_fs) { |
+ if (!create || !file_util::CreateDirectory(path)) |
+ return FilePath(); |
+ } |
+ |
return path; |
} |