void IDBOpenDBRequest::onSuccess(const IDBResultData& resultData) { LOG(IndexedDB, "IDBOpenDBRequest::onSuccess()"); ASSERT(currentThread() == originThreadID()); setResult(IDBDatabase::create(*scriptExecutionContext(), connectionProxy(), resultData)); m_isDone = true; enqueueEvent(IDBRequestCompletionEvent::create(eventNames().successEvent, false, false, *this)); }
void IDBOpenDBRequest::requestCompleted(const IDBResultData& data) { LOG(IndexedDB, "IDBOpenDBRequest::requestCompleted"); ASSERT(currentThread() == originThreadID()); // If an Open request was completed after the page has navigated, leaving this request // with a stopped script execution context, we need to message back to the server so it // doesn't hang waiting on a database connection or transaction that will never exist. if (m_contextStopped) { switch (data.type()) { case IDBResultType::OpenDatabaseSuccess: connectionProxy().abortOpenAndUpgradeNeeded(data.databaseConnectionIdentifier(), IDBResourceIdentifier::emptyValue()); break; case IDBResultType::OpenDatabaseUpgradeNeeded: connectionProxy().abortOpenAndUpgradeNeeded(data.databaseConnectionIdentifier(), data.transactionInfo().identifier()); break; default: break; } return; } switch (data.type()) { case IDBResultType::Error: onError(data); break; case IDBResultType::OpenDatabaseSuccess: onSuccess(data); break; case IDBResultType::OpenDatabaseUpgradeNeeded: onUpgradeNeeded(data); break; case IDBResultType::DeleteDatabaseSuccess: onDeleteDatabaseSuccess(data); break; default: RELEASE_ASSERT_NOT_REACHED(); } }
bool IDBDatabase::dispatchEvent(Event& event) { LOG(IndexedDB, "IDBDatabase::dispatchEvent (%" PRIu64 ") (%p)", m_databaseConnectionIdentifier, this); ASSERT(currentThread() == originThreadID()); bool result = EventTargetWithInlineData::dispatchEvent(event); if (event.isVersionChangeEvent() && event.type() == m_eventNames.versionchangeEvent) connectionProxy().didFireVersionChangeEvent(m_databaseConnectionIdentifier, downcast<IDBVersionChangeEvent>(event).requestIdentifier()); return result; }
void IDBDatabase::fireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion) { uint64_t currentVersion = m_info.version(); LOG(IndexedDB, "IDBDatabase::fireVersionChangeEvent - current version %" PRIu64 ", requested version %" PRIu64 ", connection %" PRIu64 " (%p)", currentVersion, requestedVersion, m_databaseConnectionIdentifier, this); ASSERT(&originThread() == &Thread::current()); if (!scriptExecutionContext() || m_closePending) { connectionProxy().didFireVersionChangeEvent(m_databaseConnectionIdentifier, requestIdentifier); return; } Ref<Event> event = IDBVersionChangeEvent::create(requestIdentifier, currentVersion, requestedVersion, m_eventNames.versionchangeEvent); event->setTarget(this); scriptExecutionContext()->eventQueue().enqueueEvent(WTFMove(event)); }
void IDBOpenDBRequest::onUpgradeNeeded(const IDBResultData& resultData) { ASSERT(currentThread() == originThreadID()); Ref<IDBDatabase> database = IDBDatabase::create(*scriptExecutionContext(), connectionProxy(), resultData); Ref<IDBTransaction> transaction = database->startVersionChangeTransaction(resultData.transactionInfo(), *this); ASSERT(transaction->info().mode() == IndexedDB::TransactionMode::VersionChange); ASSERT(transaction->originalDatabaseInfo()); uint64_t oldVersion = transaction->originalDatabaseInfo()->version(); uint64_t newVersion = transaction->info().newVersion(); LOG(IndexedDB, "IDBOpenDBRequest::onUpgradeNeeded() - current version is %" PRIu64 ", new is %" PRIu64, oldVersion, newVersion); setResult(WTFMove(database)); m_isDone = true; m_transaction = WTFMove(transaction); m_transaction->addRequest(*this); enqueueEvent(IDBVersionChangeEvent::create(oldVersion, newVersion, eventNames().upgradeneededEvent)); }
void IDBOpenDBRequest::cancelForStop() { connectionProxy().openDBRequestCancelled({ connectionProxy(), *this }); }