summaryrefslogtreecommitdiffstats
path: root/webkit/database
diff options
context:
space:
mode:
authormaruel@chromium.org <maruel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-24 20:19:16 +0000
committermaruel@chromium.org <maruel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-24 20:19:16 +0000
commit869f2efe7f02e3eca489b1ced00f371543bb1e0a (patch)
treefc821949211a73dd0c763e7c081b6eca9afc2583 /webkit/database
parent0ec9203dac6b11c664adda8a39b77f3f00eb6072 (diff)
downloadchromium_src-869f2efe7f02e3eca489b1ced00f371543bb1e0a.zip
chromium_src-869f2efe7f02e3eca489b1ced00f371543bb1e0a.tar.gz
chromium_src-869f2efe7f02e3eca489b1ced00f371543bb1e0a.tar.bz2
Reapply 42467 by reverting 42499 and added suppression.
"Clear cookies, local storage and databases when an extension gets uninstalled." BUG=39177 BUG=38398 Review URL: http://codereview.chromium.org/1210004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42520 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/database')
-rw-r--r--webkit/database/database_tracker.cc60
-rw-r--r--webkit/database/database_tracker.h10
2 files changed, 60 insertions, 10 deletions
diff --git a/webkit/database/database_tracker.cc b/webkit/database/database_tracker.cc
index bc7dd47..ea1994e 100644
--- a/webkit/database/database_tracker.cc
+++ b/webkit/database/database_tracker.cc
@@ -420,6 +420,22 @@ void DatabaseTracker::ScheduleDatabaseForDeletion(
origin_identifier, database_name));
}
+void DatabaseTracker::ScheduleDatabasesForDeletion(
+ const DatabaseSet& databases,
+ net::CompletionCallback* callback) {
+ DCHECK(!callback ||
+ deletion_callbacks_.find(callback) == deletion_callbacks_.end());
+ DCHECK(!databases.empty());
+ if (callback)
+ deletion_callbacks_[callback] = databases;
+ for (DatabaseSet::const_iterator ori = databases.begin();
+ ori != databases.end(); ++ori) {
+ for (std::set<string16>::const_iterator db = ori->second.begin();
+ db != ori->second.end(); ++db)
+ ScheduleDatabaseForDeletion(ori->first, *db);
+ }
+}
+
int DatabaseTracker::DeleteDatabase(const string16& origin_identifier,
const string16& database_name,
net::CompletionCallback* callback) {
@@ -477,18 +493,42 @@ int DatabaseTracker::DeleteDataModifiedSince(
}
}
+ if (rv != net::OK)
+ return rv;
+
if (!to_be_deleted.empty()) {
- if (callback)
- deletion_callbacks_[callback] = to_be_deleted;
- for (DatabaseSet::iterator ori = to_be_deleted.begin();
- ori != to_be_deleted.end(); ++ori) {
- for (std::set<string16>::iterator db = ori->second.begin();
- db != ori->second.end(); ++db)
- ScheduleDatabaseForDeletion(ori->first, *db);
- }
- rv = net::ERR_IO_PENDING;
+ ScheduleDatabasesForDeletion(to_be_deleted, callback);
+ return net::ERR_IO_PENDING;
+ }
+ return net::OK;
+}
+
+int DatabaseTracker::DeleteDataForOrigin(const string16& origin,
+ net::CompletionCallback* callback) {
+ if (!LazyInit())
+ return net::ERR_FAILED;
+
+ DCHECK(!callback ||
+ deletion_callbacks_.find(callback) == deletion_callbacks_.end());
+ DatabaseSet to_be_deleted;
+
+ std::vector<DatabaseDetails> details;
+ if (!databases_table_->GetAllDatabaseDetailsForOrigin(origin, &details))
+ return net::ERR_FAILED;
+ for (std::vector<DatabaseDetails>::const_iterator db = details.begin();
+ db != details.end(); ++db) {
+ // Check if the database is opened by any renderer.
+ if (database_connections_.IsDatabaseOpened(origin, db->database_name))
+ to_be_deleted[origin].insert(db->database_name);
+ else
+ DeleteClosedDatabase(origin, db->database_name);
}
- return rv;
+
+ if (!to_be_deleted.empty()) {
+ ScheduleDatabasesForDeletion(to_be_deleted, callback);
+ return net::ERR_IO_PENDING;
+ }
+ return net::OK;
}
// static
diff --git a/webkit/database/database_tracker.h b/webkit/database/database_tracker.h
index 90c9ebc..d1d5a43 100644
--- a/webkit/database/database_tracker.h
+++ b/webkit/database/database_tracker.h
@@ -148,6 +148,12 @@ class DatabaseTracker
int DeleteDataModifiedSince(const base::Time& cutoff,
net::CompletionCallback* callback);
+ // Delete all databases that belong to the given origin. Returns net::OK on
+ // success, net::FAILED if not all databases could be deleted, and
+ // net::ERR_IO_PENDING and |callback| is invoked upon completion, if non-NULL.
+ int DeleteDataForOrigin(const string16& origin_identifier,
+ net::CompletionCallback* callback);
+
static void ClearLocalState(const FilePath& profile_path);
private:
@@ -201,6 +207,10 @@ class DatabaseTracker
const string16& database_name);
void ScheduleDatabaseForDeletion(const string16& origin_identifier,
const string16& database_name);
+ // Schedule a set of open databases for deletion. If non-null, callback is
+ // invoked upon completion.
+ void ScheduleDatabasesForDeletion(const DatabaseSet& databases,
+ net::CompletionCallback* callback);
bool initialized_;
const FilePath db_dir_;