OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "modules/serviceworkers/RespondWithObserver.h" | 6 #include "modules/serviceworkers/RespondWithObserver.h" |
7 | 7 |
8 #include "bindings/core/v8/ScriptFunction.h" | 8 #include "bindings/core/v8/ScriptFunction.h" |
9 #include "bindings/core/v8/ScriptPromise.h" | 9 #include "bindings/core/v8/ScriptPromise.h" |
10 #include "bindings/core/v8/ScriptValue.h" | 10 #include "bindings/core/v8/ScriptValue.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 break; | 47 break; |
48 case WebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault: | 48 case WebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault: |
49 ASSERT_NOT_REACHED(); | 49 ASSERT_NOT_REACHED(); |
50 break; | 50 break; |
51 case WebServiceWorkerResponseErrorBodyUsed: | 51 case WebServiceWorkerResponseErrorBodyUsed: |
52 errorMessage = errorMessage + "a Response whose \"bodyUsed\" is \"true\"
cannot be used to respond to a request."; | 52 errorMessage = errorMessage + "a Response whose \"bodyUsed\" is \"true\"
cannot be used to respond to a request."; |
53 break; | 53 break; |
54 case WebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest: | 54 case WebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest: |
55 errorMessage = errorMessage + "an \"opaque\" response was used for a cli
ent request."; | 55 errorMessage = errorMessage + "an \"opaque\" response was used for a cli
ent request."; |
56 break; | 56 break; |
| 57 case WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect: |
| 58 errorMessage = errorMessage + "an \"opaqueredirect\" type response was u
sed for a request which is not a navigation request."; |
| 59 break; |
57 case WebServiceWorkerResponseErrorUnknown: | 60 case WebServiceWorkerResponseErrorUnknown: |
58 default: | 61 default: |
59 errorMessage = errorMessage + "an unexpected error occurred."; | 62 errorMessage = errorMessage + "an unexpected error occurred."; |
60 break; | 63 break; |
61 } | 64 } |
62 return errorMessage; | 65 return errorMessage; |
63 } | 66 } |
64 | 67 |
| 68 bool isNavigationRequest(WebURLRequest::FrameType frameType) |
| 69 { |
| 70 return frameType != WebURLRequest::FrameTypeNone; |
| 71 } |
| 72 |
65 bool isClientRequest(WebURLRequest::FrameType frameType, WebURLRequest::RequestC
ontext requestContext) | 73 bool isClientRequest(WebURLRequest::FrameType frameType, WebURLRequest::RequestC
ontext requestContext) |
66 { | 74 { |
67 return frameType != WebURLRequest::FrameTypeNone || requestContext == WebURL
Request::RequestContextSharedWorker || requestContext == WebURLRequest::RequestC
ontextWorker; | 75 return isNavigationRequest(frameType) || requestContext == WebURLRequest::Re
questContextSharedWorker || requestContext == WebURLRequest::RequestContextWorke
r; |
68 } | 76 } |
69 | 77 |
70 class NoopLoaderClient final : public GarbageCollectedFinalized<NoopLoaderClient
>, public FetchDataLoader::Client { | 78 class NoopLoaderClient final : public GarbageCollectedFinalized<NoopLoaderClient
>, public FetchDataLoader::Client { |
71 WTF_MAKE_NONCOPYABLE(NoopLoaderClient); | 79 WTF_MAKE_NONCOPYABLE(NoopLoaderClient); |
72 USING_GARBAGE_COLLECTED_MIXIN(NoopLoaderClient); | 80 USING_GARBAGE_COLLECTED_MIXIN(NoopLoaderClient); |
73 public: | 81 public: |
74 NoopLoaderClient() = default; | 82 NoopLoaderClient() = default; |
75 void didFetchDataLoadedStream() override {} | 83 void didFetchDataLoadedStream() override {} |
76 void didFetchDataLoadFailed() override {} | 84 void didFetchDataLoadFailed() override {} |
77 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); } | 85 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); } |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 // The request mode of client requests should be "same-origin" but it is | 211 // The request mode of client requests should be "same-origin" but it is |
204 // not explicitly stated in the spec yet. So we need to check here. | 212 // not explicitly stated in the spec yet. So we need to check here. |
205 // FIXME: Set the request mode of client requests to "same-origin" and | 213 // FIXME: Set the request mode of client requests to "same-origin" and |
206 // remove this check when the spec will be updated. | 214 // remove this check when the spec will be updated. |
207 // Spec issue: https://github.com/whatwg/fetch/issues/101 | 215 // Spec issue: https://github.com/whatwg/fetch/issues/101 |
208 if (isClientRequest(m_frameType, m_requestContext)) { | 216 if (isClientRequest(m_frameType, m_requestContext)) { |
209 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueF
orClientRequest); | 217 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueF
orClientRequest); |
210 return; | 218 return; |
211 } | 219 } |
212 } | 220 } |
| 221 if (!isNavigationRequest(m_frameType) && responseType == FetchResponseData::
OpaqueRedirectType) { |
| 222 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueRedir
ect); |
| 223 return; |
| 224 } |
213 if (response->bodyUsed()) { | 225 if (response->bodyUsed()) { |
214 responseWasRejected(WebServiceWorkerResponseErrorBodyUsed); | 226 responseWasRejected(WebServiceWorkerResponseErrorBodyUsed); |
215 return; | 227 return; |
216 } | 228 } |
217 | 229 |
218 response->setBodyPassed(); | 230 response->setBodyPassed(); |
219 WebServiceWorkerResponse webResponse; | 231 WebServiceWorkerResponse webResponse; |
220 response->populateWebServiceWorkerResponse(webResponse); | 232 response->populateWebServiceWorkerResponse(webResponse); |
221 BodyStreamBuffer* buffer = response->internalBodyBuffer(); | 233 BodyStreamBuffer* buffer = response->internalBodyBuffer(); |
222 if (buffer->hasBody()) { | 234 if (buffer->hasBody()) { |
(...skipping 20 matching lines...) Expand all Loading... |
243 , m_state(Initial) | 255 , m_state(Initial) |
244 { | 256 { |
245 } | 257 } |
246 | 258 |
247 DEFINE_TRACE(RespondWithObserver) | 259 DEFINE_TRACE(RespondWithObserver) |
248 { | 260 { |
249 ContextLifecycleObserver::trace(visitor); | 261 ContextLifecycleObserver::trace(visitor); |
250 } | 262 } |
251 | 263 |
252 } // namespace blink | 264 } // namespace blink |
OLD | NEW |