|
|
|
|
| 266 |
NS_IMPL_ISUPPORTS(BodyCopyHandle, nsIInterceptedBodyCallback) |
266 |
NS_IMPL_ISUPPORTS(BodyCopyHandle, nsIInterceptedBodyCallback) |
| 267 |
|
267 |
|
| 268 |
class StartResponse final : public Runnable |
268 |
class StartResponse final : public Runnable |
| 269 |
{ |
269 |
{ |
| 270 |
nsMainThreadPtrHandle<nsIInterceptedChannel> mChannel; |
270 |
nsMainThreadPtrHandle<nsIInterceptedChannel> mChannel; |
| 271 |
RefPtr<InternalResponse> mInternalResponse; |
271 |
RefPtr<InternalResponse> mInternalResponse; |
| 272 |
ChannelInfo mWorkerChannelInfo; |
272 |
ChannelInfo mWorkerChannelInfo; |
| 273 |
const nsCString mScriptSpec; |
273 |
const nsCString mScriptSpec; |
| 274 |
const nsCString mResponseURLSpec; |
|
|
| 275 |
UniquePtr<RespondWithClosure> mClosure; |
274 |
UniquePtr<RespondWithClosure> mClosure; |
| 276 |
|
275 |
|
| 277 |
public: |
276 |
public: |
| 278 |
StartResponse(nsMainThreadPtrHandle<nsIInterceptedChannel>& aChannel, |
277 |
StartResponse(nsMainThreadPtrHandle<nsIInterceptedChannel>& aChannel, |
| 279 |
InternalResponse* aInternalResponse, |
278 |
InternalResponse* aInternalResponse, |
| 280 |
const ChannelInfo& aWorkerChannelInfo, |
279 |
const ChannelInfo& aWorkerChannelInfo, |
| 281 |
const nsACString& aScriptSpec, |
280 |
const nsACString& aScriptSpec, |
| 282 |
const nsACString& aResponseURLSpec, |
|
|
| 283 |
UniquePtr<RespondWithClosure>&& aClosure) |
281 |
UniquePtr<RespondWithClosure>&& aClosure) |
| 284 |
: Runnable("dom::workers::StartResponse") |
282 |
: Runnable("dom::workers::StartResponse") |
| 285 |
, mChannel(aChannel) |
283 |
, mChannel(aChannel) |
| 286 |
, mInternalResponse(aInternalResponse) |
284 |
, mInternalResponse(aInternalResponse) |
| 287 |
, mWorkerChannelInfo(aWorkerChannelInfo) |
285 |
, mWorkerChannelInfo(aWorkerChannelInfo) |
| 288 |
, mScriptSpec(aScriptSpec) |
286 |
, mScriptSpec(aScriptSpec) |
| 289 |
, mResponseURLSpec(aResponseURLSpec) |
|
|
| 290 |
, mClosure(Move(aClosure)) |
287 |
, mClosure(Move(aClosure)) |
| 291 |
{ |
288 |
{ |
| 292 |
} |
289 |
} |
| 293 |
|
290 |
|
| 294 |
NS_IMETHOD |
291 |
NS_IMETHOD |
| 295 |
Run() override |
292 |
Run() override |
| 296 |
{ |
293 |
{ |
| 297 |
AssertIsOnMainThread(); |
294 |
AssertIsOnMainThread(); |
|
|
| 337 |
auto castLoadInfo = static_cast<LoadInfo*>(loadInfo.get()); |
334 |
auto castLoadInfo = static_cast<LoadInfo*>(loadInfo.get()); |
| 338 |
castLoadInfo->SynthesizeServiceWorkerTainting(mInternalResponse->GetTainting()); |
335 |
castLoadInfo->SynthesizeServiceWorkerTainting(mInternalResponse->GetTainting()); |
| 339 |
|
336 |
|
| 340 |
nsCOMPtr<nsIInputStream> body; |
337 |
nsCOMPtr<nsIInputStream> body; |
| 341 |
mInternalResponse->GetUnfilteredBody(getter_AddRefs(body)); |
338 |
mInternalResponse->GetUnfilteredBody(getter_AddRefs(body)); |
| 342 |
RefPtr<BodyCopyHandle> copyHandle; |
339 |
RefPtr<BodyCopyHandle> copyHandle; |
| 343 |
copyHandle = new BodyCopyHandle(Move(mClosure)); |
340 |
copyHandle = new BodyCopyHandle(Move(mClosure)); |
| 344 |
|
341 |
|
| 345 |
rv = mChannel->StartSynthesizedResponse(body, copyHandle, |
342 |
rv = |
| 346 |
mResponseURLSpec); |
343 |
mChannel->StartSynthesizedResponse(body, copyHandle, |
|
|
344 |
mInternalResponse->GetUnfilteredURL(), |
| 345 |
mInternalResponse->IsRedirected()); |
| 347 |
if (NS_WARN_IF(NS_FAILED(rv))) { |
346 |
if (NS_WARN_IF(NS_FAILED(rv))) { |
| 348 |
mChannel->CancelInterception(NS_ERROR_INTERCEPTION_FAILED); |
347 |
mChannel->CancelInterception(NS_ERROR_INTERCEPTION_FAILED); |
| 349 |
return NS_OK; |
348 |
return NS_OK; |
| 350 |
} |
349 |
} |
| 351 |
|
350 |
|
| 352 |
nsCOMPtr<nsIObserverService> obsService = services::GetObserverService(); |
351 |
nsCOMPtr<nsIObserverService> obsService = services::GetObserverService(); |
| 353 |
if (obsService) { |
352 |
if (obsService) { |
| 354 |
obsService->NotifyObservers(underlyingChannel, "service-worker-synthesized-response", nullptr); |
353 |
obsService->NotifyObservers(underlyingChannel, "service-worker-synthesized-response", nullptr); |
|
Lines 653-691
RespondWithHandler::ResolvedCallback(JSC
|
Link Here
|
|---|
|
| 653 |
NS_LITERAL_CSTRING("InterceptedUsedResponseWithURL"), mRequestURL); |
652 |
NS_LITERAL_CSTRING("InterceptedUsedResponseWithURL"), mRequestURL); |
| 654 |
return; |
653 |
return; |
| 655 |
} |
654 |
} |
| 656 |
|
655 |
|
| 657 |
RefPtr<InternalResponse> ir = response->GetInternalResponse(); |
656 |
RefPtr<InternalResponse> ir = response->GetInternalResponse(); |
| 658 |
if (NS_WARN_IF(!ir)) { |
657 |
if (NS_WARN_IF(!ir)) { |
| 659 |
return; |
658 |
return; |
| 660 |
} |
659 |
} |
|
|
660 |
|
| 661 |
// When an opaque response is encountered, we need the original channel's principal |
661 |
// When an opaque response is encountered, we need the original channel's principal |
| 662 |
// to reflect the final URL. Non-opaque responses are either same-origin or CORS-enabled |
662 |
// to reflect the final URL. Non-opaque responses are either same-origin or CORS-enabled |
| 663 |
// cross-origin responses, which are treated as same-origin by consumers. |
663 |
// cross-origin responses, which are treated as same-origin by consumers. |
| 664 |
nsCString responseURL; |
664 |
if (response->Type() == ResponseType::Opaque && |
| 665 |
if (response->Type() == ResponseType::Opaque) { |
665 |
NS_WARN_IF(ir->GetUnfilteredURL().IsEmpty())) { |
| 666 |
responseURL = ir->GetUnfilteredURL(); |
666 |
return; |
| 667 |
if (NS_WARN_IF(responseURL.IsEmpty())) { |
|
|
| 668 |
return; |
| 669 |
} |
| 670 |
} |
667 |
} |
| 671 |
|
668 |
|
| 672 |
UniquePtr<RespondWithClosure> closure(new RespondWithClosure(mInterceptedChannel, |
669 |
UniquePtr<RespondWithClosure> closure(new RespondWithClosure(mInterceptedChannel, |
| 673 |
mRegistration, |
670 |
mRegistration, |
| 674 |
mRequestURL, |
671 |
mRequestURL, |
| 675 |
mRespondWithScriptSpec, |
672 |
mRespondWithScriptSpec, |
| 676 |
mRespondWithLineNumber, |
673 |
mRespondWithLineNumber, |
| 677 |
mRespondWithColumnNumber)); |
674 |
mRespondWithColumnNumber)); |
| 678 |
|
675 |
|
| 679 |
nsCOMPtr<nsIRunnable> startRunnable = new StartResponse(mInterceptedChannel, |
676 |
nsCOMPtr<nsIRunnable> startRunnable = new StartResponse(mInterceptedChannel, |
| 680 |
ir, |
677 |
ir, |
| 681 |
worker->GetChannelInfo(), |
678 |
worker->GetChannelInfo(), |
| 682 |
mScriptSpec, |
679 |
mScriptSpec, |
| 683 |
responseURL, |
|
|
| 684 |
Move(closure)); |
680 |
Move(closure)); |
| 685 |
|
681 |
|
| 686 |
nsCOMPtr<nsIInputStream> body; |
682 |
nsCOMPtr<nsIInputStream> body; |
| 687 |
ir->GetUnfilteredBody(getter_AddRefs(body)); |
683 |
ir->GetUnfilteredBody(getter_AddRefs(body)); |
| 688 |
// Errors and redirects may not have a body. |
684 |
// Errors and redirects may not have a body. |
| 689 |
if (body) { |
685 |
if (body) { |
| 690 |
IgnoredErrorResult error; |
686 |
IgnoredErrorResult error; |
| 691 |
response->SetBodyUsed(aCx, error); |
687 |
response->SetBodyUsed(aCx, error); |