From 305928a56a6e0bb6e71325d7362131fe894dce6d Mon Sep 17 00:00:00 2001 From: Eden Chuang Date: Mon, 29 Jan 2024 11:02:14 +0000 Subject: [PATCH] Bug 1871498 - Let FetchDriver::RunAbortAlogrithm() resolving FetchInstance::mPromises by calling FetchObserver::OnResponseEnd(). r=dom-worker-reviewers,smaug Differential Revision: https://phabricator.services.mozilla.com/D198685 --- dom/fetch/FetchDriver.cpp | 1 + dom/fetch/FetchService.cpp | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/dom/fetch/FetchDriver.cpp b/dom/fetch/FetchDriver.cpp index 1b504f4717da..77fe5e59bb73 100644 --- a/dom/fetch/FetchDriver.cpp +++ b/dom/fetch/FetchDriver.cpp @@ -970,6 +970,7 @@ void FetchDriver::FailWithNetworkError(nsresult rv) { // mObserver could be null after OnResponseAvailable(). if (mObserver) { + mObserver->OnReportPerformanceTiming(); mObserver->OnResponseEnd(FetchDriverObserver::eByNetworking, JS::UndefinedHandleValue); mObserver = nullptr; diff --git a/dom/fetch/FetchService.cpp b/dom/fetch/FetchService.cpp index 87482c12a114..77decbc56f51 100644 --- a/dom/fetch/FetchService.cpp +++ b/dom/fetch/FetchService.cpp @@ -256,8 +256,13 @@ void FetchService::FetchInstance::Cancel() { FETCH_LOG(("FetchInstance::Cancel() [%p]", this)); + // If mFetchDriver is not null here, FetchInstance::Fetch() has already + // started, let mFetchDriver::RunAbortAlgorithm() to call + // FetchInstance::OnResponseEnd() to resolve the pending promises. + // Otherwise, resolving the pending promises here. if (mFetchDriver) { mFetchDriver->RunAbortAlgorithm(); + return; } MOZ_ASSERT(mPromises); @@ -294,18 +299,30 @@ void FetchService::FetchInstance::OnResponseEnd( MOZ_ASSERT(mPromises); - // If ResponseTimingPromise is not resolved, it means the fetch is aborted. - // Resolving ResponseTimingPromise with an emtpy ResponseTiming. - if (!mPromises->GetResponseTimingPromise()->IsResolved()) { - mPromises->ResolveResponseTimingPromise(ResponseTiming(), __func__); - } - // Resolve the ResponseEndPromise - mPromises->ResolveResponseEndPromise(ResponseEndArgs(aReason), __func__); - if (aReason == eAborted) { + // If ResponseAvailablePromise has not resolved yet, resolved with + // NS_ERROR_DOM_ABORT_ERR response. + if (!mPromises->GetResponseAvailablePromise()->IsResolved()) { + mPromises->ResolveResponseAvailablePromise( + InternalResponse::NetworkError(NS_ERROR_DOM_ABORT_ERR), __func__); + } + + // If ResponseTimingPromise has not resolved yet, resolved with empty + // ResponseTiming. + if (!mPromises->GetResponseTimingPromise()->IsResolved()) { + mPromises->ResolveResponseTimingPromise(ResponseTiming(), __func__); + } + // Resolve the ResponseEndPromise + mPromises->ResolveResponseEndPromise(ResponseEndArgs(aReason), __func__); return; } + MOZ_ASSERT(mPromises->GetResponseAvailablePromise()->IsResolved() && + mPromises->GetResponseTimingPromise()->IsResolved()); + + // Resolve the ResponseEndPromise + mPromises->ResolveResponseEndPromise(ResponseEndArgs(aReason), __func__); + // Remove the FetchInstance from FetchInstanceTable RefPtr fetchService = FetchService::GetInstance(); MOZ_ASSERT(fetchService); @@ -414,7 +431,10 @@ void FetchService::FetchInstance::OnReportPerformanceTiming() { UniquePtr performanceTiming( mFetchDriver->GetPerformanceTimingData(timing.initiatorType(), timing.entryName())); + // FetchDriver has no corresponding performance timing when fetch() failed. + // Resolve the ResponseTimingPromise with empty timing. if (!performanceTiming) { + mPromises->ResolveResponseTimingPromise(ResponseTiming(), __func__); return; } timing.timingData() = performanceTiming->ToIPC();