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
This commit is contained in:
Eden Chuang 2024-01-29 11:02:14 +00:00
parent 5d0579eca6
commit 305928a56a
2 changed files with 29 additions and 8 deletions

View File

@ -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;

View File

@ -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();