summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornhiroki@chromium.org <nhiroki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-10 06:22:30 +0000
committernhiroki@chromium.org <nhiroki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-10 06:22:30 +0000
commitd1c73b349c996bfacc7605928b635e5635ad5581 (patch)
tree718b7e1012ef32dcfa2e6679b2c51f868038926d
parent55a66a52f970c57cf7d347ee606d564934d9e74b (diff)
downloadchromium_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
-rw-r--r--content/browser/service_worker/service_worker_database.cc15
-rw-r--r--content/browser/service_worker/service_worker_database.h5
-rw-r--r--content/browser/service_worker/service_worker_database_unittest.cc14
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