summaryrefslogtreecommitdiffstats
path: root/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/storage/chromium/DatabaseTrackerChromium.cpp')
-rw-r--r--WebCore/storage/chromium/DatabaseTrackerChromium.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/WebCore/storage/chromium/DatabaseTrackerChromium.cpp b/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
index e18706b..ac58e07 100644
--- a/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
+++ b/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
@@ -38,6 +38,7 @@
#include "QuotaTracker.h"
#include "ScriptExecutionContext.h"
#include "SecurityOrigin.h"
+#include "SecurityOriginHash.h"
#include "SQLiteFileSystem.h"
#include <wtf/HashSet.h>
#include <wtf/MainThread.h>
@@ -76,6 +77,25 @@ String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const String
void DatabaseTracker::addOpenDatabase(Database* database)
{
ASSERT(database->scriptExecutionContext()->isContextThread());
+ MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+ if (!m_openDatabaseMap)
+ m_openDatabaseMap.set(new DatabaseOriginMap());
+
+ DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin());
+ if (!nameMap) {
+ nameMap = new DatabaseNameMap();
+ m_openDatabaseMap->set(database->securityOrigin(), nameMap);
+ }
+
+ String name(database->stringIdentifier());
+ DatabaseSet* databaseSet = nameMap->get(name);
+ if (!databaseSet) {
+ databaseSet = new DatabaseSet();
+ nameMap->set(name, databaseSet);
+ }
+
+ databaseSet->add(database);
+
DatabaseObserver::databaseOpened(database);
}
@@ -107,9 +127,46 @@ void DatabaseTracker::removeOpenDatabase(Database* database)
return;
}
+ MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+ ASSERT(m_openDatabaseMap);
+ DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin());
+ ASSERT(nameMap);
+ String name(database->stringIdentifier());
+ DatabaseSet* databaseSet = nameMap->get(name);
+ ASSERT(databaseSet);
+ databaseSet->remove(database);
+
+ if (databaseSet->isEmpty()) {
+ nameMap->remove(name);
+ delete databaseSet;
+ if (nameMap->isEmpty()) {
+ m_openDatabaseMap->remove(database->securityOrigin());
+ delete nameMap;
+ }
+ }
+
DatabaseObserver::databaseClosed(database);
}
+
+void DatabaseTracker::getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases)
+{
+ MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+ if (!m_openDatabaseMap)
+ return;
+
+ DatabaseNameMap* nameMap = m_openDatabaseMap->get(origin);
+ if (!nameMap)
+ return;
+
+ DatabaseSet* databaseSet = nameMap->get(name);
+ if (!databaseSet)
+ return;
+
+ for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it)
+ databases->add(*it);
+}
+
unsigned long long DatabaseTracker::getMaxSizeForDatabase(const Database* database)
{
ASSERT(currentThread() == database->scriptExecutionContext()->databaseThread()->getThreadID());