Index: content/browser/indexed_db/indexed_db_factory.cc |
diff --git a/content/browser/indexed_db/indexed_db_factory.cc b/content/browser/indexed_db/indexed_db_factory.cc |
index 8cf50425866d245bc449142ed477c6e7d57e548b..55403314ecb4e6a91f177c2cde407a2c3a5731db 100644 |
--- a/content/browser/indexed_db/indexed_db_factory.cc |
+++ b/content/browser/indexed_db/indexed_db_factory.cc |
@@ -25,14 +25,32 @@ IndexedDBFactory::IndexedDBFactory(IndexedDBContextImpl* context) |
IndexedDBFactory::~IndexedDBFactory() {} |
-void IndexedDBFactory::ReleaseDatabase( |
- const IndexedDBDatabase::Identifier& identifier, |
- bool forcedClose) { |
+void IndexedDBFactory::RemoveDatabaseFromMaps( |
+ const IndexedDBDatabase::Identifier& identifier) { |
IndexedDBDatabaseMap::iterator it = database_map_.find(identifier); |
DCHECK(it != database_map_.end()); |
- DCHECK(!it->second->backing_store()); |
+ IndexedDBDatabase* database = it->second; |
database_map_.erase(it); |
+ std::pair<OriginDBMap::iterator, OriginDBMap::iterator> range = |
+ origin_dbs_.equal_range(database->identifier().first); |
+ DCHECK(range.first != range.second); |
+ for (OriginDBMap::iterator it2 = range.first; it2 != range.second; ++it2) { |
+ if (it2->second == database) { |
+ origin_dbs_.erase(it2); |
+ break; |
+ } |
+ } |
+} |
+ |
+void IndexedDBFactory::ReleaseDatabase( |
+ const IndexedDBDatabase::Identifier& identifier, |
+ bool forcedClose) { |
+ |
+ DCHECK(!database_map_.find(identifier)->second->backing_store()); |
+ |
+ RemoveDatabaseFromMaps(identifier); |
+ |
// No grace period on a forced-close, as the initiator is |
// assuming the backing store will be released once all |
// connections are closed. |
@@ -92,6 +110,15 @@ bool IndexedDBFactory::HasLastBackingStoreReference(const GURL& origin_url) |
} |
void IndexedDBFactory::ForceClose(const GURL& origin_url) { |
+ std::pair<OriginDBMapIterator, OriginDBMapIterator> range = |
+ GetOpenDatabasesForOrigin(origin_url); |
+ |
+ while (range.first != range.second) { |
+ IndexedDBDatabase* db = range.first->second; |
+ ++range.first; |
+ db->ForceClose(); |
+ } |
+ |
if (backing_store_map_.find(origin_url) != backing_store_map_.end()) |
ReleaseBackingStore(origin_url, true /* immediate */); |
} |
@@ -183,8 +210,9 @@ void IndexedDBFactory::DeleteDatabase( |
} |
database_map_[unique_identifier] = database; |
+ origin_dbs_.insert(std::make_pair(origin_url, database)); |
database->DeleteDatabase(callbacks); |
- database_map_.erase(unique_identifier); |
+ RemoveDatabaseFromMaps(unique_identifier); |
database = NULL; |
backing_store = NULL; |
ReleaseBackingStore(origin_url, false /* immediate */); |
@@ -324,20 +352,27 @@ void IndexedDBFactory::Open( |
database->OpenConnection( |
callbacks, database_callbacks, transaction_id, version); |
- if (!was_open && database->ConnectionCount() > 0) |
+ if (!was_open && database->ConnectionCount() > 0) { |
database_map_[unique_identifier] = database; |
+ origin_dbs_.insert(std::make_pair(origin_url, database)); |
+ } |
} |
-std::vector<IndexedDBDatabase*> IndexedDBFactory::GetOpenDatabasesForOrigin( |
- const GURL& origin_url) const { |
- std::vector<IndexedDBDatabase*> result; |
- for (IndexedDBDatabaseMap::const_iterator it = database_map_.begin(); |
- it != database_map_.end(); |
- ++it) { |
- if (it->first.first == origin_url) |
- result.push_back(it->second); |
- } |
- return result; |
+std::pair<IndexedDBFactory::OriginDBMapIterator, |
+ IndexedDBFactory::OriginDBMapIterator> |
+IndexedDBFactory::GetOpenDatabasesForOrigin(const GURL& origin_url) const { |
+ return origin_dbs_.equal_range(origin_url); |
+} |
+ |
+size_t IndexedDBFactory::GetConnectionCount(const GURL& origin_url) const { |
+ size_t count(0); |
+ |
+ std::pair<OriginDBMapIterator, OriginDBMapIterator> range = |
+ GetOpenDatabasesForOrigin(origin_url); |
+ for (OriginDBMapIterator it = range.first; it != range.second; ++it) |
+ count += it->second->ConnectionCount(); |
+ |
+ return count; |
} |
} // namespace content |