Index: Source/modules/serviceworkers/RespondWithObserver.cpp |
diff --git a/Source/modules/serviceworkers/RespondWithObserver.cpp b/Source/modules/serviceworkers/RespondWithObserver.cpp |
index 10e74be7b27107b56cf05c0f92784afdd1a29bc5..8b0bf3faa644f37d589288650dc5aad2603b14f8 100644 |
--- a/Source/modules/serviceworkers/RespondWithObserver.cpp |
+++ b/Source/modules/serviceworkers/RespondWithObserver.cpp |
@@ -54,6 +54,9 @@ const String getMessageForResponseError(WebServiceWorkerResponseError error, con |
case WebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest: |
errorMessage = errorMessage + "an \"opaque\" response was used for a client request."; |
break; |
+ case WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect: |
+ errorMessage = errorMessage + "an \"opaqueredirect\" type response was used for a request which is not a navigation request."; |
+ break; |
case WebServiceWorkerResponseErrorUnknown: |
default: |
errorMessage = errorMessage + "an unexpected error occurred."; |
@@ -62,9 +65,14 @@ const String getMessageForResponseError(WebServiceWorkerResponseError error, con |
return errorMessage; |
} |
+bool isNavigationRequest(WebURLRequest::FrameType frameType) |
+{ |
+ return frameType != WebURLRequest::FrameTypeNone; |
+} |
+ |
bool isClientRequest(WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext) |
{ |
- return frameType != WebURLRequest::FrameTypeNone || requestContext == WebURLRequest::RequestContextSharedWorker || requestContext == WebURLRequest::RequestContextWorker; |
+ return isNavigationRequest(frameType) || requestContext == WebURLRequest::RequestContextSharedWorker || requestContext == WebURLRequest::RequestContextWorker; |
} |
class NoopLoaderClient final : public GarbageCollectedFinalized<NoopLoaderClient>, public FetchDataLoader::Client { |
@@ -210,6 +218,10 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) |
return; |
} |
} |
+ if (!isNavigationRequest(m_frameType) && responseType == FetchResponseData::OpaqueRedirectType) { |
+ responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect); |
+ return; |
+ } |
if (response->bodyUsed()) { |
responseWasRejected(WebServiceWorkerResponseErrorBodyUsed); |
return; |