mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
0e0e7832ed
commit
90427d7da3
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user