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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 if (current_.path.empty()) | 237 if (current_.path.empty()) |
238 return false; | 238 return false; |
239 base::FilePath::StringType type_string = | 239 base::FilePath::StringType type_string = |
240 ObfuscatedFileUtil::GetDirectoryNameForType(type); | 240 ObfuscatedFileUtil::GetDirectoryNameForType(type); |
241 if (type_string.empty()) { | 241 if (type_string.empty()) { |
242 NOTREACHED(); | 242 NOTREACHED(); |
243 return false; | 243 return false; |
244 } | 244 } |
245 base::FilePath path = | 245 base::FilePath path = |
246 base_file_path_.Append(current_.path).Append(type_string); | 246 base_file_path_.Append(current_.path).Append(type_string); |
247 return file_util::DirectoryExists(path); | 247 return base::DirectoryExists(path); |
248 } | 248 } |
249 | 249 |
250 private: | 250 private: |
251 std::vector<OriginRecord> origins_; | 251 std::vector<OriginRecord> origins_; |
252 OriginRecord current_; | 252 OriginRecord current_; |
253 base::FilePath base_file_path_; | 253 base::FilePath base_file_path_; |
254 }; | 254 }; |
255 | 255 |
256 ObfuscatedFileUtil::ObfuscatedFileUtil( | 256 ObfuscatedFileUtil::ObfuscatedFileUtil( |
257 quota::SpecialStoragePolicy* special_storage_policy, | 257 quota::SpecialStoragePolicy* special_storage_policy, |
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 base::FilePath::StringType type_string = GetDirectoryNameForType(type); | 867 base::FilePath::StringType type_string = GetDirectoryNameForType(type); |
868 if (type_string.empty()) { | 868 if (type_string.empty()) { |
869 LOG(WARNING) << "Unknown filesystem type requested:" << type; | 869 LOG(WARNING) << "Unknown filesystem type requested:" << type; |
870 | 870 |
871 if (error_code) | 871 if (error_code) |
872 *error_code = base::PLATFORM_FILE_ERROR_INVALID_URL; | 872 *error_code = base::PLATFORM_FILE_ERROR_INVALID_URL; |
873 return base::FilePath(); | 873 return base::FilePath(); |
874 } | 874 } |
875 base::FilePath path = origin_dir.Append(type_string); | 875 base::FilePath path = origin_dir.Append(type_string); |
876 base::PlatformFileError error = base::PLATFORM_FILE_OK; | 876 base::PlatformFileError error = base::PLATFORM_FILE_OK; |
877 if (!file_util::DirectoryExists(path) && | 877 if (!base::DirectoryExists(path) && |
878 (!create || !file_util::CreateDirectory(path))) { | 878 (!create || !file_util::CreateDirectory(path))) { |
879 error = create ? | 879 error = create ? |
880 base::PLATFORM_FILE_ERROR_FAILED : | 880 base::PLATFORM_FILE_ERROR_FAILED : |
881 base::PLATFORM_FILE_ERROR_NOT_FOUND; | 881 base::PLATFORM_FILE_ERROR_NOT_FOUND; |
882 } | 882 } |
883 | 883 |
884 if (error_code) | 884 if (error_code) |
885 *error_code = error; | 885 *error_code = error; |
886 return path; | 886 return path; |
887 } | 887 } |
(...skipping 27 matching lines...) Expand all Loading... |
915 std::vector<FileSystemType> other_types; | 915 std::vector<FileSystemType> other_types; |
916 if (type != kFileSystemTypeTemporary) | 916 if (type != kFileSystemTypeTemporary) |
917 other_types.push_back(kFileSystemTypeTemporary); | 917 other_types.push_back(kFileSystemTypeTemporary); |
918 if (type != kFileSystemTypePersistent) | 918 if (type != kFileSystemTypePersistent) |
919 other_types.push_back(kFileSystemTypePersistent); | 919 other_types.push_back(kFileSystemTypePersistent); |
920 if (type != kFileSystemTypeSyncable) | 920 if (type != kFileSystemTypeSyncable) |
921 other_types.push_back(kFileSystemTypeSyncable); | 921 other_types.push_back(kFileSystemTypeSyncable); |
922 DCHECK(type != kFileSystemTypeSyncableForInternalSync); | 922 DCHECK(type != kFileSystemTypeSyncableForInternalSync); |
923 | 923 |
924 for (size_t i = 0; i < other_types.size(); ++i) { | 924 for (size_t i = 0; i < other_types.size(); ++i) { |
925 if (file_util::DirectoryExists( | 925 if (base::DirectoryExists( |
926 origin_path.Append(GetDirectoryNameForType(other_types[i])))) { | 926 origin_path.Append(GetDirectoryNameForType(other_types[i])))) { |
927 // Other type's directory exists; just return true here. | 927 // Other type's directory exists; just return true here. |
928 return true; | 928 return true; |
929 } | 929 } |
930 } | 930 } |
931 | 931 |
932 // No other directories seem exist. Try deleting the entire origin directory. | 932 // No other directories seem exist. Try deleting the entire origin directory. |
933 InitOriginDatabase(false); | 933 InitOriginDatabase(false); |
934 if (origin_database_) { | 934 if (origin_database_) { |
935 origin_database_->RemovePathForOrigin( | 935 origin_database_->RemovePathForOrigin( |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 } | 988 } |
989 | 989 |
990 // static | 990 // static |
991 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { | 991 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { |
992 return UsageForPath(VirtualPath::BaseName(path).value().size()); | 992 return UsageForPath(VirtualPath::BaseName(path).value().size()); |
993 } | 993 } |
994 | 994 |
995 void ObfuscatedFileUtil::MaybePrepopulateDatabase() { | 995 void ObfuscatedFileUtil::MaybePrepopulateDatabase() { |
996 base::FilePath isolated_origin_dir = file_system_directory_.Append( | 996 base::FilePath isolated_origin_dir = file_system_directory_.Append( |
997 SandboxIsolatedOriginDatabase::kOriginDirectory); | 997 SandboxIsolatedOriginDatabase::kOriginDirectory); |
998 if (!file_util::DirectoryExists(isolated_origin_dir)) | 998 if (!base::DirectoryExists(isolated_origin_dir)) |
999 return; | 999 return; |
1000 | 1000 |
1001 const FileSystemType kPrepopulateTypes[] = { | 1001 const FileSystemType kPrepopulateTypes[] = { |
1002 kFileSystemTypePersistent, kFileSystemTypeTemporary | 1002 kFileSystemTypePersistent, kFileSystemTypeTemporary |
1003 }; | 1003 }; |
1004 | 1004 |
1005 // Prepulate the directory database(s) if and only if this instance is | 1005 // Prepulate the directory database(s) if and only if this instance is |
1006 // initialized for isolated storage dedicated for a single origin. | 1006 // initialized for isolated storage dedicated for a single origin. |
1007 for (size_t i = 0; i < arraysize(kPrepopulateTypes); ++i) { | 1007 for (size_t i = 0; i < arraysize(kPrepopulateTypes); ++i) { |
1008 const FileSystemType type = kPrepopulateTypes[i]; | 1008 const FileSystemType type = kPrepopulateTypes[i]; |
1009 base::FilePath::StringType type_string = GetDirectoryNameForType(type); | 1009 base::FilePath::StringType type_string = GetDirectoryNameForType(type); |
1010 DCHECK(!type_string.empty()); | 1010 DCHECK(!type_string.empty()); |
1011 base::FilePath path = isolated_origin_dir.Append(type_string); | 1011 base::FilePath path = isolated_origin_dir.Append(type_string); |
1012 if (!file_util::DirectoryExists(path)) | 1012 if (!base::DirectoryExists(path)) |
1013 continue; | 1013 continue; |
1014 scoped_ptr<SandboxDirectoryDatabase> db(new SandboxDirectoryDatabase(path)); | 1014 scoped_ptr<SandboxDirectoryDatabase> db(new SandboxDirectoryDatabase(path)); |
1015 if (db->Init(SandboxDirectoryDatabase::FAIL_ON_CORRUPTION)) { | 1015 if (db->Init(SandboxDirectoryDatabase::FAIL_ON_CORRUPTION)) { |
1016 directories_[GetFileSystemTypeString(type)] = db.release(); | 1016 directories_[GetFileSystemTypeString(type)] = db.release(); |
1017 MarkUsed(); | 1017 MarkUsed(); |
1018 // Don't populate more than one database, as it may rather hurt | 1018 // Don't populate more than one database, as it may rather hurt |
1019 // performance. | 1019 // performance. |
1020 break; | 1020 break; |
1021 } | 1021 } |
1022 } | 1022 } |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1231 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1231 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND; |
1232 return base::FilePath(); | 1232 return base::FilePath(); |
1233 } | 1233 } |
1234 if (!origin_database_->GetPathForOrigin(id, &directory_name)) { | 1234 if (!origin_database_->GetPathForOrigin(id, &directory_name)) { |
1235 if (error_code) | 1235 if (error_code) |
1236 *error_code = base::PLATFORM_FILE_ERROR_FAILED; | 1236 *error_code = base::PLATFORM_FILE_ERROR_FAILED; |
1237 return base::FilePath(); | 1237 return base::FilePath(); |
1238 } | 1238 } |
1239 | 1239 |
1240 base::FilePath path = file_system_directory_.Append(directory_name); | 1240 base::FilePath path = file_system_directory_.Append(directory_name); |
1241 bool exists_in_fs = file_util::DirectoryExists(path); | 1241 bool exists_in_fs = base::DirectoryExists(path); |
1242 if (!exists_in_db && exists_in_fs) { | 1242 if (!exists_in_db && exists_in_fs) { |
1243 if (!base::Delete(path, true)) { | 1243 if (!base::Delete(path, true)) { |
1244 if (error_code) | 1244 if (error_code) |
1245 *error_code = base::PLATFORM_FILE_ERROR_FAILED; | 1245 *error_code = base::PLATFORM_FILE_ERROR_FAILED; |
1246 return base::FilePath(); | 1246 return base::FilePath(); |
1247 } | 1247 } |
1248 exists_in_fs = false; | 1248 exists_in_fs = false; |
1249 } | 1249 } |
1250 | 1250 |
1251 if (!exists_in_fs) { | 1251 if (!exists_in_fs) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 STLDeleteContainerPairSecondPointers( | 1291 STLDeleteContainerPairSecondPointers( |
1292 directories_.begin(), directories_.end()); | 1292 directories_.begin(), directories_.end()); |
1293 directories_.clear(); | 1293 directories_.clear(); |
1294 timer_.reset(); | 1294 timer_.reset(); |
1295 } | 1295 } |
1296 | 1296 |
1297 bool ObfuscatedFileUtil::InitOriginDatabase(bool create) { | 1297 bool ObfuscatedFileUtil::InitOriginDatabase(bool create) { |
1298 if (origin_database_) | 1298 if (origin_database_) |
1299 return true; | 1299 return true; |
1300 | 1300 |
1301 if (!create && !file_util::DirectoryExists(file_system_directory_)) | 1301 if (!create && !base::DirectoryExists(file_system_directory_)) |
1302 return false; | 1302 return false; |
1303 if (!file_util::CreateDirectory(file_system_directory_)) { | 1303 if (!file_util::CreateDirectory(file_system_directory_)) { |
1304 LOG(WARNING) << "Failed to create FileSystem directory: " << | 1304 LOG(WARNING) << "Failed to create FileSystem directory: " << |
1305 file_system_directory_.value(); | 1305 file_system_directory_.value(); |
1306 return false; | 1306 return false; |
1307 } | 1307 } |
1308 | 1308 |
1309 if (!isolated_origin_.is_empty()) { | 1309 if (!isolated_origin_.is_empty()) { |
1310 origin_database_.reset( | 1310 origin_database_.reset( |
1311 new SandboxIsolatedOriginDatabase( | 1311 new SandboxIsolatedOriginDatabase( |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1446 // special_storage_policy_->HasIsolatedStorage(origin) returns false | 1446 // special_storage_policy_->HasIsolatedStorage(origin) returns false |
1447 // for the same origin. | 1447 // for the same origin. |
1448 if (!isolated_origin_.is_empty()) { | 1448 if (!isolated_origin_.is_empty()) { |
1449 CHECK_EQ(isolated_origin_.spec(), origin.spec()); | 1449 CHECK_EQ(isolated_origin_.spec(), origin.spec()); |
1450 return true; | 1450 return true; |
1451 } | 1451 } |
1452 return false; | 1452 return false; |
1453 } | 1453 } |
1454 | 1454 |
1455 } // namespace fileapi | 1455 } // namespace fileapi |
OLD | NEW |