diff --git a/dom/indexedDB/IDBObjectStore.cpp b/dom/indexedDB/IDBObjectStore.cpp index a5b3404d7021..fd024822852f 100644 --- a/dom/indexedDB/IDBObjectStore.cpp +++ b/dom/indexedDB/IDBObjectStore.cpp @@ -774,18 +774,18 @@ RefPtr IDBObjectStore::AddOrPut(JSContext* aCx, StructuredCloneWriteInfo cloneWriteInfo(mTransaction->Database()); nsTArray updateInfos; - { - const auto autoStateRestore = - mTransaction->TemporarilyTransitionToInactive(); - GetAddInfo(aCx, aValueWrapper, aKey, cloneWriteInfo, key, updateInfos, aRv); - } - - if (aRv.Failed()) { + // According to spec https://w3c.github.io/IndexedDB/#clone-value, + // the transaction must be in inactive state during clone + mTransaction->TransitionToInactive(); + GetAddInfo(aCx, aValueWrapper, aKey, cloneWriteInfo, key, updateInfos, aRv); + if (mTransaction + ->IsAborted()) { // No error thrown, abort is a possible outcome return nullptr; } + MOZ_ASSERT(mTransaction->IsInactive()); + mTransaction->TransitionToActive(); - if (!mTransaction->IsActive()) { - aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR); + if (aRv.Failed()) { return nullptr; } diff --git a/dom/indexedDB/IDBTransaction.cpp b/dom/indexedDB/IDBTransaction.cpp index cda7dc1e05fb..df46d3e020d2 100644 --- a/dom/indexedDB/IDBTransaction.cpp +++ b/dom/indexedDB/IDBTransaction.cpp @@ -453,18 +453,6 @@ void IDBTransaction::MaybeNoteInactiveTransaction() { } } -IDBTransaction::AutoRestoreState -IDBTransaction::TemporarilyTransitionToActive() { - return AutoRestoreState{*this}; -} - -IDBTransaction::AutoRestoreState -IDBTransaction::TemporarilyTransitionToInactive() { - return AutoRestoreState{*this}; -} - void IDBTransaction::GetCallerLocation(nsAString& aFilename, uint32_t* const aLineNo, uint32_t* const aColumn) const { diff --git a/dom/indexedDB/IDBTransaction.h b/dom/indexedDB/IDBTransaction.h index 4acbba7969f2..8701917d1f83 100644 --- a/dom/indexedDB/IDBTransaction.h +++ b/dom/indexedDB/IDBTransaction.h @@ -208,39 +208,6 @@ class IDBTransaction final bool WasExplicitlyCommitted() const { return mWasExplicitlyCommitted; } #endif - template - class AutoRestoreState { - public: - explicit AutoRestoreState(IDBTransaction& aOwner) : mOwner { aOwner } -#ifdef DEBUG - , mSavedPendingRequestCount { mOwner.mPendingRequestCount } -#endif - { - mOwner.AssertIsOnOwningThread(); - MOZ_ASSERT(mOwner.mReadyState == OriginalState); - mOwner.mReadyState = TemporaryState; - } - - ~AutoRestoreState() { - mOwner.AssertIsOnOwningThread(); - MOZ_ASSERT(mOwner.mReadyState == TemporaryState); - MOZ_ASSERT(mOwner.mPendingRequestCount == mSavedPendingRequestCount); - - mOwner.mReadyState = OriginalState; - } - - private: - IDBTransaction& mOwner; -#ifdef DEBUG - const uint32_t mSavedPendingRequestCount; -#endif - }; - - AutoRestoreState - TemporarilyTransitionToActive(); - AutoRestoreState - TemporarilyTransitionToInactive(); - void TransitionToActive() { MOZ_ASSERT(mReadyState == ReadyState::Inactive); mReadyState = ReadyState::Active;