diff options
author | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-28 08:56:14 +0000 |
---|---|---|
committer | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-28 08:56:14 +0000 |
commit | 4d28164be0247d020e8290440d682787a82eaba3 (patch) | |
tree | f6a33c3860cfe5e7583d640921c5e424495bd1b7 | |
parent | 82d74151175944904dde63e23291ae09cbb9dab3 (diff) | |
download | chromium_src-4d28164be0247d020e8290440d682787a82eaba3.zip chromium_src-4d28164be0247d020e8290440d682787a82eaba3.tar.gz chromium_src-4d28164be0247d020e8290440d682787a82eaba3.tar.bz2 |
Temporarily disable IsolatedStorage special handling
Hitting CHECK on production build, need more investigation.
BUG=264429
TEST=ObfuscatedFileUtilTest.MigrationBackFromIsolated, manual (confirmed migration)
Review URL: https://chromiumcodereview.appspot.com/20665002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214112 0039d316-1c4b-4281-b951-d872f2087c98
5 files changed, 94 insertions, 18 deletions
diff --git a/webkit/browser/fileapi/obfuscated_file_util.cc b/webkit/browser/fileapi/obfuscated_file_util.cc index e0e05e0..2be70a0 100644 --- a/webkit/browser/fileapi/obfuscated_file_util.cc +++ b/webkit/browser/fileapi/obfuscated_file_util.cc @@ -993,6 +993,9 @@ int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { } void ObfuscatedFileUtil::MaybePrepopulateDatabase() { + // Always disable this for now. crbug.com/264429 + return; + base::FilePath isolated_origin_dir = file_system_directory_.Append( SandboxIsolatedOriginDatabase::kOriginDirectory); if (!base::DirectoryExists(isolated_origin_dir)) @@ -1306,16 +1309,19 @@ bool ObfuscatedFileUtil::InitOriginDatabase(bool create) { return false; } - if (!isolated_origin_.is_empty()) { - origin_database_.reset( - new SandboxIsolatedOriginDatabase( - webkit_database::GetIdentifierFromOrigin(isolated_origin_), - file_system_directory_)); - return true; - } - origin_database_.reset( new SandboxOriginDatabase(file_system_directory_)); + + base::FilePath isolated_origin_dir = file_system_directory_.Append( + SandboxIsolatedOriginDatabase::kOriginDirectory); + if (base::DirectoryExists(isolated_origin_dir) && + !isolated_origin_.is_empty()) { + SandboxIsolatedOriginDatabase::MigrateBackDatabase( + webkit_database::GetIdentifierFromOrigin(isolated_origin_), + file_system_directory_, + static_cast<SandboxOriginDatabase*>(origin_database_.get())); + } + return true; } @@ -1438,16 +1444,9 @@ bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { special_storage_policy_->HasIsolatedStorage(origin)) { if (isolated_origin_.is_empty()) isolated_origin_ = origin; - CHECK_EQ(isolated_origin_.spec(), origin.spec()) - << "multiple origins for an isolated site"; - return true; - } - // This could happen when the origin is already unloaded and - // special_storage_policy_->HasIsolatedStorage(origin) returns false - // for the same origin. - if (!isolated_origin_.is_empty()) { - CHECK_EQ(isolated_origin_.spec(), origin.spec()); - return true; + // Record isolated_origin_, but always disable for now. + // crbug.com/264429 + return false; } return false; } diff --git a/webkit/browser/fileapi/obfuscated_file_util.h b/webkit/browser/fileapi/obfuscated_file_util.h index 4c39e52..0d9750d 100644 --- a/webkit/browser/fileapi/obfuscated_file_util.h +++ b/webkit/browser/fileapi/obfuscated_file_util.h @@ -193,6 +193,8 @@ class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE ObfuscatedFileUtil DestroyDirectoryDatabase_Isolated); FRIEND_TEST_ALL_PREFIXES(ObfuscatedFileUtilTest, GetDirectoryDatabase_Isolated); + FRIEND_TEST_ALL_PREFIXES(ObfuscatedFileUtilTest, + MigrationBackFromIsolated); base::PlatformFileError GetFileInfoInternal( SandboxDirectoryDatabase* db, diff --git a/webkit/browser/fileapi/obfuscated_file_util_unittest.cc b/webkit/browser/fileapi/obfuscated_file_util_unittest.cc index ced3d71..8f44d8b 100644 --- a/webkit/browser/fileapi/obfuscated_file_util_unittest.cc +++ b/webkit/browser/fileapi/obfuscated_file_util_unittest.cc @@ -26,10 +26,12 @@ #include "webkit/browser/fileapi/obfuscated_file_util.h" #include "webkit/browser/fileapi/sandbox_directory_database.h" #include "webkit/browser/fileapi/sandbox_file_system_test_helper.h" +#include "webkit/browser/fileapi/sandbox_isolated_origin_database.h" #include "webkit/browser/fileapi/sandbox_origin_database.h" #include "webkit/browser/fileapi/test_file_set.h" #include "webkit/browser/quota/mock_special_storage_policy.h" #include "webkit/browser/quota/quota_manager.h" +#include "webkit/common/database/database_identifier.h" #include "webkit/common/quota/quota_types.h" namespace fileapi { @@ -2327,4 +2329,48 @@ TEST_F(ObfuscatedFileUtilTest, GetDirectoryDatabase_Isolated) { ASSERT_EQ(db, db2); } +TEST_F(ObfuscatedFileUtilTest, MigrationBackFromIsolated) { + std::string kFakeDirectoryData("0123456789"); + base::FilePath old_directory_db_path; + + // Initialize the directory with one origin using + // SandboxIsolatedOriginDatabase. + { + std::string origin_string = + webkit_database::GetIdentifierFromOrigin(origin_); + SandboxIsolatedOriginDatabase database_old(origin_string, data_dir_path()); + base::FilePath path; + EXPECT_TRUE(database_old.GetPathForOrigin(origin_string, &path)); + EXPECT_FALSE(path.empty()); + + // Populate the origin directory with some fake data. + old_directory_db_path = data_dir_path().Append(path); + ASSERT_TRUE(file_util::CreateDirectory(old_directory_db_path)); + EXPECT_EQ(static_cast<int>(kFakeDirectoryData.size()), + file_util::WriteFile(old_directory_db_path.AppendASCII("dummy"), + kFakeDirectoryData.data(), + kFakeDirectoryData.size())); + } + + storage_policy_->AddIsolated(origin_); + ObfuscatedFileUtil file_util( + storage_policy_.get(), data_dir_path(), + base::MessageLoopProxy::current().get()); + base::PlatformFileError error = base::PLATFORM_FILE_ERROR_FAILED; + base::FilePath origin_directory = file_util.GetDirectoryForOrigin( + origin_, true /* create */, &error); + EXPECT_EQ(base::PLATFORM_FILE_OK, error); + + // The database is migrated from the old one. + EXPECT_TRUE(base::DirectoryExists(origin_directory)); + EXPECT_FALSE(base::DirectoryExists(old_directory_db_path)); + + // Check we see the same contents in the new origin directory. + std::string origin_db_data; + EXPECT_TRUE(base::PathExists(origin_directory.AppendASCII("dummy"))); + EXPECT_TRUE(file_util::ReadFileToString( + origin_directory.AppendASCII("dummy"), &origin_db_data)); + EXPECT_EQ(kFakeDirectoryData, origin_db_data); +} + } // namespace fileapi diff --git a/webkit/browser/fileapi/sandbox_isolated_origin_database.cc b/webkit/browser/fileapi/sandbox_isolated_origin_database.cc index 77b00f9..7ed4e8c 100644 --- a/webkit/browser/fileapi/sandbox_isolated_origin_database.cc +++ b/webkit/browser/fileapi/sandbox_isolated_origin_database.cc @@ -55,6 +55,28 @@ bool SandboxIsolatedOriginDatabase::ListAllOrigins( void SandboxIsolatedOriginDatabase::DropDatabase() { } +void SandboxIsolatedOriginDatabase::MigrateBackDatabase( + const std::string& origin, + const base::FilePath& file_system_directory, + SandboxOriginDatabase* database) { + base::FilePath isolated_directory = + file_system_directory.Append(kOriginDirectory); + + if (database->HasOriginPath(origin)) { + // Don't bother. + base::DeleteFile(isolated_directory, true /* recursive */); + return; + } + + base::FilePath directory_name; + if (database->GetPathForOrigin(origin, &directory_name)) { + base::FilePath origin_directory = + file_system_directory.Append(directory_name); + base::DeleteFile(origin_directory, true /* recursive */); + base::Move(isolated_directory, origin_directory); + } +} + void SandboxIsolatedOriginDatabase::MigrateDatabaseIfNeeded() { if (migration_checked_) return; diff --git a/webkit/browser/fileapi/sandbox_isolated_origin_database.h b/webkit/browser/fileapi/sandbox_isolated_origin_database.h index d262921..2505659 100644 --- a/webkit/browser/fileapi/sandbox_isolated_origin_database.h +++ b/webkit/browser/fileapi/sandbox_isolated_origin_database.h @@ -9,6 +9,8 @@ namespace fileapi { +class SandboxOriginDatabase; + class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE SandboxIsolatedOriginDatabase : public SandboxOriginDatabaseInterface { public: @@ -27,6 +29,11 @@ class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE SandboxIsolatedOriginDatabase virtual bool ListAllOrigins(std::vector<OriginRecord>* origins) OVERRIDE; virtual void DropDatabase() OVERRIDE; + static void MigrateBackDatabase( + const std::string& origin, + const base::FilePath& file_system_directory, + SandboxOriginDatabase* origin_database); + private: void MigrateDatabaseIfNeeded(); |