Bug 1598164 - Align ReadyState with states defined in the spec. r=dom-workers-and-storage-reviewers,edenchuang

Differential Revision: https://phabricator.services.mozilla.com/D54322

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Simon Giesecke 2019-11-28 16:00:29 +00:00
parent 0e0e7832ed
commit 90427d7da3
7 changed files with 84 additions and 84 deletions

View File

@ -689,13 +689,14 @@ void DispatchErrorEvent(IDBRequest* aRequest, nsresult aErrorCode,
return;
}
MOZ_ASSERT(!transaction || transaction->IsOpen() || transaction->IsAborted());
MOZ_ASSERT(!transaction || transaction->CanAcceptRequests() ||
transaction->IsAborted());
// Do not abort the transaction here if this request is failed due to the
// abortion of its transaction to ensure that the correct error cause of
// the abort event be set in IDBTransaction::FireCompleteOrAbortEvents()
// later.
if (transaction && transaction->IsOpen() &&
if (transaction && transaction->CanAcceptRequests() &&
aErrorCode != NS_ERROR_DOM_INDEXEDDB_ABORT_ERR) {
WidgetEvent* const internalEvent = aEvent->WidgetEventPtr();
MOZ_ASSERT(internalEvent);
@ -738,7 +739,7 @@ void DispatchSuccessEvent(ResultHelper* aResultHelper,
request->SetResultCallback(aResultHelper);
MOZ_ASSERT(aEvent);
MOZ_ASSERT_IF(transaction, transaction->IsOpen());
MOZ_ASSERT_IF(transaction, transaction->CanAcceptRequests());
if (transaction) {
IDB_LOG_MARK_CHILD_TRANSACTION_REQUEST(
@ -752,7 +753,7 @@ void DispatchSuccessEvent(ResultHelper* aResultHelper,
}
MOZ_ASSERT_IF(transaction,
transaction->IsOpen() && !transaction->IsAborted());
transaction->CanAcceptRequests() && !transaction->IsAborted());
IgnoredErrorResult rv;
request->DispatchEvent(*aEvent, rv);
@ -763,7 +764,7 @@ void DispatchSuccessEvent(ResultHelper* aResultHelper,
WidgetEvent* const internalEvent = aEvent->WidgetEventPtr();
MOZ_ASSERT(internalEvent);
if (transaction && transaction->IsOpen()) {
if (transaction && transaction->CanAcceptRequests()) {
if (internalEvent->mFlags.mExceptionWasRaised) {
transaction->Abort(NS_ERROR_DOM_INDEXEDDB_ABORT_ERR);
} else {

View File

@ -195,7 +195,7 @@ void IDBCursor::DropJSObjects() {
bool IDBCursor::IsSourceDeleted() const {
AssertIsOnOwningThread();
MOZ_ASSERT(mTransaction);
MOZ_ASSERT(mTransaction->IsOpen());
MOZ_ASSERT(mTransaction->CanAcceptRequests());
IDBObjectStore* sourceObjectStore;
if (mType == Type_Index || mType == Type_IndexKey) {
@ -376,7 +376,7 @@ void IDBCursor::Continue(JSContext* aCx, JS::Handle<JS::Value> aKey,
ErrorResult& aRv) {
AssertIsOnOwningThread();
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}
@ -466,7 +466,7 @@ void IDBCursor::ContinuePrimaryKey(JSContext* aCx, JS::Handle<JS::Value> aKey,
ErrorResult& aRv) {
AssertIsOnOwningThread();
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}
@ -575,7 +575,7 @@ void IDBCursor::Advance(uint32_t aCount, ErrorResult& aRv) {
return;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}
@ -618,7 +618,7 @@ already_AddRefed<IDBRequest> IDBCursor::Update(JSContext* aCx,
ErrorResult& aRv) {
AssertIsOnOwningThread();
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -729,7 +729,7 @@ already_AddRefed<IDBRequest> IDBCursor::Delete(JSContext* aCx,
ErrorResult& aRv) {
AssertIsOnOwningThread();
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}

View File

@ -374,7 +374,7 @@ already_AddRefed<IDBObjectStore> IDBDatabase::CreateObjectStore(
return nullptr;
}
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -447,7 +447,7 @@ void IDBDatabase::DeleteObjectStore(const nsAString& aName, ErrorResult& aRv) {
return;
}
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}
@ -740,7 +740,7 @@ void IDBDatabase::AbortTransactions(bool aShouldWarn) {
// Transactions that are already done can simply be ignored. Otherwise
// there is a race here and it's possible that the transaction has not
// been successfully committed yet so we will warn the user.
if (!transaction->IsDone()) {
if (!transaction->IsFinished()) {
transactionsToAbort.AppendElement(transaction);
}
}
@ -761,7 +761,7 @@ void IDBDatabase::AbortTransactions(bool aShouldWarn) {
for (RefPtr<IDBTransaction>& transaction : transactionsToAbort) {
MOZ_ASSERT(transaction);
MOZ_ASSERT(!transaction->IsDone());
MOZ_ASSERT(!transaction->IsFinished());
// We warn for any transactions that could have written data, but
// ignore read-only transactions.

View File

@ -138,7 +138,7 @@ void IDBIndex::SetName(const nsAString& aName, ErrorResult& aRv) {
return;
}
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}
@ -271,7 +271,7 @@ already_AddRefed<IDBRequest> IDBIndex::GetInternal(bool aKeyOnly,
}
IDBTransaction* transaction = mObjectStore->Transaction();
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -346,7 +346,7 @@ already_AddRefed<IDBRequest> IDBIndex::GetAllInternal(
}
IDBTransaction* transaction = mObjectStore->Transaction();
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -421,7 +421,7 @@ already_AddRefed<IDBRequest> IDBIndex::OpenCursorInternal(
}
IDBTransaction* transaction = mObjectStore->Transaction();
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -503,7 +503,7 @@ already_AddRefed<IDBRequest> IDBIndex::Count(JSContext* aCx,
}
IDBTransaction* const transaction = mObjectStore->Transaction();
if (!transaction->IsOpen()) {
if (!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}

View File

@ -1500,7 +1500,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::AddOrPut(
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -1523,7 +1523,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::AddOrPut(
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -1693,7 +1693,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::GetAllInternal(
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -1764,7 +1764,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::Clear(JSContext* aCx,
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -1797,7 +1797,7 @@ already_AddRefed<IDBIndex> IDBObjectStore::Index(const nsAString& aName,
ErrorResult& aRv) {
AssertIsOnOwningThread();
if (mTransaction->IsCommittingOrDone() || mDeletedSpec) {
if (mTransaction->IsCommittingOrFinished() || mDeletedSpec) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
@ -1935,7 +1935,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::GetInternal(
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -1992,7 +1992,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::DeleteInternal(
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -2050,7 +2050,8 @@ already_AddRefed<IDBIndex> IDBObjectStore::CreateIndex(
}
IDBTransaction* const transaction = IDBTransaction::GetCurrent();
if (!transaction || transaction != mTransaction || !transaction->IsOpen()) {
if (!transaction || transaction != mTransaction ||
!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -2150,7 +2151,8 @@ void IDBObjectStore::DeleteIndex(const nsAString& aName, ErrorResult& aRv) {
}
IDBTransaction* transaction = IDBTransaction::GetCurrent();
if (!transaction || transaction != mTransaction || !transaction->IsOpen()) {
if (!transaction || transaction != mTransaction ||
!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}
@ -2220,7 +2222,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::Count(JSContext* aCx,
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -2272,7 +2274,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::OpenCursorInternal(
return nullptr;
}
if (!mTransaction->IsOpen()) {
if (!mTransaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return nullptr;
}
@ -2426,7 +2428,8 @@ void IDBObjectStore::SetName(const nsAString& aName, ErrorResult& aRv) {
}
IDBTransaction* transaction = IDBTransaction::GetCurrent();
if (!transaction || transaction != mTransaction || !transaction->IsOpen()) {
if (!transaction || transaction != mTransaction ||
!transaction->CanAcceptRequests()) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR);
return;
}

View File

@ -103,7 +103,6 @@ IDBTransaction::IDBTransaction(IDBDatabase* const aDatabase,
mFilename(std::move(aFilename)),
mLineNo(aLineNo),
mColumn(aColumn),
mReadyState(IDBTransaction::ReadyState::Initial),
mMode(aMode),
mCreating(false),
mRegistered(false),
@ -227,7 +226,7 @@ already_AddRefed<IDBTransaction> IDBTransaction::Create(
RefPtr<StrongWorkerRef> workerRef = StrongWorkerRef::Create(
workerPrivate, "IDBTransaction", [transaction]() {
transaction->AssertIsOnOwningThread();
if (!transaction->IsCommittingOrDone()) {
if (!transaction->IsCommittingOrFinished()) {
IDB_REPORT_INTERNAL_ERR();
transaction->AbortInternal(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR,
nullptr);
@ -340,8 +339,9 @@ void IDBTransaction::OnNewRequest() {
AssertIsOnOwningThread();
if (!mPendingRequestCount) {
MOZ_ASSERT(ReadyState::Initial == mReadyState);
mReadyState = ReadyState::Loading;
MOZ_ASSERT(ReadyState::Active == mReadyState);
MOZ_ASSERT(!mStarted);
mStarted = true;
}
++mPendingRequestCount;
@ -350,12 +350,17 @@ void IDBTransaction::OnNewRequest() {
void IDBTransaction::OnRequestFinished(
const bool aRequestCompletedSuccessfully) {
AssertIsOnOwningThread();
MOZ_ASSERT(mReadyState == ReadyState::Active ||
mReadyState == ReadyState::Finished);
MOZ_ASSERT_IF(mReadyState == ReadyState::Finished, !NS_SUCCEEDED(mAbortCode));
MOZ_ASSERT(mPendingRequestCount);
--mPendingRequestCount;
if (!mPendingRequestCount) {
mReadyState = ReadyState::Committing;
if (mReadyState == ReadyState::Active) {
mReadyState = ReadyState::Committing;
}
if (aRequestCompletedSuccessfully) {
if (NS_SUCCEEDED(mAbortCode)) {
@ -380,7 +385,7 @@ void IDBTransaction::OnRequestFinished(
void IDBTransaction::SendCommit() {
AssertIsOnOwningThread();
MOZ_ASSERT(NS_SUCCEEDED(mAbortCode));
MOZ_ASSERT(IsCommittingOrDone());
MOZ_ASSERT(IsCommittingOrFinished());
MOZ_ASSERT(!mSentCommitOrAbort);
MOZ_ASSERT(!mPendingRequestCount);
@ -402,7 +407,7 @@ void IDBTransaction::SendCommit() {
void IDBTransaction::SendAbort(const nsresult aResultCode) {
AssertIsOnOwningThread();
MOZ_ASSERT(NS_FAILED(aResultCode));
MOZ_ASSERT(IsCommittingOrDone());
MOZ_ASSERT(IsCommittingOrFinished());
MOZ_ASSERT(!mSentCommitOrAbort);
// Don't do this in the macro because we always need to increment the serial
@ -438,25 +443,17 @@ void IDBTransaction::MaybeNoteInactiveTransaction() {
}
}
bool IDBTransaction::IsOpen() const {
bool IDBTransaction::CanAcceptRequests() const {
AssertIsOnOwningThread();
// If we haven't started anything then we're open.
if (mReadyState == IDBTransaction::ReadyState::Initial) {
return true;
}
// If we haven't started anything then we can accept requests.
// If we've already started then we need to check to see if we still have the
// mCreating flag set. If we do (i.e. we haven't returned to the event loop
// from the time we were created) then we are open. Otherwise check the
// currently running transaction to see if it's the same. We only allow other
// requests to be made if this transaction is currently running.
if (mReadyState == IDBTransaction::ReadyState::Loading &&
(mCreating || GetCurrent() == this)) {
return true;
}
return false;
// from the time we were created) then we can accept requests. Otherwise check
// the currently running transaction to see if it's the same. We only allow
// other requests to be made if this transaction is currently running.
return mReadyState == ReadyState::Active &&
(!mStarted || mCreating || GetCurrent() == this);
}
void IDBTransaction::GetCallerLocation(nsAString& aFilename,
@ -477,7 +474,7 @@ already_AddRefed<IDBObjectStore> IDBTransaction::CreateObjectStore(
MOZ_ASSERT(aSpec.metadata().id());
MOZ_ASSERT(Mode::VersionChange == mMode);
MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor);
MOZ_ASSERT(IsOpen());
MOZ_ASSERT(CanAcceptRequests());
#ifdef DEBUG
{
@ -511,7 +508,7 @@ void IDBTransaction::DeleteObjectStore(const int64_t aObjectStoreId) {
MOZ_ASSERT(aObjectStoreId);
MOZ_ASSERT(Mode::VersionChange == mMode);
MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor);
MOZ_ASSERT(IsOpen());
MOZ_ASSERT(CanAcceptRequests());
MOZ_ALWAYS_TRUE(
mBackgroundActor.mVersionChangeBackgroundActor->SendDeleteObjectStore(
@ -540,7 +537,7 @@ void IDBTransaction::RenameObjectStore(const int64_t aObjectStoreId,
MOZ_ASSERT(aObjectStoreId);
MOZ_ASSERT(Mode::VersionChange == mMode);
MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor);
MOZ_ASSERT(IsOpen());
MOZ_ASSERT(CanAcceptRequests());
MOZ_ALWAYS_TRUE(
mBackgroundActor.mVersionChangeBackgroundActor->SendRenameObjectStore(
@ -554,7 +551,7 @@ void IDBTransaction::CreateIndex(IDBObjectStore* const aObjectStore,
MOZ_ASSERT(aMetadata.id());
MOZ_ASSERT(Mode::VersionChange == mMode);
MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor);
MOZ_ASSERT(IsOpen());
MOZ_ASSERT(CanAcceptRequests());
MOZ_ALWAYS_TRUE(
mBackgroundActor.mVersionChangeBackgroundActor->SendCreateIndex(
@ -568,7 +565,7 @@ void IDBTransaction::DeleteIndex(IDBObjectStore* const aObjectStore,
MOZ_ASSERT(aIndexId);
MOZ_ASSERT(Mode::VersionChange == mMode);
MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor);
MOZ_ASSERT(IsOpen());
MOZ_ASSERT(CanAcceptRequests());
MOZ_ALWAYS_TRUE(
mBackgroundActor.mVersionChangeBackgroundActor->SendDeleteIndex(
@ -583,7 +580,7 @@ void IDBTransaction::RenameIndex(IDBObjectStore* const aObjectStore,
MOZ_ASSERT(aIndexId);
MOZ_ASSERT(Mode::VersionChange == mMode);
MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor);
MOZ_ASSERT(IsOpen());
MOZ_ASSERT(CanAcceptRequests());
MOZ_ALWAYS_TRUE(
mBackgroundActor.mVersionChangeBackgroundActor->SendRenameIndex(
@ -594,15 +591,15 @@ void IDBTransaction::AbortInternal(const nsresult aAbortCode,
already_AddRefed<DOMException> aError) {
AssertIsOnOwningThread();
MOZ_ASSERT(NS_FAILED(aAbortCode));
MOZ_ASSERT(!IsCommittingOrDone());
MOZ_ASSERT(!IsCommittingOrFinished());
RefPtr<DOMException> error = aError;
const bool isVersionChange = mMode == Mode::VersionChange;
const bool needToSendAbort = mReadyState == ReadyState::Initial;
const bool needToSendAbort = mReadyState == ReadyState::Active && !mStarted;
mAbortCode = aAbortCode;
mReadyState = ReadyState::Done;
mReadyState = ReadyState::Finished;
mError = error.forget();
if (isVersionChange) {
@ -617,7 +614,8 @@ void IDBTransaction::AbortInternal(const nsresult aAbortCode,
// not for the mIndexes/mDeletedIndexes of each IDBObjectStore because it's
// time-consuming(O(m*n)) and mIndexes/mDeletedIndexes won't be used anymore
// in IDBObjectStore::(Create|Delete)Index() and IDBObjectStore::Index() in
// which all the executions are returned earlier by !transaction->IsOpen().
// which all the executions are returned earlier by
// !transaction->CanAcceptRequests().
const nsTArray<ObjectStoreSpec>& specArray =
mDatabase->Spec()->objectStores();
@ -669,7 +667,7 @@ void IDBTransaction::Abort(IDBRequest* const aRequest) {
AssertIsOnOwningThread();
MOZ_ASSERT(aRequest);
if (IsCommittingOrDone()) {
if (IsCommittingOrFinished()) {
// Already started (and maybe finished) the commit or abort so there is
// nothing to do here.
return;
@ -684,7 +682,7 @@ void IDBTransaction::Abort(IDBRequest* const aRequest) {
void IDBTransaction::Abort(const nsresult aErrorCode) {
AssertIsOnOwningThread();
if (IsCommittingOrDone()) {
if (IsCommittingOrFinished()) {
// Already started (and maybe finished) the commit or abort so there is
// nothing to do here.
return;
@ -697,7 +695,7 @@ void IDBTransaction::Abort(const nsresult aErrorCode) {
void IDBTransaction::Abort(ErrorResult& aRv) {
AssertIsOnOwningThread();
if (IsCommittingOrDone()) {
if (IsCommittingOrFinished()) {
aRv = NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR;
return;
}
@ -712,7 +710,7 @@ void IDBTransaction::FireCompleteOrAbortEvents(const nsresult aResult) {
AssertIsOnOwningThread();
MOZ_ASSERT(!mFiredCompleteOrAbort);
mReadyState = ReadyState::Done;
mReadyState = ReadyState::Finished;
#ifdef DEBUG
mFiredCompleteOrAbort = true;
@ -863,7 +861,7 @@ already_AddRefed<IDBObjectStore> IDBTransaction::ObjectStore(
const nsAString& aName, ErrorResult& aRv) {
AssertIsOnOwningThread();
if (IsCommittingOrDone()) {
if (IsCommittingOrFinished()) {
aRv.ThrowDOMException(
NS_ERROR_DOM_INVALID_STATE_ERR,
NS_LITERAL_CSTRING("Transaction is already committing or done."));
@ -958,8 +956,8 @@ IDBTransaction::Run() {
mCreating = false;
// Maybe commit if there were no requests generated.
if (mReadyState == IDBTransaction::ReadyState::Initial) {
mReadyState = ReadyState::Done;
if (mReadyState == ReadyState::Active && !mStarted) {
mReadyState = ReadyState::Finished;
SendCommit();
}

View File

@ -59,7 +59,7 @@ class IDBTransaction final : public DOMEventTargetHelper, public nsIRunnable {
Invalid
};
enum struct ReadyState { Initial = 0, Loading, Inactive, Committing, Done };
enum struct ReadyState { Active, Inactive, Committing, Finished };
private:
// TODO: Only non-const because of Bug 1575173.
@ -101,7 +101,8 @@ class IDBTransaction final : public DOMEventTargetHelper, public nsIRunnable {
const uint32_t mLineNo;
const uint32_t mColumn;
ReadyState mReadyState;
ReadyState mReadyState = ReadyState::Active;
bool mStarted = false;
const Mode mMode;
bool mCreating; ///< Set between successful creation until the transaction
@ -163,19 +164,19 @@ class IDBTransaction final : public DOMEventTargetHelper, public nsIRunnable {
void RefreshSpec(bool aMayDelete);
bool IsOpen() const;
bool CanAcceptRequests() const;
bool IsCommittingOrDone() const {
bool IsCommittingOrFinished() const {
AssertIsOnOwningThread();
return mReadyState == ReadyState::Committing ||
mReadyState == ReadyState::Done;
mReadyState == ReadyState::Finished;
}
bool IsDone() const {
bool IsFinished() const {
AssertIsOnOwningThread();
return mReadyState == ReadyState::Done;
return mReadyState == ReadyState::Finished;
}
bool IsWriteAllowed() const {
@ -191,14 +192,11 @@ class IDBTransaction final : public DOMEventTargetHelper, public nsIRunnable {
auto TemporarilyProceedToInactive() {
AssertIsOnOwningThread();
MOZ_ASSERT(mReadyState == ReadyState::Initial ||
mReadyState == ReadyState::Loading);
const auto savedReadyState = mReadyState;
MOZ_ASSERT(mReadyState == ReadyState::Active);
mReadyState = ReadyState::Inactive;
struct AutoRestoreState {
IDBTransaction& mOwner;
ReadyState mSavedReadyState;
#ifdef DEBUG
uint32_t mSavedPendingRequestCount;
#endif
@ -208,11 +206,11 @@ class IDBTransaction final : public DOMEventTargetHelper, public nsIRunnable {
MOZ_ASSERT(mOwner.mReadyState == ReadyState::Inactive);
MOZ_ASSERT(mOwner.mPendingRequestCount == mSavedPendingRequestCount);
mOwner.mReadyState = mSavedReadyState;
mOwner.mReadyState = ReadyState::Active;
}
};
return AutoRestoreState{*this, savedReadyState
return AutoRestoreState{*this
#ifdef DEBUG
,
mPendingRequestCount