2010-01-20 Eric Uhrhane <ericu@chromium.org>
Reviewed by Dmitry Titov.
Refactoring and plumbing to get the HTML5 SQL Database API accessible to
web workers. No new functionality is exposed yet; this just gets the
infrastructure in place. It touches a lot of files in small ways; here
are the main changes:
1) Database members and methods move from Document up to
ScriptExecutionContext. Each of Document and WorkerContext must
implement a few virtual methods where the Database code requires
differentiation.
2) Worker thread shutdown got changed a bunch to handle Database cleanup
and thread synchronization issues. Database cleanup tasks need to post
some cleanup tasks to the JavaScript thread. However, since database
cleanup may happen due to the destruction of the WorkerThread, I added a
handshake [involving WorkerThreadShutdownStartTask,
WorkerThreadShutdownFinishTask, and a DatabaseTaskSynchronizer] between
the Database thread and WorkerThread that cleans up all the Database
stuff before the WorkerThread's runLoop can exit.
3) The runtime enabler for the Database moved to a static variable
accessible through Database::isAvailable, following the model used by
WebSocket.
4) Worker threads don't run their JavaScript on the Main thread, so
Database code that differentiated between the Main thread and the
Database thread now need to deal with a third possibility.
5) Most of the other changes have to do with having a
ScriptExecutionContext pointer instead of a Document pointer when
dealing with a Database. In many cases it's just a string replacement,
but in some it required the creation of a new virtual function [e.g.
databaseExceededQuota, isDatabaseReadOnly]
https://bugs.webkit.org/show_bug.cgi?id=22725
No new tests; in a future patch I'll add JSC and V8 bindings and new
layout tests to exercise them.
* bindings/v8/custom/V8DOMWindowCustom.cpp:
(WebCore::V8DOMWindow::OpenDatabaseEnabled):
* dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::~Document):
(WebCore::Document::isDatabaseReadOnly):
(WebCore::Document::databaseExceededQuota):
(WebCore::Document::isContextThread):
* dom/Document.h:
* dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::ScriptExecutionContext):
(WebCore::ScriptExecutionContext::~ScriptExecutionContext):
(WebCore::ScriptExecutionContext::databaseThread):
(WebCore::ScriptExecutionContext::addOpenDatabase):
(WebCore::ScriptExecutionContext::removeOpenDatabase):
(WebCore::ScriptExecutionContext::stopDatabases):
* dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::setHasOpenDatabases):
(WebCore::ScriptExecutionContext::hasOpenDatabases):
(WebCore::ScriptExecutionContext::Task::isCleanupTask):
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::stopLoading):
* storage/Database.cpp:
(WebCore::Database::setIsAvailable):
(WebCore::Database::isAvailable):
(WebCore::Database::openDatabase):
(WebCore::Database::Database):
(WebCore::DerefContextTask::create):
(WebCore::DerefContextTask::performTask):
(WebCore::DerefContextTask::isCleanupTask):
(WebCore::Database::~Database):
(WebCore::Database::openAndVerifyVersion):
(WebCore::Database::markAsDeletedAndClose):
(WebCore::ContextRemoveOpenDatabaseTask::create):
(WebCore::ContextRemoveOpenDatabaseTask::performTask):
(WebCore::ContextRemoveOpenDatabaseTask::isCleanupTask):
(WebCore::ContextRemoveOpenDatabaseTask::ContextRemoveOpenDatabaseTask):
(WebCore::Database::close):
(WebCore::Database::performOpenAndVerify):
(WebCore::Database::scheduleTransaction):
(WebCore::Database::scheduleTransactionStep):
(WebCore::DeliverPendingCallbackTask::create):
(WebCore::DeliverPendingCallbackTask::performTask):
(WebCore::DeliverPendingCallbackTask::DeliverPendingCallbackTask):
(WebCore::Database::scheduleTransactionCallback):
(WebCore::Database::transactionClient):
(WebCore::Database::transactionCoordinator):
(WebCore::Database::tableNames):
(WebCore::Database::securityOrigin):
* storage/Database.h:
(WebCore::Database::scriptExecutionContext):
* storage/DatabaseTask.h:
* storage/DatabaseThread.cpp:
(WebCore::DatabaseThread::DatabaseThread):
(WebCore::DatabaseThread::~DatabaseThread):
(WebCore::DatabaseThread::requestTermination):
(WebCore::DatabaseThread::databaseThread):
(WebCore::DatabaseThread::unscheduleDatabaseTasks):
* storage/DatabaseThread.h:
* storage/DatabaseTracker.cpp:
(WebCore::DatabaseTracker::canEstablishDatabase):
(WebCore::DatabaseTracker::getMaxSizeForDatabase):
* storage/DatabaseTracker.h:
* storage/SQLTransaction.cpp:
(WebCore::SQLTransaction::executeSQL):
* storage/SQLTransactionClient.cpp:
(WebCore::SQLTransactionClient::didCommitTransaction):
(WebCore::SQLTransactionClient::didExecuteStatement):
(WebCore::SQLTransactionClient::didExceedQuota):
* storage/chromium/DatabaseTrackerChromium.cpp:
(WebCore::DatabaseTracker::canEstablishDatabase):
(WebCore::DatabaseTracker::addOpenDatabase):
(WebCore::TrackerRemoveOpenDatabaseTask::create):
(WebCore::TrackerRemoveOpenDatabaseTask::performTask):
(WebCore::TrackerRemoveOpenDatabaseTask::TrackerRemoveOpenDatabaseTask):
(WebCore::DatabaseTracker::removeOpenDatabase):
(WebCore::DatabaseTracker::getMaxSizeForDatabase):
* storage/chromium/SQLTransactionClientChromium.cpp:
(WebCore::NotifyDatabaseChangedTask::create):
(WebCore::NotifyDatabaseChangedTask::performTask):
(WebCore::NotifyDatabaseChangedTask::NotifyDatabaseChangedTask):
(WebCore::SQLTransactionClient::didCommitTransaction):
(WebCore::SQLTransactionClient::didExecuteStatement):
(WebCore::SQLTransactionClient::didExceedQuota):
* workers/WorkerContext.cpp:
(WebCore::WorkerContext::openDatabase):
(WebCore::WorkerContext::isContextThread):
* workers/WorkerContext.h:
(WebCore::WorkerContext::clearScript):
(WebCore::WorkerContext::thread):
(WebCore::WorkerContext::isDatabaseReadOnly):
(WebCore::WorkerContext::databaseExceededQuota):
* workers/WorkerRunLoop.cpp:
(WebCore::WorkerRunLoop::runInMode):
(WebCore::WorkerRunLoop::Task::performTask):
* workers/WorkerThread.cpp:
(WebCore::WorkerThread::workerThread):
(WebCore::WorkerThreadShutdownFinishTask::create):
(WebCore::WorkerThreadShutdownFinishTask::performTask):
(WebCore::WorkerThreadShutdownFinishTask::isCleanupTask):
(WebCore::WorkerThreadShutdownStartTask::create):
(WebCore::WorkerThreadShutdownStartTask::performTask):
(WebCore::WorkerThreadShutdownStartTask::isCleanupTask):
(WebCore::WorkerThread::stop):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53595 268f45cc-cd09-0410-ab3c-d52691b4dbfc
22 files changed