From 71848c23a4d09bbb7eff1b27d2cb28904e35240d Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 24 Jul 2020 11:09:54 +0000 Subject: Issue #1587 Part 11 (followup 1): Implement multithreaded signals for workers. --- dom/fetch/Request.cpp | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) (limited to 'dom/fetch/Request.cpp') diff --git a/dom/fetch/Request.cpp b/dom/fetch/Request.cpp index 6a7885b1a..ba268d331 100644 --- a/dom/fetch/Request.cpp +++ b/dom/fetch/Request.cpp @@ -37,15 +37,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() , mOwner(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() @@ -286,6 +289,8 @@ Request::Constructor(const GlobalObject& aGlobal, RefPtr request; nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); + + RefPtr signal; if (aInput.IsRequest()) { RefPtr inputReq = &aInput.GetAsRequest(); @@ -300,6 +305,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. @@ -418,6 +424,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) { @@ -579,7 +589,7 @@ Request::Constructor(const GlobalObject& aGlobal, } } - RefPtr domRequest = new Request(global, request); + RefPtr domRequest = new Request(global, request, signal); domRequest->SetMimeType(); if (aInput.IsRequest()) { @@ -595,7 +605,7 @@ Request::Constructor(const GlobalObject& aGlobal, } already_AddRefed -Request::Clone(ErrorResult& aRv) const +Request::Clone(ErrorResult& aRv) { if (BodyUsed()) { aRv.ThrowTypeError(); @@ -608,7 +618,7 @@ Request::Clone(ErrorResult& aRv) const return nullptr; } - RefPtr request = new Request(mOwner, ir); + RefPtr request = new Request(mOwner, ir, GetOrCreateSignal()); return request.forget(); } @@ -622,5 +632,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 -- cgit v1.2.3 From ad5e9449d2ec885ce547ed44ac3be066de803784 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sat, 25 Jul 2020 17:31:58 +0000 Subject: Issue #1587 Part 12 (followup 2): Allow clearing of signal by setting to null. --- dom/fetch/Request.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dom/fetch/Request.cpp') diff --git a/dom/fetch/Request.cpp b/dom/fetch/Request.cpp index ba268d331..76f3ce5c5 100644 --- a/dom/fetch/Request.cpp +++ b/dom/fetch/Request.cpp @@ -425,7 +425,7 @@ Request::Constructor(const GlobalObject& aGlobal, } if (aInit.mSignal.WasPassed()) { - signal = &aInit.mSignal.Value(); + signal = aInit.mSignal.Value(); } if (NS_IsMainThread()) { -- cgit v1.2.3