summaryrefslogtreecommitdiffstats
path: root/webkit/database
diff options
context:
space:
mode:
authormarja@chromium.org <marja@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-08 10:44:03 +0000
committermarja@chromium.org <marja@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-08 10:44:03 +0000
commite9005779e42a908cb54400018b94a2f158116321 (patch)
tree4217188a1f8dea29170b89c87bcc8661a6003dc6 /webkit/database
parentb5621306f7ff98d66d5a25920a8749f5034b6c7c (diff)
downloadchromium_src-e9005779e42a908cb54400018b94a2f158116321.zip
chromium_src-e9005779e42a908cb54400018b94a2f158116321.tar.gz
chromium_src-e9005779e42a908cb54400018b94a2f158116321.tar.bz2
Appcache, local storage, indexed db, databases: skip exit-time deletion when restarting.
BUG=104291 TEST={ChromeAppCacheServiceTest, DOMStorageTest, IndexedDBBrowserTest, DatabaseTrackerTest}.SaveSessionState Review URL: http://codereview.chromium.org/8820009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113590 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/database')
-rw-r--r--webkit/database/database_tracker.cc14
-rw-r--r--webkit/database/database_tracker.h3
-rw-r--r--webkit/database/database_tracker_unittest.cc82
3 files changed, 98 insertions, 1 deletions
diff --git a/webkit/database/database_tracker.cc b/webkit/database/database_tracker.cc
index 8e09d16..980e8a1 100644
--- a/webkit/database/database_tracker.cc
+++ b/webkit/database/database_tracker.cc
@@ -100,6 +100,7 @@ DatabaseTracker::DatabaseTracker(
: is_initialized_(false),
is_incognito_(is_incognito),
clear_local_state_on_exit_(clear_local_state_on_exit),
+ save_session_state_(false),
shutting_down_(false),
profile_path_(profile_path),
db_dir_(is_incognito_ ?
@@ -857,7 +858,7 @@ void DatabaseTracker::Shutdown() {
}
if (is_incognito_)
DeleteIncognitoDBDirectory();
- else
+ else if (!save_session_state_)
ClearLocalState(clear_local_state_on_exit_);
}
@@ -877,4 +878,15 @@ void DatabaseTracker::SetClearLocalStateOnExit(bool clear_local_state_on_exit) {
clear_local_state_on_exit_ = clear_local_state_on_exit;
}
+void DatabaseTracker::SaveSessionState() {
+ DCHECK(db_tracker_thread_.get());
+ if (!db_tracker_thread_->BelongsToCurrentThread()) {
+ db_tracker_thread_->PostTask(
+ FROM_HERE,
+ base::Bind(&DatabaseTracker::SaveSessionState, this));
+ return;
+ }
+ save_session_state_ = true;
+}
+
} // namespace webkit_database
diff --git a/webkit/database/database_tracker.h b/webkit/database/database_tracker.h
index c2432f5..5c728f9 100644
--- a/webkit/database/database_tracker.h
+++ b/webkit/database/database_tracker.h
@@ -164,6 +164,8 @@ class DatabaseTracker
// used for an incognito profile or |clear_local_state_on_exit_| is true.
void Shutdown();
void SetClearLocalStateOnExit(bool clear_local_state_on_exit);
+ // Disables the exit-time deletion for all data (also session-only data).
+ void SaveSessionState();
private:
friend class base::RefCountedThreadSafe<DatabaseTracker>;
@@ -255,6 +257,7 @@ class DatabaseTracker
bool is_initialized_;
const bool is_incognito_;
bool clear_local_state_on_exit_;
+ bool save_session_state_;
bool shutting_down_;
const FilePath profile_path_;
const FilePath db_dir_;
diff --git a/webkit/database/database_tracker_unittest.cc b/webkit/database/database_tracker_unittest.cc
index e46e16b..4d4923d 100644
--- a/webkit/database/database_tracker_unittest.cc
+++ b/webkit/database/database_tracker_unittest.cc
@@ -687,6 +687,83 @@ class DatabaseTracker_TestHelper_Test {
EXPECT_FALSE(file_util::PathExists(origin2_db_dir));
}
+ static void DatabaseTrackerSaveSessionState() {
+ int64 database_size = 0;
+ const string16 kOrigin1 =
+ DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url));
+ const string16 kOrigin2 =
+ DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url));
+ const string16 kDB1 = ASCIIToUTF16("db1");
+ const string16 kDB2 = ASCIIToUTF16("db2");
+ const string16 kDescription = ASCIIToUTF16("database_description");
+
+ // Initialize the tracker database.
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ FilePath origin1_db_dir;
+ FilePath origin2_db_dir;
+ {
+ scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy =
+ new quota::MockSpecialStoragePolicy;
+ special_storage_policy->AddSessionOnly(GURL(kOrigin2Url));
+ scoped_refptr<DatabaseTracker> tracker(
+ new DatabaseTracker(
+ temp_dir.path(), false, true /*clear_local_state_on_exit*/,
+ special_storage_policy, NULL,
+ base::MessageLoopProxy::current()));
+ tracker->SaveSessionState();
+
+ // Open two new databases.
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
+ &database_size);
+ EXPECT_EQ(0, database_size);
+ tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
+ &database_size);
+ EXPECT_EQ(0, database_size);
+
+ // Write some data to each file.
+ FilePath db_file;
+ db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1);
+ EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName()));
+ EXPECT_TRUE(EnsureFileOfSize(db_file, 1));
+
+ db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2);
+ EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName()));
+ EXPECT_TRUE(EnsureFileOfSize(db_file, 2));
+
+ // Store the origin database directories as long as they still exist.
+ origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB1).DirName();
+ origin2_db_dir = tracker->GetFullDBFilePath(kOrigin2, kDB2).DirName();
+
+ tracker->DatabaseModified(kOrigin1, kDB1);
+ tracker->DatabaseModified(kOrigin2, kDB2);
+
+ // Close all databases.
+ tracker->DatabaseClosed(kOrigin1, kDB1);
+ tracker->DatabaseClosed(kOrigin2, kDB2);
+
+ tracker->Shutdown();
+ }
+
+ // At this point, the database tracker should be gone. Create a new one.
+ scoped_refptr<DatabaseTracker> tracker(
+ new DatabaseTracker(temp_dir.path(), false, false,
+ NULL, NULL, NULL));
+
+ // Get all data for all origins.
+ std::vector<OriginInfo> origins_info;
+ EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
+ // No origins were deleted.
+ EXPECT_EQ(size_t(2), origins_info.size());
+ EXPECT_TRUE(
+ file_util::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB1)));
+ EXPECT_TRUE(
+ file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2)));
+
+ EXPECT_TRUE(file_util::PathExists(origin1_db_dir));
+ EXPECT_TRUE(file_util::PathExists(origin2_db_dir));
+ }
+
static void EmptyDatabaseNameIsValid() {
const GURL kOrigin(kOrigin1Url);
const string16 kOriginId = DatabaseUtil::GetOriginIdentifier(kOrigin);
@@ -766,6 +843,11 @@ TEST(DatabaseTrackerTest, DatabaseTrackerClearSessionOnlyDatabasesOnExit) {
DatabaseTrackerClearSessionOnlyDatabasesOnExit();
}
+TEST(DatabaseTrackerTest, DatabaseTrackerSaveSessionState) {
+ // Only works for regular mode.
+ DatabaseTracker_TestHelper_Test::DatabaseTrackerSaveSessionState();
+}
+
TEST(DatabaseTrackerTest, EmptyDatabaseNameIsValid) {
DatabaseTracker_TestHelper_Test::EmptyDatabaseNameIsValid();
}