| Index: webkit/browser/fileapi/obfuscated_file_util.cc
|
| diff --git a/webkit/browser/fileapi/obfuscated_file_util.cc b/webkit/browser/fileapi/obfuscated_file_util.cc
|
| index 2971fe2e90c0f2d44392668000dfd19f0039ab58..2050783499fc0d8105f49683cd1b739fbc5e474c 100644
|
| --- a/webkit/browser/fileapi/obfuscated_file_util.cc
|
| +++ b/webkit/browser/fileapi/obfuscated_file_util.cc
|
| @@ -24,7 +24,9 @@
|
| #include "webkit/browser/fileapi/file_system_operation_context.h"
|
| #include "webkit/browser/fileapi/file_system_url.h"
|
| #include "webkit/browser/fileapi/native_file_util.h"
|
| +#include "webkit/browser/fileapi/sandbox_isolated_origin_database.h"
|
| #include "webkit/browser/fileapi/sandbox_mount_point_provider.h"
|
| +#include "webkit/browser/fileapi/sandbox_origin_database.h"
|
| #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h"
|
| #include "webkit/common/fileapi/file_system_util.h"
|
| #include "webkit/quota/quota_manager.h"
|
| @@ -210,7 +212,7 @@ class ObfuscatedOriginEnumerator
|
| public:
|
| typedef SandboxOriginDatabase::OriginRecord OriginRecord;
|
| ObfuscatedOriginEnumerator(
|
| - SandboxOriginDatabase* origin_database,
|
| + SandboxOriginDatabaseInterface* origin_database,
|
| const base::FilePath& base_file_path)
|
| : base_file_path_(base_file_path) {
|
| if (origin_database)
|
| @@ -240,7 +242,8 @@ class ObfuscatedOriginEnumerator
|
| NOTREACHED();
|
| return false;
|
| }
|
| - base::FilePath path = base_file_path_.Append(current_.path).Append(type_string);
|
| + base::FilePath path =
|
| + base_file_path_.Append(current_.path).Append(type_string);
|
| return file_util::DirectoryExists(path);
|
| }
|
|
|
| @@ -251,8 +254,10 @@ class ObfuscatedOriginEnumerator
|
| };
|
|
|
| ObfuscatedFileUtil::ObfuscatedFileUtil(
|
| + quota::SpecialStoragePolicy* special_storage_policy,
|
| const base::FilePath& file_system_directory)
|
| - : file_system_directory_(file_system_directory) {
|
| + : special_storage_policy_(special_storage_policy),
|
| + file_system_directory_(file_system_directory) {
|
| }
|
|
|
| ObfuscatedFileUtil::~ObfuscatedFileUtil() {
|
| @@ -881,8 +886,8 @@ base::FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType(
|
| bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType(
|
| const GURL& origin, FileSystemType type) {
|
| base::PlatformFileError error = base::PLATFORM_FILE_OK;
|
| - base::FilePath origin_type_path = GetDirectoryForOriginAndType(origin, type, false,
|
| - &error);
|
| + base::FilePath origin_type_path = GetDirectoryForOriginAndType(
|
| + origin, type, false, &error);
|
| if (origin_type_path.empty())
|
| return true;
|
|
|
| @@ -975,7 +980,8 @@ bool ObfuscatedFileUtil::DestroyDirectoryDatabase(
|
| }
|
|
|
| PlatformFileError error = base::PLATFORM_FILE_OK;
|
| - base::FilePath path = GetDirectoryForOriginAndType(origin, type, false, &error);
|
| + base::FilePath path = GetDirectoryForOriginAndType(
|
| + origin, type, false, &error);
|
| if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
|
| return true;
|
| return SandboxDirectoryDatabase::DestroyDatabase(path);
|
| @@ -1048,8 +1054,8 @@ PlatformFileError ObfuscatedFileUtil::CreateFile(
|
| dest_origin, dest_type, true);
|
|
|
| PlatformFileError error = base::PLATFORM_FILE_OK;
|
| - base::FilePath root = GetDirectoryForOriginAndType(dest_origin, dest_type, false,
|
| - &error);
|
| + base::FilePath root = GetDirectoryForOriginAndType(
|
| + dest_origin, dest_type, false, &error);
|
| if (error != base::PLATFORM_FILE_OK)
|
| return error;
|
|
|
| @@ -1120,7 +1126,8 @@ PlatformFileError ObfuscatedFileUtil::CreateFile(
|
| base::FilePath ObfuscatedFileUtil::DataPathToLocalPath(
|
| const GURL& origin, FileSystemType type, const base::FilePath& data_path) {
|
| PlatformFileError error = base::PLATFORM_FILE_OK;
|
| - base::FilePath root = GetDirectoryForOriginAndType(origin, type, false, &error);
|
| + base::FilePath root = GetDirectoryForOriginAndType(
|
| + origin, type, false, &error);
|
| if (error != base::PLATFORM_FILE_OK)
|
| return base::FilePath();
|
| return root.Append(data_path);
|
| @@ -1147,7 +1154,8 @@ SandboxDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase(
|
| }
|
|
|
| PlatformFileError error = base::PLATFORM_FILE_OK;
|
| - base::FilePath path = GetDirectoryForOriginAndType(origin, type, create, &error);
|
| + base::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;
|
| @@ -1160,6 +1168,14 @@ SandboxDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase(
|
|
|
| base::FilePath ObfuscatedFileUtil::GetDirectoryForOrigin(
|
| const GURL& origin, bool create, base::PlatformFileError* error_code) {
|
| + if (special_storage_policy_ &&
|
| + special_storage_policy_->HasIsolatedStorage(origin)) {
|
| + CHECK(isolated_origin_.is_empty() || isolated_origin_ == origin)
|
| + << "multiple origins for an isolated site: "
|
| + << isolated_origin_.spec() << " vs " << origin.spec();
|
| + isolated_origin_ = origin;
|
| + }
|
| +
|
| if (!InitOriginDatabase(create)) {
|
| if (error_code) {
|
| *error_code = create ?
|
| @@ -1234,17 +1250,29 @@ void ObfuscatedFileUtil::DropDatabases() {
|
| }
|
|
|
| bool ObfuscatedFileUtil::InitOriginDatabase(bool create) {
|
| - if (!origin_database_) {
|
| - if (!create && !file_util::DirectoryExists(file_system_directory_))
|
| - return false;
|
| - if (!file_util::CreateDirectory(file_system_directory_)) {
|
| - LOG(WARNING) << "Failed to create FileSystem directory: " <<
|
| - file_system_directory_.value();
|
| - return false;
|
| - }
|
| + if (origin_database_)
|
| + return true;
|
| +
|
| + if (!create && !file_util::DirectoryExists(file_system_directory_))
|
| + return false;
|
| + if (!file_util::CreateDirectory(file_system_directory_)) {
|
| + LOG(WARNING) << "Failed to create FileSystem directory: " <<
|
| + file_system_directory_.value();
|
| + return false;
|
| + }
|
| +
|
| + if (!isolated_origin_.is_empty()) {
|
| + DCHECK(special_storage_policy_->HasIsolatedStorage(isolated_origin_));
|
| origin_database_.reset(
|
| - new SandboxOriginDatabase(file_system_directory_));
|
| + new SandboxIsolatedOriginDatabase(
|
| + UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(
|
| + isolated_origin_)),
|
| + file_system_directory_));
|
| + return true;
|
| }
|
| +
|
| + origin_database_.reset(
|
| + new SandboxOriginDatabase(file_system_directory_));
|
| return true;
|
| }
|
|
|
| @@ -1260,8 +1288,8 @@ PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath(
|
| return base::PLATFORM_FILE_ERROR_FAILED;
|
|
|
| PlatformFileError error = base::PLATFORM_FILE_OK;
|
| - base::FilePath new_local_path = GetDirectoryForOriginAndType(origin, type,
|
| - false, &error);
|
| + base::FilePath new_local_path = GetDirectoryForOriginAndType(
|
| + origin, type, false, &error);
|
| if (error != base::PLATFORM_FILE_OK)
|
| return base::PLATFORM_FILE_ERROR_FAILED;
|
|
|
|
|