diff options
author | nhiroki@chromium.org <nhiroki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-10 06:22:30 +0000 |
---|---|---|
committer | nhiroki@chromium.org <nhiroki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-10 06:22:30 +0000 |
commit | d1c73b349c996bfacc7605928b635e5635ad5581 (patch) | |
tree | 718b7e1012ef32dcfa2e6679b2c51f868038926d | |
parent | 55a66a52f970c57cf7d347ee606d564934d9e74b (diff) | |
download | chromium_src-d1c73b349c996bfacc7605928b635e5635ad5581.zip chromium_src-d1c73b349c996bfacc7605928b635e5635ad5581.tar.gz chromium_src-d1c73b349c996bfacc7605928b635e5635ad5581.tar.bz2 |
ServiceWorker: Implement a function to destroy the database
This is a preparation patch to support storage corruption recovery mechanism.
BUG=371675
TEST=content_unittests --gtest_filter=ServiceWorkerDatabaseTest.DestroyDatabase
R=jsbell@chromium.org, michaeln@chromium.org
Review URL: https://codereview.chromium.org/319653003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275972 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 31 insertions, 3 deletions
diff --git a/content/browser/service_worker/service_worker_database.cc b/content/browser/service_worker/service_worker_database.cc index f4da827..1058acc 100644 --- a/content/browser/service_worker/service_worker_database.cc +++ b/content/browser/service_worker/service_worker_database.cc @@ -720,6 +720,13 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteAllDataForOrigin( return WriteBatch(&batch); } +ServiceWorkerDatabase::Status ServiceWorkerDatabase::DestroyDatabase() { + DCHECK(sequence_checker_.CalledOnValidSequencedThread()); + Disable(FROM_HERE, STATUS_OK); + return LevelDBStatusToStatus( + leveldb::DestroyDB(path_.AsUTF8Unsafe(), leveldb::Options())); +} + ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen( bool create_if_missing) { DCHECK(sequence_checker_.CalledOnValidSequencedThread()); @@ -1064,9 +1071,11 @@ bool ServiceWorkerDatabase::IsOpen() { void ServiceWorkerDatabase::Disable( const tracked_objects::Location& from_here, Status status) { - DLOG(ERROR) << "Failed at: " << from_here.ToString() - << " with error: " << StatusToString(status); - DLOG(ERROR) << "ServiceWorkerDatabase is disabled."; + if (status != STATUS_OK) { + DLOG(ERROR) << "Failed at: " << from_here.ToString() + << " with error: " << StatusToString(status); + DLOG(ERROR) << "ServiceWorkerDatabase is disabled."; + } state_ = DISABLED; db_.reset(); } diff --git a/content/browser/service_worker/service_worker_database.h b/content/browser/service_worker/service_worker_database.h index 7b2a68d..6475de0 100644 --- a/content/browser/service_worker/service_worker_database.h +++ b/content/browser/service_worker/service_worker_database.h @@ -187,6 +187,10 @@ class CONTENT_EXPORT ServiceWorkerDatabase { const GURL& origin, std::vector<int64>* newly_purgeable_resources); + // Completely deletes the contents of the database. + // Be careful using this function. + Status DestroyDatabase(); + private: // Opens the database at the |path_|. This is lazily called when the first // database API is called. Returns OK if the database is successfully opened. @@ -310,6 +314,7 @@ class CONTENT_EXPORT ServiceWorkerDatabase { FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDatabaseTest, OpenDatabase_InMemory); FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDatabaseTest, DatabaseVersion); FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDatabaseTest, GetNextAvailableIds); + FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDatabaseTest, DestroyDatabase); DISALLOW_COPY_AND_ASSIGN(ServiceWorkerDatabase); }; diff --git a/content/browser/service_worker/service_worker_database_unittest.cc b/content/browser/service_worker/service_worker_database_unittest.cc index 0fe8c4b..baa2542 100644 --- a/content/browser/service_worker/service_worker_database_unittest.cc +++ b/content/browser/service_worker/service_worker_database_unittest.cc @@ -6,6 +6,7 @@ #include <string> +#include "base/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/stl_util.h" #include "content/browser/service_worker/service_worker_database.pb.h" @@ -887,4 +888,17 @@ TEST(ServiceWorkerDatabaseTest, DeleteAllDataForOrigin) { EXPECT_TRUE(ContainsKey(purgeable_ids_out, 4)); } +TEST(ServiceWorkerDatabaseTest, DestroyDatabase) { + base::ScopedTempDir database_dir; + ASSERT_TRUE(database_dir.CreateUniqueTempDir()); + scoped_ptr<ServiceWorkerDatabase> database( + CreateDatabase(database_dir.path())); + + EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->LazyOpen(true)); + ASSERT_TRUE(base::DirectoryExists(database_dir.path())); + + EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->DestroyDatabase()); + ASSERT_FALSE(base::DirectoryExists(database_dir.path())); +} + } // namespace content |