diff --git a/dom/cache/TypeUtils.cpp b/dom/cache/TypeUtils.cpp index d556bb1433ef..4393d81e5a07 100644 --- a/dom/cache/TypeUtils.cpp +++ b/dom/cache/TypeUtils.cpp @@ -255,7 +255,7 @@ TypeUtils::ToResponse(const CacheResponse& aIn) { if (aIn.type() == ResponseType::Error) { RefPtr error = InternalResponse::NetworkError(); - RefPtr r = new Response(GetGlobalObject(), error); + RefPtr r = new Response(GetGlobalObject(), error, nullptr); return r.forget(); } @@ -304,7 +304,7 @@ TypeUtils::ToResponse(const CacheResponse& aIn) } MOZ_DIAGNOSTIC_ASSERT(ir); - RefPtr ref = new Response(GetGlobalObject(), ir); + RefPtr ref = new Response(GetGlobalObject(), ir, nullptr); return ref.forget(); } already_AddRefed @@ -347,7 +347,8 @@ already_AddRefed TypeUtils::ToRequest(const CacheRequest& aIn) { RefPtr internalRequest = ToInternalRequest(aIn); - RefPtr request = new Request(GetGlobalObject(), internalRequest); + RefPtr request = + new Request(GetGlobalObject(), internalRequest, nullptr); return request.forget(); } diff --git a/dom/fetch/Fetch.cpp b/dom/fetch/Fetch.cpp index 992cd9716c1f..70ee3d7e9756 100644 --- a/dom/fetch/Fetch.cpp +++ b/dom/fetch/Fetch.cpp @@ -120,6 +120,12 @@ public: return mSignalMainThread; } + AbortSignal* + GetSignalForTargetThread() + { + return mFollowingSignal; + } + void Shutdown() { @@ -173,7 +179,7 @@ public: } AbortSignal* - GetAbortSignal() + GetAbortSignalForMainThread() { MOZ_ASSERT(NS_IsMainThread()); @@ -184,6 +190,18 @@ public: return mSignalProxy->GetOrCreateSignalForMainThread(); } + AbortSignal* + GetAbortSignalForTargetThread() + { + mPromiseProxy->GetWorkerPrivate()->AssertIsOnWorkerThread(); + + if (!mSignalProxy) { + return nullptr; + } + + return mSignalProxy->GetSignalForTargetThread(); + } + void OnResponseAvailableInternal(InternalResponse* aResponse) override; @@ -217,14 +235,17 @@ class MainThreadFetchResolver final : public FetchDriverObserver RefPtr mPromise; RefPtr mResponse; RefPtr mFetchObserver; + RefPtr mSignal; nsCOMPtr mLoadGroup; NS_DECL_OWNINGTHREAD public: - MainThreadFetchResolver(Promise* aPromise, FetchObserver* aObserver) + MainThreadFetchResolver(Promise* aPromise, FetchObserver* aObserver, + AbortSignal* aSignal) : mPromise(aPromise) , mFetchObserver(aObserver) + , mSignal(aSignal) {} void @@ -306,7 +327,7 @@ public: fetch->SetWorkerScript(spec); } - RefPtr signal = mResolver->GetAbortSignal(); + RefPtr signal = mResolver->GetAbortSignalForMainThread(); // ...but release it before calling Fetch, because mResolver's callback can // be called synchronously and they want the mutex, too. @@ -347,12 +368,7 @@ FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput, } RefPtr r = request->GetInternalRequest(); - - RefPtr signal; - if (aInit.mSignal.WasPassed()) { - signal = &aInit.mSignal.Value(); - // Let's FetchDriver to deal with an already aborted signal. - } + RefPtr signal = request->GetSignal(); RefPtr observer; if (aInit.mObserve.WasPassed()) { @@ -395,7 +411,7 @@ FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput, Telemetry::Accumulate(Telemetry::FETCH_IS_MAINTHREAD, 1); RefPtr resolver = - new MainThreadFetchResolver(p, observer); + new MainThreadFetchResolver(p, observer, signal); RefPtr fetch = new FetchDriver(r, principal, loadGroup, aGlobal->EventTargetFor(TaskCategory::Other), isTrackingFetch); @@ -443,7 +459,7 @@ MainThreadFetchResolver::OnResponseAvailableInternal(InternalResponse* aResponse } nsCOMPtr go = mPromise->GetParentObject(); - mResponse = new Response(go, aResponse); + mResponse = new Response(go, aResponse, mSignal); mPromise->MaybeResolve(mResponse); } else { if (mFetchObserver) { @@ -506,7 +522,9 @@ public: } RefPtr global = aWorkerPrivate->GlobalScope(); - RefPtr response = new Response(global, mInternalResponse); + RefPtr response = + new Response(global, mInternalResponse, + mResolver->GetAbortSignalForTargetThread()); promise->MaybeResolve(response); } else { if (mResolver->mFetchObserver) { @@ -1020,6 +1038,12 @@ already_AddRefed FetchBody::ConsumeBody(JSContext* aCx, FetchConsumeType aType, ErrorResult& aRv) { + RefPtr signal = DerivedClass()->GetSignal(); + if (signal && signal->Aborted()) { + aRv.Throw(NS_ERROR_DOM_ABORT_ERR); + return nullptr; + } + if (BodyUsed()) { aRv.ThrowTypeError(); return nullptr; @@ -1034,7 +1058,7 @@ FetchBody::ConsumeBody(JSContext* aCx, FetchConsumeType aType, RefPtr promise = FetchBodyConsumer::Create(global, mMainThreadEventTarget, this, - aType, aRv); + signal, aType, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/fetch/Fetch.h b/dom/fetch/Fetch.h index f818871dacf1..707b252de6d4 100644 --- a/dom/fetch/Fetch.h +++ b/dom/fetch/Fetch.h @@ -230,6 +230,9 @@ public: mFetchStreamReader = nullptr; } + virtual AbortSignal* + GetSignal() const = 0; + protected: nsCOMPtr mOwner; diff --git a/dom/fetch/FetchConsumer.cpp b/dom/fetch/FetchConsumer.cpp index 32f2fe2bf333..59fa3d3ca639 100644 --- a/dom/fetch/FetchConsumer.cpp +++ b/dom/fetch/FetchConsumer.cpp @@ -310,6 +310,7 @@ template FetchBodyConsumer::Create(nsIGlobalObject* aGlobal, nsIEventTarget* aMainThreadEventTarget, FetchBody* aBody, + AbortSignal* aSignal, FetchConsumeType aType, ErrorResult& aRv) { @@ -361,6 +362,10 @@ FetchBodyConsumer::Create(nsIGlobalObject* aGlobal, return nullptr; } + if (aSignal) { + consumer->Follow(aSignal); + } + return promise.forget(); } @@ -381,6 +386,8 @@ FetchBodyConsumer::ReleaseObject() mGlobal = nullptr; mWorkerHolder = nullptr; mBody = nullptr; + + Unfollow(); } template @@ -724,6 +731,14 @@ FetchBodyConsumer::Observe(nsISupports* aSubject, return NS_OK; } +template +void +FetchBodyConsumer::Aborted() +{ + AssertIsOnTargetThread(); + ContinueConsumeBody(NS_ERROR_DOM_ABORT_ERR, 0, nullptr); +} + template NS_IMPL_ADDREF(FetchBodyConsumer) diff --git a/dom/fetch/FetchConsumer.h b/dom/fetch/FetchConsumer.h index a46587198d47..201cdd6b0b9f 100644 --- a/dom/fetch/FetchConsumer.h +++ b/dom/fetch/FetchConsumer.h @@ -8,6 +8,7 @@ #define mozilla_dom_FetchConsumer_h #include "Fetch.h" +#include "mozilla/dom/AbortSignal.h" #include "nsIObserver.h" #include "nsWeakReference.h" @@ -31,6 +32,7 @@ template class FetchBody; template class FetchBodyConsumer final : public nsIObserver , public nsSupportsWeakReference + , public AbortSignal::Follower { public: NS_DECL_THREADSAFE_ISUPPORTS @@ -40,6 +42,7 @@ public: Create(nsIGlobalObject* aGlobal, nsIEventTarget* aMainThreadEventTarget, FetchBody* aBody, + AbortSignal* aSignal, FetchConsumeType aType, ErrorResult& aRv); @@ -76,6 +79,9 @@ public: mConsumeBodyPump = nullptr; } + // AbortSignal::Follower + void Aborted() override; + private: FetchBodyConsumer(nsIEventTarget* aMainThreadEventTarget, nsIGlobalObject* aGlobalObject, diff --git a/dom/fetch/Request.cpp b/dom/fetch/Request.cpp index aabb8b7b5596..fae0ddf711d0 100644 --- a/dom/fetch/Request.cpp +++ b/dom/fetch/Request.cpp @@ -31,12 +31,14 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(Request) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Request) NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner) NS_IMPL_CYCLE_COLLECTION_UNLINK(mHeaders) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mSignal) NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Request) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHeaders) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSignal) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Request) @@ -51,14 +53,18 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Request) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -Request::Request(nsIGlobalObject* aOwner, InternalRequest* aRequest) +Request::Request(nsIGlobalObject* aOwner, InternalRequest* aRequest, + AbortSignal* aSignal) : FetchBody(aOwner) , mRequest(aRequest) + , mSignal(aSignal) { MOZ_ASSERT(aRequest->Headers()->Guard() == HeadersGuardEnum::Immutable || aRequest->Headers()->Guard() == HeadersGuardEnum::Request || aRequest->Headers()->Guard() == HeadersGuardEnum::Request_no_cors); SetMimeType(); + + // aSignal can be null. } Request::~Request() @@ -300,6 +306,8 @@ Request::Constructor(const GlobalObject& aGlobal, nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); + RefPtr signal; + if (aInput.IsRequest()) { RefPtr inputReq = &aInput.GetAsRequest(); nsCOMPtr body; @@ -315,6 +323,7 @@ Request::Constructor(const GlobalObject& aGlobal, } request = inputReq->GetInternalRequest(); + signal = inputReq->GetOrCreateSignal(); } else { // aInput is USVString. // We need to get url before we create a InternalRequest. @@ -433,6 +442,10 @@ Request::Constructor(const GlobalObject& aGlobal, request->SetReferrerPolicy(aInit.mReferrerPolicy.Value()); } + if (aInit.mSignal.WasPassed()) { + signal = &aInit.mSignal.Value(); + } + if (NS_IsMainThread()) { nsCOMPtr window = do_QueryInterface(global); if (window) { @@ -597,7 +610,7 @@ Request::Constructor(const GlobalObject& aGlobal, } } - RefPtr domRequest = new Request(global, request); + RefPtr domRequest = new Request(global, request, signal); domRequest->SetMimeType(); if (aInput.IsRequest()) { @@ -616,7 +629,7 @@ Request::Constructor(const GlobalObject& aGlobal, } already_AddRefed -Request::Clone(ErrorResult& aRv) const +Request::Clone(ErrorResult& aRv) { if (BodyUsed()) { aRv.ThrowTypeError(); @@ -629,7 +642,8 @@ Request::Clone(ErrorResult& aRv) const return nullptr; } - RefPtr request = new Request(mOwner, ir); + RefPtr request = new Request(mOwner, ir, GetOrCreateSignal()); + return request.forget(); } @@ -643,5 +657,21 @@ Request::Headers_() return mHeaders; } +AbortSignal* +Request::GetOrCreateSignal() +{ + if (!mSignal) { + mSignal = new AbortSignal(false); + } + + return mSignal; +} + +AbortSignal* +Request::GetSignal() const +{ + return mSignal; +} + } // namespace dom } // namespace mozilla diff --git a/dom/fetch/Request.h b/dom/fetch/Request.h index b1736e1a8a7b..8361c1c0f903 100644 --- a/dom/fetch/Request.h +++ b/dom/fetch/Request.h @@ -32,7 +32,8 @@ class Request final : public nsISupports NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Request) public: - Request(nsIGlobalObject* aOwner, InternalRequest* aRequest); + Request(nsIGlobalObject* aOwner, InternalRequest* aRequest, + AbortSignal* aSignal); static bool RequestContextEnabled(JSContext* aCx, JSObject* aObj); @@ -143,7 +144,7 @@ public: } already_AddRefed - Clone(ErrorResult& aRv) const; + Clone(ErrorResult& aRv); already_AddRefed GetInternalRequest(); @@ -154,12 +155,21 @@ public: return mRequest->GetPrincipalInfo(); } + AbortSignal* + GetOrCreateSignal(); + + // This can return a null AbortSignal. + AbortSignal* + GetSignal() const override; + private: ~Request(); RefPtr mRequest; + // Lazily created. RefPtr mHeaders; + RefPtr mSignal; }; } // namespace dom diff --git a/dom/fetch/Response.cpp b/dom/fetch/Response.cpp index 498482a33384..7a76818d371f 100644 --- a/dom/fetch/Response.cpp +++ b/dom/fetch/Response.cpp @@ -37,6 +37,7 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(Response) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Response) NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner) NS_IMPL_CYCLE_COLLECTION_UNLINK(mHeaders) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mSignal) NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchStreamReader) tmp->mReadableStreamBody = nullptr; @@ -48,6 +49,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Response) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHeaders) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSignal) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFetchStreamReader) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END @@ -62,9 +64,12 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Response) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -Response::Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse) +Response::Response(nsIGlobalObject* aGlobal, + InternalResponse* aInternalResponse, + AbortSignal* aSignal) : FetchBody(aGlobal) , mInternalResponse(aInternalResponse) + , mSignal(aSignal) { MOZ_ASSERT(aInternalResponse->Headers()->Guard() == HeadersGuardEnum::Immutable || aInternalResponse->Headers()->Guard() == HeadersGuardEnum::Response); @@ -83,7 +88,7 @@ Response::Error(const GlobalObject& aGlobal) { nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); RefPtr error = InternalResponse::NetworkError(); - RefPtr r = new Response(global, error); + RefPtr r = new Response(global, error, nullptr); return r.forget(); } @@ -203,7 +208,7 @@ Response::Constructor(const GlobalObject& aGlobal, internalResponse->InitChannelInfo(worker->GetChannelInfo()); } - RefPtr r = new Response(global, internalResponse); + RefPtr r = new Response(global, internalResponse, nullptr); if (aInit.mHeaders.WasPassed()) { internalResponse->Headers()->Clear(); @@ -342,7 +347,7 @@ Response::Clone(JSContext* aCx, ErrorResult& aRv) ? InternalResponse::eDontCloneInputStream : InternalResponse::eCloneInputStream); - RefPtr response = new Response(mOwner, ir); + RefPtr response = new Response(mOwner, ir, mSignal); if (body) { // Maybe we have a body, but we receive null from MaybeTeeReadableStreamBody @@ -385,7 +390,7 @@ Response::CloneUnfiltered(JSContext* aCx, ErrorResult& aRv) : InternalResponse::eCloneInputStream); RefPtr ir = clone->Unfiltered(); - RefPtr ref = new Response(mOwner, ir); + RefPtr ref = new Response(mOwner, ir, mSignal); if (body) { // Maybe we have a body, but we receive null from MaybeTeeReadableStreamBody diff --git a/dom/fetch/Response.h b/dom/fetch/Response.h index 54e79537b0d9..3efeff725a17 100644 --- a/dom/fetch/Response.h +++ b/dom/fetch/Response.h @@ -33,7 +33,8 @@ class Response final : public nsISupports NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Response) public: - Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse); + Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse, + AbortSignal* aSignal); Response(const Response& aOther) = delete; @@ -136,12 +137,19 @@ public: already_AddRefed GetInternalResponse() const; + AbortSignal* + GetSignal() const override + { + return mSignal; + } + private: ~Response(); RefPtr mInternalResponse; // Lazily created RefPtr mHeaders; + RefPtr mSignal; }; } // namespace dom diff --git a/dom/flyweb/FlyWebPublishedServer.cpp b/dom/flyweb/FlyWebPublishedServer.cpp index e5febe412b51..e45b0ae92332 100644 --- a/dom/flyweb/FlyWebPublishedServer.cpp +++ b/dom/flyweb/FlyWebPublishedServer.cpp @@ -81,7 +81,9 @@ FlyWebPublishedServer::FireFetchEvent(InternalRequest* aRequest) { nsCOMPtr global = do_QueryInterface(GetOwner()); RefPtr e = new FlyWebFetchEvent(this, - new Request(global, aRequest), + new Request(global, + aRequest, + nullptr), aRequest); e->Init(this); e->InitEvent(NS_LITERAL_STRING("fetch"), false, false); @@ -94,7 +96,9 @@ FlyWebPublishedServer::FireWebsocketEvent(InternalRequest* aConnectRequest) { nsCOMPtr global = do_QueryInterface(GetOwner()); RefPtr e = new FlyWebWebSocketEvent(this, - new Request(global, aConnectRequest), + new Request(global, + aConnectRequest, + nullptr), aConnectRequest); e->Init(this); e->InitEvent(NS_LITERAL_STRING("websocket"), false, false); diff --git a/dom/webidl/Request.webidl b/dom/webidl/Request.webidl index 0e937f7dba79..7b693026af91 100644 --- a/dom/webidl/Request.webidl +++ b/dom/webidl/Request.webidl @@ -27,6 +27,10 @@ interface Request { readonly attribute RequestRedirect redirect; readonly attribute DOMString integrity; + [Func="AbortController::IsEnabledInFetch", + BinaryName="getOrCreateSignal"] + readonly attribute AbortSignal signal; + [Throws, NewObject] Request clone(); diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp index 461c7f4cd925..141101d4d781 100644 --- a/dom/workers/ScriptLoader.cpp +++ b/dom/workers/ScriptLoader.cpp @@ -718,7 +718,7 @@ private: ir->Headers()->FillResponseHeaders(loadInfo.mChannel); RefPtr response = - new mozilla::dom::Response(mCacheCreator->Global(), ir); + new mozilla::dom::Response(mCacheCreator->Global(), ir, nullptr); mozilla::dom::RequestOrUSVString request; diff --git a/dom/workers/ServiceWorkerPrivate.cpp b/dom/workers/ServiceWorkerPrivate.cpp index e91b7b23a51d..7b47370b4295 100644 --- a/dom/workers/ServiceWorkerPrivate.cpp +++ b/dom/workers/ServiceWorkerPrivate.cpp @@ -1611,7 +1611,10 @@ private: if (NS_WARN_IF(!global)) { return false; } - RefPtr request = new Request(global, internalReq); + + // TODO This request object should be created with a AbortSignal object + // which should be aborted if the loading is aborted. See bug 1394102. + RefPtr request = new Request(global, internalReq, nullptr); MOZ_ASSERT_IF(internalReq->IsNavigationRequest(), request->Redirect() == RequestRedirect::Manual); diff --git a/dom/workers/ServiceWorkerScriptCache.cpp b/dom/workers/ServiceWorkerScriptCache.cpp index d04c69df8a55..a35fd7534c62 100644 --- a/dom/workers/ServiceWorkerScriptCache.cpp +++ b/dom/workers/ServiceWorkerScriptCache.cpp @@ -596,7 +596,8 @@ private: RefPtr internalHeaders = aCN->GetInternalHeaders(); ir->Headers()->Fill(*(internalHeaders.get()), ignored); - RefPtr response = new Response(aCache->GetGlobalObject(), ir); + RefPtr response = + new Response(aCache->GetGlobalObject(), ir, nullptr); RequestOrUSVString request; request.SetAsUSVString().Rebind(aCN->URL().Data(), aCN->URL().Length()); diff --git a/testing/web-platform/meta/fetch/api/abort/general.html.ini b/testing/web-platform/meta/fetch/api/abort/general.html.ini index 4fb6e86491d4..2433de5d9b5a 100644 --- a/testing/web-platform/meta/fetch/api/abort/general.html.ini +++ b/testing/web-platform/meta/fetch/api/abort/general.html.ini @@ -1,42 +1,12 @@ [general.html] type: testharness expected: TIMEOUT - [Window: Request objects have a signal property] - expected: FAIL - [Window: Signal on request object] expected: FAIL - [Window: Signal on request object created from request object] - expected: FAIL - - [Window: Signal on request object created from request object, with signal on second request] - expected: FAIL - - [Window: Signal on request object created from request object, with signal on second request overriding another] - expected: FAIL - - [Window: Signal retained after unrelated properties are overridden by fetch] - expected: FAIL - [Window: Signal removed by setting to null] expected: FAIL - [Window: response.arrayBuffer() rejects if already aborted] - expected: FAIL - - [Window: response.blob() rejects if already aborted] - expected: FAIL - - [Window: response.formData() rejects if already aborted] - expected: FAIL - - [Window: response.json() rejects if already aborted] - expected: FAIL - - [Window: response.text() rejects if already aborted] - expected: FAIL - [Window: Underlying connection is closed when aborting after receiving response - no-cors] expected: FAIL @@ -52,45 +22,15 @@ [Window: Readable stream synchronously cancels with AbortError if aborted before reading] expected: FAIL - [DedicatedWorkerGlobalScope: Request objects have a signal property] - expected: FAIL - [DedicatedWorkerGlobalScope: Signal on request object] expected: FAIL - [DedicatedWorkerGlobalScope: Signal on request object created from request object] - expected: FAIL - - [DedicatedWorkerGlobalScope: Signal on request object created from request object, with signal on second request] - expected: FAIL - - [DedicatedWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another] - expected: FAIL - - [DedicatedWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch] - expected: FAIL - [DedicatedWorkerGlobalScope: Signal removed by setting to null] expected: FAIL [DedicatedWorkerGlobalScope: Already aborted signal rejects immediately] expected: FAIL - [DedicatedWorkerGlobalScope: response.arrayBuffer() rejects if already aborted] - expected: FAIL - - [DedicatedWorkerGlobalScope: response.blob() rejects if already aborted] - expected: FAIL - - [DedicatedWorkerGlobalScope: response.formData() rejects if already aborted] - expected: FAIL - - [DedicatedWorkerGlobalScope: response.json() rejects if already aborted] - expected: FAIL - - [DedicatedWorkerGlobalScope: response.text() rejects if already aborted] - expected: FAIL - [DedicatedWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors] expected: FAIL @@ -106,45 +46,15 @@ [DedicatedWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading] expected: FAIL - [SharedWorkerGlobalScope: Request objects have a signal property] - expected: FAIL - [SharedWorkerGlobalScope: Signal on request object] expected: FAIL - [SharedWorkerGlobalScope: Signal on request object created from request object] - expected: FAIL - - [SharedWorkerGlobalScope: Signal on request object created from request object, with signal on second request] - expected: FAIL - - [SharedWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another] - expected: FAIL - - [SharedWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch] - expected: FAIL - [SharedWorkerGlobalScope: Signal removed by setting to null] expected: FAIL [SharedWorkerGlobalScope: Already aborted signal rejects immediately] expected: FAIL - [SharedWorkerGlobalScope: response.arrayBuffer() rejects if already aborted] - expected: FAIL - - [SharedWorkerGlobalScope: response.blob() rejects if already aborted] - expected: FAIL - - [SharedWorkerGlobalScope: response.formData() rejects if already aborted] - expected: FAIL - - [SharedWorkerGlobalScope: response.json() rejects if already aborted] - expected: FAIL - - [SharedWorkerGlobalScope: response.text() rejects if already aborted] - expected: FAIL - [SharedWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors] expected: FAIL