summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/storage/IDBDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/storage/IDBDatabase.cpp')
-rw-r--r--Source/WebCore/storage/IDBDatabase.cpp57
1 files changed, 52 insertions, 5 deletions
diff --git a/Source/WebCore/storage/IDBDatabase.cpp b/Source/WebCore/storage/IDBDatabase.cpp
index 9a5eb6c..fe8d350 100644
--- a/Source/WebCore/storage/IDBDatabase.cpp
+++ b/Source/WebCore/storage/IDBDatabase.cpp
@@ -26,13 +26,17 @@
#include "config.h"
#include "IDBDatabase.h"
+#include "Document.h"
+#include "EventQueue.h"
#include "IDBAny.h"
#include "IDBDatabaseError.h"
#include "IDBDatabaseException.h"
+#include "IDBEventDispatcher.h"
#include "IDBFactoryBackendInterface.h"
#include "IDBIndex.h"
#include "IDBObjectStore.h"
-#include "IDBRequest.h"
+#include "IDBVersionChangeEvent.h"
+#include "IDBVersionChangeRequest.h"
#include "IDBTransaction.h"
#include "ScriptExecutionContext.h"
#include <limits>
@@ -58,7 +62,6 @@ IDBDatabase::IDBDatabase(ScriptExecutionContext* context, PassRefPtr<IDBDatabase
IDBDatabase::~IDBDatabase()
{
- ASSERT(m_stopped);
}
void IDBDatabase::setSetVersionTransaction(IDBTransaction* transaction)
@@ -97,10 +100,10 @@ void IDBDatabase::deleteObjectStore(const String& name, ExceptionCode& ec)
m_backend->deleteObjectStore(name, m_setVersionTransaction->backend(), ec);
}
-PassRefPtr<IDBRequest> IDBDatabase::setVersion(ScriptExecutionContext* context, const String& version, ExceptionCode& ec)
+PassRefPtr<IDBVersionChangeRequest> IDBDatabase::setVersion(ScriptExecutionContext* context, const String& version, ExceptionCode& ec)
{
- RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), 0);
- m_backend->setVersion(version, request, ec);
+ RefPtr<IDBVersionChangeRequest> request = IDBVersionChangeRequest::create(context, IDBAny::create(this), version);
+ m_backend->setVersion(version, request, this, ec);
return request;
}
@@ -136,7 +139,27 @@ PassRefPtr<IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext* cont
void IDBDatabase::close()
{
+ if (m_noNewTransactions)
+ return;
+
+ ASSERT(scriptExecutionContext()->isDocument());
+ EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue();
+ // Remove any pending versionchange events scheduled to fire on this
+ // connection. They would have been scheduled by the backend when another
+ // connection called setVersion, but the frontend connection is being
+ // closed before they could fire.
+ for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) {
+ bool removed = eventQueue->cancelEvent(m_enqueuedEvents[i].get());
+ ASSERT_UNUSED(removed, removed);
+ }
+
m_noNewTransactions = true;
+ m_backend->close(this);
+}
+
+void IDBDatabase::onVersionChange(const String& version)
+{
+ enqueueEvent(IDBVersionChangeEvent::create(version, eventNames().versionchangeEvent));
}
bool IDBDatabase::hasPendingActivity() const
@@ -149,6 +172,30 @@ bool IDBDatabase::hasPendingActivity() const
return !m_stopped || ActiveDOMObject::hasPendingActivity();
}
+void IDBDatabase::open()
+{
+ m_backend->open(this);
+}
+
+void IDBDatabase::enqueueEvent(PassRefPtr<Event> event)
+{
+ ASSERT(scriptExecutionContext()->isDocument());
+ EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue();
+ event->setTarget(this);
+ eventQueue->enqueueEvent(event.get());
+ m_enqueuedEvents.append(event);
+}
+
+bool IDBDatabase::dispatchEvent(PassRefPtr<Event> event)
+{
+ ASSERT(event->type() == eventNames().versionchangeEvent);
+ for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) {
+ if (m_enqueuedEvents[i].get() == event.get())
+ m_enqueuedEvents.remove(i);
+ }
+ return EventTarget::dispatchEvent(event.get());
+}
+
void IDBDatabase::stop()
{
// Stop fires at a deterministic time, so we need to call close in it.