diff options
Diffstat (limited to 'dom/fetch/FetchService.cpp')
-rw-r--r-- | dom/fetch/FetchService.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/dom/fetch/FetchService.cpp b/dom/fetch/FetchService.cpp index e32d6f178e..b285d65692 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 = FetchService::GetInstance(); MOZ_ASSERT(fetchService); @@ -414,7 +431,10 @@ void FetchService::FetchInstance::OnReportPerformanceTiming() { UniquePtr<PerformanceTimingData> 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(); |