#include "core/dom/ExecutionContext.h"
#include "core/dom/ExecutionContextTask.h"
-#include "modules/webdatabase/sqlite/SQLiteFileSystem.h"
-#include "modules/webdatabase/DatabaseBackendBase.h"
+#include "modules/webdatabase/Database.h"
+#include "modules/webdatabase/DatabaseClient.h"
#include "modules/webdatabase/DatabaseContext.h"
-#include "modules/webdatabase/DatabaseObserver.h"
#include "modules/webdatabase/QuotaTracker.h"
-#include "weborigin/DatabaseIdentifier.h"
-#include "weborigin/SecurityOrigin.h"
-#include "weborigin/SecurityOriginHash.h"
+#include "modules/webdatabase/sqlite/SQLiteFileSystem.h"
+#include "platform/weborigin/DatabaseIdentifier.h"
+#include "platform/weborigin/SecurityOrigin.h"
+#include "platform/weborigin/SecurityOriginHash.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebDatabaseObserver.h"
#include "wtf/Assertions.h"
#include "wtf/StdLibExtras.h"
-#include "wtf/text/WTFString.h"
-namespace WebCore {
+namespace blink {
+
+static void databaseClosed(Database* database)
+{
+ if (Platform::current()->databaseObserver()) {
+ Platform::current()->databaseObserver()->databaseClosed(
+ createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()),
+ database->stringIdentifier());
+ }
+}
DatabaseTracker& DatabaseTracker::tracker()
{
bool DatabaseTracker::canEstablishDatabase(DatabaseContext* databaseContext, const String& name, const String& displayName, unsigned long estimatedSize, DatabaseError& error)
{
ExecutionContext* executionContext = databaseContext->executionContext();
- bool success = DatabaseObserver::canEstablishDatabase(executionContext, name, displayName, estimatedSize);
+ bool success = DatabaseClient::from(executionContext)->allowDatabase(executionContext, name, displayName, estimatedSize);
if (!success)
error = DatabaseError::GenericSecurityError;
return success;
return createDatabaseIdentifierFromSecurityOrigin(origin) + "/" + name + "#";
}
-void DatabaseTracker::addOpenDatabase(DatabaseBackendBase* database)
+void DatabaseTracker::addOpenDatabase(Database* database)
{
MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
if (!m_openDatabaseMap)
databaseSet->add(database);
}
-class NotifyDatabaseObserverOnCloseTask : public ExecutionContextTask {
+class NotifyDatabaseObserverOnCloseTask final : public ExecutionContextTask {
public:
- static PassOwnPtr<NotifyDatabaseObserverOnCloseTask> create(PassRefPtr<DatabaseBackendBase> database)
+ static PassOwnPtr<NotifyDatabaseObserverOnCloseTask> create(Database* database)
{
return adoptPtr(new NotifyDatabaseObserverOnCloseTask(database));
}
- virtual void performTask(ExecutionContext* context)
+ virtual void performTask(ExecutionContext*) override
{
- DatabaseObserver::databaseClosed(m_database.get());
+ databaseClosed(m_database.get());
}
- virtual bool isCleanupTask() const
+ virtual bool isCleanupTask() const override
{
return true;
}
private:
- NotifyDatabaseObserverOnCloseTask(PassRefPtr<DatabaseBackendBase> database)
+ explicit NotifyDatabaseObserverOnCloseTask(Database* database)
: m_database(database)
{
}
- RefPtr<DatabaseBackendBase> m_database;
+ CrossThreadPersistent<Database> m_database;
};
-void DatabaseTracker::removeOpenDatabase(DatabaseBackendBase* database)
+void DatabaseTracker::removeOpenDatabase(Database* database)
{
String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin());
MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
if (!executionContext->isContextThread())
executionContext->postTask(NotifyDatabaseObserverOnCloseTask::create(database));
else
- DatabaseObserver::databaseClosed(database);
+ databaseClosed(database);
}
-void DatabaseTracker::prepareToOpenDatabase(DatabaseBackendBase* database)
+void DatabaseTracker::prepareToOpenDatabase(Database* database)
{
ASSERT(database->databaseContext()->executionContext()->isContextThread());
- DatabaseObserver::databaseOpened(database);
+ if (Platform::current()->databaseObserver()) {
+ Platform::current()->databaseObserver()->databaseOpened(
+ createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()),
+ database->stringIdentifier(),
+ database->displayName(),
+ database->estimatedSize());
+ }
}
-void DatabaseTracker::failedToOpenDatabase(DatabaseBackendBase* database)
+void DatabaseTracker::failedToOpenDatabase(Database* database)
{
ExecutionContext* executionContext = database->databaseContext()->executionContext();
if (!executionContext->isContextThread())
executionContext->postTask(NotifyDatabaseObserverOnCloseTask::create(database));
else
- DatabaseObserver::databaseClosed(database);
+ databaseClosed(database);
}
-unsigned long long DatabaseTracker::getMaxSizeForDatabase(const DatabaseBackendBase* database)
+unsigned long long DatabaseTracker::getMaxSizeForDatabase(const Database* database)
{
unsigned long long spaceAvailable = 0;
unsigned long long databaseSize = 0;
return databaseSize + spaceAvailable;
}
-void DatabaseTracker::interruptAllDatabasesForContext(const DatabaseContext* context)
-{
- MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
-
- if (!m_openDatabaseMap)
- return;
-
- DatabaseNameMap* nameMap = m_openDatabaseMap->get(createDatabaseIdentifierFromSecurityOrigin(context->securityOrigin()));
- if (!nameMap)
- return;
-
- DatabaseNameMap::const_iterator dbNameMapEndIt = nameMap->end();
- for (DatabaseNameMap::const_iterator dbNameMapIt = nameMap->begin(); dbNameMapIt != dbNameMapEndIt; ++dbNameMapIt) {
- DatabaseSet* databaseSet = dbNameMapIt->value;
- DatabaseSet::const_iterator end = databaseSet->end();
- for (DatabaseSet::const_iterator it = databaseSet->begin(); it != end; ++it) {
- if ((*it)->databaseContext() == context)
- (*it)->interrupt();
- }
- }
-}
-
-class DatabaseTracker::CloseOneDatabaseImmediatelyTask : public ExecutionContextTask {
+// FIXME: This can be removed by createCrossThreadTask().
+class DatabaseTracker::CloseOneDatabaseImmediatelyTask final : public ExecutionContextTask {
public:
- static PassOwnPtr<CloseOneDatabaseImmediatelyTask> create(const String& originIdentifier, const String& name, DatabaseBackendBase* database)
+ static PassOwnPtr<CloseOneDatabaseImmediatelyTask> create(const String& originIdentifier, const String& name, Database* database)
{
return adoptPtr(new CloseOneDatabaseImmediatelyTask(originIdentifier, name, database));
}
- virtual void performTask(ExecutionContext* context)
+ virtual void performTask(ExecutionContext*) override
{
DatabaseTracker::tracker().closeOneDatabaseImmediately(m_originIdentifier, m_name, m_database);
}
private:
- CloseOneDatabaseImmediatelyTask(const String& originIdentifier, const String& name, DatabaseBackendBase* database)
+ CloseOneDatabaseImmediatelyTask(const String& originIdentifier, const String& name, Database* database)
: m_originIdentifier(originIdentifier.isolatedCopy())
, m_name(name.isolatedCopy())
, m_database(database)
String m_originIdentifier;
String m_name;
- DatabaseBackendBase* m_database; // Intentionally a raw pointer.
+ CrossThreadPersistent<Database> m_database;
};
void DatabaseTracker::closeDatabasesImmediately(const String& originIdentifier, const String& name)
if (!databaseSet)
return;
- // We have to call closeImmediately() on the context thread and we cannot safely add a reference to
- // the database in our collection when not on the context thread (which is always the case given
- // current usage).
+ // We have to call closeImmediately() on the context thread.
for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it)
(*it)->databaseContext()->executionContext()->postTask(CloseOneDatabaseImmediatelyTask::create(originIdentifier, name, *it));
}
-void DatabaseTracker::closeOneDatabaseImmediately(const String& originIdentifier, const String& name, DatabaseBackendBase* database)
+void DatabaseTracker::closeOneDatabaseImmediately(const String& originIdentifier, const String& name, Database* database)
{
// First we have to confirm the 'database' is still in our collection.
{
database->closeImmediately();
}
-}
+} // namespace blink