Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1013)

Unified Diff: content/browser/in_process_webkit/indexed_db_context_impl.cc

Issue 10695158: IndexedDB: Close open databases when user requests browsing data deletion (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove const from iterator (not sure how this slipped through) Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/in_process_webkit/indexed_db_context_impl.cc
diff --git a/content/browser/in_process_webkit/indexed_db_context_impl.cc b/content/browser/in_process_webkit/indexed_db_context_impl.cc
index c793767bc478b060107706929fa22d377689cc97..6d8386e54b97eabcc29c46b72357b00fff75753b 100644
--- a/content/browser/in_process_webkit/indexed_db_context_impl.cc
+++ b/content/browser/in_process_webkit/indexed_db_context_impl.cc
@@ -144,19 +144,31 @@ void IndexedDBContextImpl::DeleteForOrigin(const GURL& origin_url) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
if (data_path_.empty() || !IsInOriginSet(origin_url))
return;
- // TODO(michaeln): When asked to delete an origin with open connections,
- // forcibly close those connections then delete.
- if (connection_count_.find(origin_url) == connection_count_.end()) {
- string16 origin_id = DatabaseUtil::GetOriginIdentifier(origin_url);
- FilePath idb_directory = GetIndexedDBFilePath(origin_id);
- EnsureDiskUsageCacheInitialized(origin_url);
- bool deleted = file_util::Delete(idb_directory, true /*recursive*/);
- QueryDiskAndUpdateQuotaUsage(origin_url);
- if (deleted) {
- RemoveFromOriginSet(origin_url);
- origin_size_map_.erase(origin_url);
- space_available_map_.erase(origin_url);
+
+ if (connections_.find(origin_url) != connections_.end()) {
+ ConnectionSet& connections = connections_[origin_url];
+ ConnectionSet::iterator it = connections.begin();
+ while (it != connections.end()) {
+ // Remove before closing so callbacks don't double-erase
+ WebKit::WebIDBDatabase* db = *it;
+ connections.erase(it++);
+ db->forceClose();
}
+ DCHECK(connections_[origin_url].size() == 0);
+ connections_.erase(origin_url);
+ }
+
+ string16 origin_id = DatabaseUtil::GetOriginIdentifier(origin_url);
+ FilePath idb_directory = GetIndexedDBFilePath(origin_id);
+ EnsureDiskUsageCacheInitialized(origin_url);
+ const bool recursive = true;
+ bool deleted = file_util::Delete(idb_directory, recursive);
+
+ QueryDiskAndUpdateQuotaUsage(origin_url);
+ if (deleted) {
+ RemoveFromOriginSet(origin_url);
+ origin_size_map_.erase(origin_url);
+ space_available_map_.erase(origin_url);
}
}
@@ -165,13 +177,15 @@ FilePath IndexedDBContextImpl::GetFilePathForTesting(
return GetIndexedDBFilePath(origin_id);
}
-void IndexedDBContextImpl::ConnectionOpened(const GURL& origin_url) {
+void IndexedDBContextImpl::ConnectionOpened(const GURL& origin_url,
+ WebIDBDatabase* connection) {
+ DCHECK(connections_[origin_url].count(connection) == 0);
if (quota_manager_proxy()) {
quota_manager_proxy()->NotifyStorageAccessed(
quota::QuotaClient::kIndexedDatabase, origin_url,
quota::kStorageTypeTemporary);
}
- connection_count_[origin_url]++;
+ connections_[origin_url].insert(connection);
if (AddToOriginSet(origin_url)) {
// A newly created db, notify the quota system.
QueryDiskAndUpdateQuotaUsage(origin_url);
@@ -181,22 +195,27 @@ void IndexedDBContextImpl::ConnectionOpened(const GURL& origin_url) {
QueryAvailableQuota(origin_url);
}
-void IndexedDBContextImpl::ConnectionClosed(const GURL& origin_url) {
- DCHECK(connection_count_[origin_url] > 0);
+void IndexedDBContextImpl::ConnectionClosed(const GURL& origin_url,
+ WebIDBDatabase* connection) {
+ // May not be in the map if connection was forced to close
+ if (connections_.find(origin_url) == connections_.end() ||
+ connections_[origin_url].count(connection) != 1)
+ return;
if (quota_manager_proxy()) {
quota_manager_proxy()->NotifyStorageAccessed(
quota::QuotaClient::kIndexedDatabase, origin_url,
quota::kStorageTypeTemporary);
}
- connection_count_[origin_url]--;
- if (connection_count_[origin_url] == 0) {
+ connections_[origin_url].erase(connection);
+ if (connections_[origin_url].size() == 0) {
QueryDiskAndUpdateQuotaUsage(origin_url);
- connection_count_.erase(origin_url);
+ connections_.erase(origin_url);
}
}
void IndexedDBContextImpl::TransactionComplete(const GURL& origin_url) {
- DCHECK(connection_count_[origin_url] > 0);
+ DCHECK(connections_.find(origin_url) != connections_.end() &&
+ connections_[origin_url].size() > 0);
QueryDiskAndUpdateQuotaUsage(origin_url);
QueryAvailableQuota(origin_url);
}
@@ -324,7 +343,7 @@ void IndexedDBContextImpl::QueryAvailableQuota(const GURL& origin_url) {
return;
}
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (!quota_manager_proxy()->quota_manager())
+ if (!quota_manager_proxy() || !quota_manager_proxy()->quota_manager())
return;
quota_manager_proxy()->quota_manager()->GetUsageAndQuota(
origin_url,

Powered by Google App Engine
This is Rietveld 408576698