DatabaseContext.cpp [plain text]
#include "config.h"
#include "DatabaseContext.h"
#if ENABLE(SQL_DATABASE)
#include "Chrome.h"
#include "ChromeClient.h"
#include "Database.h"
#include "DatabaseTask.h"
#include "DatabaseThread.h"
#include "DatabaseTracker.h"
#include "Document.h"
#include "Page.h"
#include "SchemeRegistry.h"
#include "SecurityOrigin.h"
#include "Settings.h"
namespace WebCore {
static DatabaseContext* existingDatabaseContextFrom(ScriptExecutionContext* context)
{
return static_cast<DatabaseContext*>(Supplement<ScriptExecutionContext>::from(context, "DatabaseContext"));
}
DatabaseContext::DatabaseContext(ScriptExecutionContext* context)
: m_scriptExecutionContext(context)
, m_hasOpenDatabases(false)
{
}
DatabaseContext::~DatabaseContext()
{
if (m_databaseThread) {
ASSERT(m_databaseThread->terminationRequested());
m_databaseThread = 0;
}
}
DatabaseContext* DatabaseContext::from(ScriptExecutionContext* context)
{
DatabaseContext* supplement = existingDatabaseContextFrom(context);
if (!supplement) {
supplement = new DatabaseContext(context);
provideTo(context, "DatabaseContext", adoptPtr(supplement));
ASSERT(supplement == existingDatabaseContextFrom(context));
}
return supplement;
}
DatabaseThread* DatabaseContext::databaseThread()
{
if (!m_databaseThread && !m_hasOpenDatabases) {
m_databaseThread = DatabaseThread::create();
if (!m_databaseThread->start())
m_databaseThread = 0;
}
return m_databaseThread.get();
}
bool DatabaseContext::hasOpenDatabases(ScriptExecutionContext* context)
{
DatabaseContext* databaseContext = existingDatabaseContextFrom(context);
if (!databaseContext)
return false;
return databaseContext->m_hasOpenDatabases;
}
void DatabaseContext::stopDatabases(ScriptExecutionContext* context, DatabaseTaskSynchronizer* cleanupSync)
{
DatabaseContext* databaseContext = existingDatabaseContextFrom(context);
if (databaseContext && databaseContext->m_databaseThread)
databaseContext->m_databaseThread->requestTermination(cleanupSync);
else if (cleanupSync)
cleanupSync->taskCompleted();
}
bool DatabaseContext::allowDatabaseAccess() const
{
if (m_scriptExecutionContext->isDocument()) {
Document* document = static_cast<Document*>(m_scriptExecutionContext);
if (!document->page() || (document->page()->settings()->privateBrowsingEnabled() && !SchemeRegistry::allowsDatabaseAccessInPrivateBrowsing(document->securityOrigin()->protocol())))
return false;
return true;
}
ASSERT(m_scriptExecutionContext->isWorkerContext());
return true;
}
void DatabaseContext::databaseExceededQuota(const String& name)
{
if (m_scriptExecutionContext->isDocument()) {
Document* document = static_cast<Document*>(m_scriptExecutionContext);
if (Page* page = document->page())
page->chrome()->client()->exceededDatabaseQuota(document->frame(), name);
return;
}
ASSERT(m_scriptExecutionContext->isWorkerContext());
#if !PLATFORM(CHROMIUM)
const unsigned long long defaultQuota = 5 * 1024 * 1024;
DatabaseTracker::tracker().setQuota(m_scriptExecutionContext->securityOrigin(), defaultQuota);
#endif
}
}
#endif // ENABLE(SQL_DATABASE)