Index: content/browser/indexed_db/indexed_db_context_impl.cc |
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc |
index df99bf42a9fd1362c90c7e97a29d916f3b4ddc1f..fc1c932ac2a012bec315c88b3a6d0bd8bb1cbc92 100644 |
--- a/content/browser/indexed_db/indexed_db_context_impl.cc |
+++ b/content/browser/indexed_db/indexed_db_context_impl.cc |
@@ -187,17 +187,16 @@ |
// origins in the outer loop. |
if (factory_) { |
- std::pair<IndexedDBFactory::OriginDBMapIterator, |
- IndexedDBFactory::OriginDBMapIterator> range = |
+ std::vector<IndexedDBDatabase*> databases = |
factory_->GetOpenDatabasesForOrigin(origin_url); |
// TODO(jsbell): Sort by name? |
scoped_ptr<base::ListValue> database_list(new base::ListValue()); |
- for (IndexedDBFactory::OriginDBMapIterator it = range.first; |
- it != range.second; |
+ for (std::vector<IndexedDBDatabase*>::iterator it = databases.begin(); |
+ it != databases.end(); |
++it) { |
- const IndexedDBDatabase* db = it->second; |
+ const IndexedDBDatabase* db = *it; |
scoped_ptr<base::DictionaryValue> db_info(new base::DictionaryValue()); |
db_info->SetString("name", db->name()); |
@@ -337,9 +336,21 @@ |
if (data_path_.empty() || !IsInOriginSet(origin_url)) |
return; |
+ 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 |
+ IndexedDBConnection* connection = *it; |
+ DCHECK(connection->IsConnected()); |
+ connections.erase(it++); |
+ connection->ForceClose(); |
+ } |
+ DCHECK_EQ(connections_[origin_url].size(), 0UL); |
+ connections_.erase(origin_url); |
+ } |
if (factory_) |
factory_->ForceClose(origin_url); |
- DCHECK_EQ(0UL, GetConnectionCount(origin_url)); |
} |
size_t IndexedDBContextImpl::GetConnectionCount(const GURL& origin_url) { |
@@ -347,10 +358,10 @@ |
if (data_path_.empty() || !IsInOriginSet(origin_url)) |
return 0; |
- if (!factory_) |
+ if (connections_.find(origin_url) == connections_.end()) |
return 0; |
- return factory_->GetConnectionCount(origin_url); |
+ return connections_[origin_url].size(); |
} |
base::FilePath IndexedDBContextImpl::GetFilePath(const GURL& origin_url) const { |
@@ -372,12 +383,14 @@ |
void IndexedDBContextImpl::ConnectionOpened(const GURL& origin_url, |
IndexedDBConnection* connection) { |
DCHECK(TaskRunner()->RunsTasksOnCurrentThread()); |
+ DCHECK_EQ(connections_[origin_url].count(connection), 0UL); |
if (quota_manager_proxy()) { |
quota_manager_proxy()->NotifyStorageAccessed( |
quota::QuotaClient::kIndexedDatabase, |
origin_url, |
quota::kStorageTypeTemporary); |
} |
+ connections_[origin_url].insert(connection); |
if (AddToOriginSet(origin_url)) { |
// A newly created db, notify the quota system. |
QueryDiskAndUpdateQuotaUsage(origin_url); |
@@ -390,18 +403,26 @@ |
void IndexedDBContextImpl::ConnectionClosed(const GURL& origin_url, |
IndexedDBConnection* connection) { |
DCHECK(TaskRunner()->RunsTasksOnCurrentThread()); |
+ // 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); |
} |
- if (factory_ && factory_->GetConnectionCount(origin_url) == 0) |
+ connections_[origin_url].erase(connection); |
+ if (connections_[origin_url].size() == 0) { |
QueryDiskAndUpdateQuotaUsage(origin_url); |
+ connections_.erase(origin_url); |
+ } |
} |
void IndexedDBContextImpl::TransactionComplete(const GURL& origin_url) { |
- DCHECK(!factory_ || factory_->GetConnectionCount(origin_url) > 0); |
+ DCHECK(connections_.find(origin_url) != connections_.end() && |
+ connections_[origin_url].size() > 0); |
QueryDiskAndUpdateQuotaUsage(origin_url); |
QueryAvailableQuota(origin_url); |
} |