RefPtr<IDBRequest> IDBObjectStore::doCount(ScriptExecutionContext& context, const IDBKeyRangeData& range, ExceptionCodeWithMessage& ec) { ASSERT(currentThread() == m_transaction->database().originThreadID()); // The IDB spec for several IDBObjectStore methods states that transaction related exceptions should fire before // the exception for an object store being deleted. // However, a handful of W3C IDB tests expect the deleted exception even though the transaction inactive exception also applies. // Additionally, Chrome and Edge agree with the test, as does Legacy IDB in WebKit. // Until this is sorted out, we'll agree with the test and the majority share browsers. if (m_deleted) { ec.code = IDBDatabaseException::InvalidStateError; ec.message = ASCIILiteral("Failed to execute 'count' on 'IDBObjectStore': The object store has been deleted."); return nullptr; } if (!m_transaction->isActive()) { ec.code = IDBDatabaseException::TransactionInactiveError; ec.message = ASCIILiteral("Failed to execute 'count' on 'IDBObjectStore': The transaction is inactive or finished."); return nullptr; } if (!range.isValid()) { ec.code = IDBDatabaseException::DataError; return nullptr; } return m_transaction->requestCount(context, *this, range); }
ExceptionOr<Ref<IDBRequest>> IDBIndex::doCount(ExecState& execState, const IDBKeyRangeData& range) { ASSERT(currentThread() == m_objectStore.transaction().database().originThreadID()); if (m_deleted || m_objectStore.isDeleted()) return Exception { IDBDatabaseException::InvalidStateError, ASCIILiteral("Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.") }; if (!range.isValid()) return Exception { IDBDatabaseException::DataError }; auto& transaction = m_objectStore.transaction(); if (!transaction.isActive()) return Exception { IDBDatabaseException::TransactionInactiveError, ASCIILiteral("Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.") }; return transaction.requestCount(execState, *this, range); }
RefPtr<WebCore::IDBRequest> IDBIndex::doCount(ScriptExecutionContext& context, const IDBKeyRangeData& range, ExceptionCodeWithMessage& ec) { if (m_deleted || m_objectStore->isDeleted()) { ec.code = IDBDatabaseException::InvalidStateError; ec.message = ASCIILiteral("Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted."); return nullptr; } if (!range.isValid()) { ec.code = IDBDatabaseException::DataError; return nullptr; } auto& transaction = m_objectStore->modernTransaction(); if (!transaction.isActive()) { ec.code = IDBDatabaseException::TransactionInactiveError; ec.message = ASCIILiteral("Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished."); return nullptr; } return transaction.requestCount(context, *this, range); }