| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/browser/fileapi/obfuscated_file_util.h" | 5 #include "webkit/browser/fileapi/obfuscated_file_util.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 sandbox_delegate_) { | 285 sandbox_delegate_) { |
| 286 DCHECK_EQ(base::File::FILE_OK, error); | 286 DCHECK_EQ(base::File::FILE_OK, error); |
| 287 sandbox_delegate_->StickyInvalidateUsageCache(url.origin(), url.type()); | 287 sandbox_delegate_->StickyInvalidateUsageCache(url.origin(), url.type()); |
| 288 } | 288 } |
| 289 return error; | 289 return error; |
| 290 } | 290 } |
| 291 | 291 |
| 292 base::File::Error ObfuscatedFileUtil::Close( | 292 base::File::Error ObfuscatedFileUtil::Close( |
| 293 FileSystemOperationContext* context, | 293 FileSystemOperationContext* context, |
| 294 base::PlatformFile file) { | 294 base::PlatformFile file) { |
| 295 return NativeFileUtil::Close(file); | 295 base::File auto_closed(file); |
| 296 return base::File::FILE_OK; |
| 296 } | 297 } |
| 297 | 298 |
| 298 base::File::Error ObfuscatedFileUtil::EnsureFileExists( | 299 base::File::Error ObfuscatedFileUtil::EnsureFileExists( |
| 299 FileSystemOperationContext* context, | 300 FileSystemOperationContext* context, |
| 300 const FileSystemURL& url, | 301 const FileSystemURL& url, |
| 301 bool* created) { | 302 bool* created) { |
| 302 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 303 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
| 303 if (!db) | 304 if (!db) |
| 304 return base::File::FILE_ERROR_FAILED; | 305 return base::File::FILE_ERROR_FAILED; |
| 305 | 306 |
| (...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1073 DCHECK(!file_flags); | 1074 DCHECK(!file_flags); |
| 1074 DCHECK(!handle); | 1075 DCHECK(!handle); |
| 1075 error = NativeFileUtil::CopyOrMoveFile( | 1076 error = NativeFileUtil::CopyOrMoveFile( |
| 1076 src_file_path, dest_local_path, | 1077 src_file_path, dest_local_path, |
| 1077 FileSystemOperation::OPTION_NONE, | 1078 FileSystemOperation::OPTION_NONE, |
| 1078 fileapi::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, | 1079 fileapi::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, |
| 1079 true /* copy */)); | 1080 true /* copy */)); |
| 1080 created = true; | 1081 created = true; |
| 1081 } else { | 1082 } else { |
| 1082 if (base::PathExists(dest_local_path)) { | 1083 if (base::PathExists(dest_local_path)) { |
| 1083 if (!base::DeleteFile(dest_local_path, true /* recursive */)) { | 1084 if (!base::DeleteFile(dest_local_path, true /* recursive */)) |
| 1084 NOTREACHED(); | |
| 1085 return base::File::FILE_ERROR_FAILED; | 1085 return base::File::FILE_ERROR_FAILED; |
| 1086 } | |
| 1087 LOG(WARNING) << "A stray file detected"; | 1086 LOG(WARNING) << "A stray file detected"; |
| 1088 InvalidateUsageCache(context, dest_url.origin(), dest_url.type()); | 1087 InvalidateUsageCache(context, dest_url.origin(), dest_url.type()); |
| 1089 } | 1088 } |
| 1090 | 1089 |
| 1091 if (handle) { | 1090 if (handle) { |
| 1092 error = NativeFileUtil::CreateOrOpen( | 1091 // TODO(rvargas): Remove PlatformFile from this code. |
| 1093 dest_local_path, file_flags, handle, &created); | 1092 base::File file = |
| 1093 NativeFileUtil::CreateOrOpen(dest_local_path, file_flags); |
| 1094 if (file.IsValid()) { |
| 1095 created = file.created(); |
| 1096 *handle = file.TakePlatformFile(); |
| 1097 error = base::File::FILE_OK; |
| 1098 } else { |
| 1099 error = file.error_details(); |
| 1100 } |
| 1094 // If this succeeds, we must close handle on any subsequent error. | 1101 // If this succeeds, we must close handle on any subsequent error. |
| 1095 } else { | 1102 } else { |
| 1096 DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. | 1103 DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. |
| 1097 error = NativeFileUtil::EnsureFileExists(dest_local_path, &created); | 1104 error = NativeFileUtil::EnsureFileExists(dest_local_path, &created); |
| 1098 } | 1105 } |
| 1099 } | 1106 } |
| 1100 if (error != base::File::FILE_OK) | 1107 if (error != base::File::FILE_OK) |
| 1101 return error; | 1108 return error; |
| 1102 | 1109 |
| 1103 if (!created) { | 1110 if (!created) { |
| 1104 NOTREACHED(); | |
| 1105 if (handle) { | 1111 if (handle) { |
| 1106 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); | 1112 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); |
| 1107 base::ClosePlatformFile(*handle); | 1113 base::ClosePlatformFile(*handle); |
| 1108 base::DeleteFile(dest_local_path, false /* recursive */); | 1114 base::DeleteFile(dest_local_path, false /* recursive */); |
| 1109 *handle = base::kInvalidPlatformFileValue; | 1115 *handle = base::kInvalidPlatformFileValue; |
| 1110 } | 1116 } |
| 1111 return base::File::FILE_ERROR_FAILED; | 1117 return base::File::FILE_ERROR_FAILED; |
| 1112 } | 1118 } |
| 1113 | 1119 |
| 1114 // This removes the root, including the trailing slash, leaving a relative | 1120 // This removes the root, including the trailing slash, leaving a relative |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 return base::File::FILE_ERROR_NOT_A_FILE; | 1395 return base::File::FILE_ERROR_NOT_A_FILE; |
| 1390 | 1396 |
| 1391 int64 delta = 0; | 1397 int64 delta = 0; |
| 1392 if (file_flags & (base::PLATFORM_FILE_CREATE_ALWAYS | | 1398 if (file_flags & (base::PLATFORM_FILE_CREATE_ALWAYS | |
| 1393 base::PLATFORM_FILE_OPEN_TRUNCATED)) { | 1399 base::PLATFORM_FILE_OPEN_TRUNCATED)) { |
| 1394 // The file exists and we're truncating. | 1400 // The file exists and we're truncating. |
| 1395 delta = -platform_file_info.size; | 1401 delta = -platform_file_info.size; |
| 1396 AllocateQuota(context, delta); | 1402 AllocateQuota(context, delta); |
| 1397 } | 1403 } |
| 1398 | 1404 |
| 1399 error = NativeFileUtil::CreateOrOpen( | 1405 // TODO(rvargas): make FileSystemFileUtil use base::File. |
| 1400 local_path, file_flags, file_handle, created); | 1406 base::File file = NativeFileUtil::CreateOrOpen(local_path, file_flags); |
| 1401 if (error == base::File::FILE_ERROR_NOT_FOUND) { | 1407 if (!file.IsValid()) { |
| 1402 // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. | 1408 error = file.error_details(); |
| 1403 // TODO(tzik): Delete database entry after ensuring the file lost. | 1409 if (error == base::File::FILE_ERROR_NOT_FOUND) { |
| 1404 InvalidateUsageCache(context, url.origin(), url.type()); | 1410 // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. |
| 1405 LOG(WARNING) << "Lost a backing file."; | 1411 // TODO(tzik): Delete database entry after ensuring the file lost. |
| 1406 error = base::File::FILE_ERROR_FAILED; | 1412 InvalidateUsageCache(context, url.origin(), url.type()); |
| 1413 LOG(WARNING) << "Lost a backing file."; |
| 1414 error = base::File::FILE_ERROR_FAILED; |
| 1415 } |
| 1416 return error; |
| 1407 } | 1417 } |
| 1408 | 1418 |
| 1419 *created = file.created(); |
| 1420 *file_handle = file.TakePlatformFile(); |
| 1421 |
| 1409 // If truncating we need to update the usage. | 1422 // If truncating we need to update the usage. |
| 1410 if (error == base::File::FILE_OK && delta) { | 1423 if (delta) { |
| 1411 UpdateUsage(context, url, delta); | 1424 UpdateUsage(context, url, delta); |
| 1412 context->change_observers()->Notify( | 1425 context->change_observers()->Notify( |
| 1413 &FileChangeObserver::OnModifyFile, MakeTuple(url)); | 1426 &FileChangeObserver::OnModifyFile, MakeTuple(url)); |
| 1414 } | 1427 } |
| 1415 return error; | 1428 return base::File::FILE_OK; |
| 1416 } | 1429 } |
| 1417 | 1430 |
| 1418 bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { | 1431 bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { |
| 1419 return special_storage_policy_.get() && | 1432 return special_storage_policy_.get() && |
| 1420 special_storage_policy_->HasIsolatedStorage(origin); | 1433 special_storage_policy_->HasIsolatedStorage(origin); |
| 1421 } | 1434 } |
| 1422 | 1435 |
| 1423 } // namespace fileapi | 1436 } // namespace fileapi |
| OLD | NEW |