| Index: trunk/src/content/browser/indexed_db/indexed_db_context_impl.cc
|
| ===================================================================
|
| --- trunk/src/content/browser/indexed_db/indexed_db_context_impl.cc (revision 244272)
|
| +++ trunk/src/content/browser/indexed_db/indexed_db_context_impl.cc (working copy)
|
| @@ -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);
|
| }
|
|
|