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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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: | 57 case WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect: |
58 errorMessage = errorMessage + "an \"opaqueredirect\" type response was u
sed for a request which is not a navigation request."; | 58 errorMessage = errorMessage + "an \"opaqueredirect\" type response was u
sed for a request which is not a navigation request."; |
59 break; | 59 break; |
| 60 case WebServiceWorkerResponseErrorBodyLocked: |
| 61 errorMessage = errorMessage + "a Response whose \"body\" is locked canno
t be used to respond to a request."; |
| 62 break; |
60 case WebServiceWorkerResponseErrorUnknown: | 63 case WebServiceWorkerResponseErrorUnknown: |
61 default: | 64 default: |
62 errorMessage = errorMessage + "an unexpected error occurred."; | 65 errorMessage = errorMessage + "an unexpected error occurred."; |
63 break; | 66 break; |
64 } | 67 } |
65 return errorMessage; | 68 return errorMessage; |
66 } | 69 } |
67 | 70 |
68 bool isNavigationRequest(WebURLRequest::FrameType frameType) | 71 bool isNavigationRequest(WebURLRequest::FrameType frameType) |
69 { | 72 { |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 // Spec issue: https://github.com/whatwg/fetch/issues/101 | 218 // Spec issue: https://github.com/whatwg/fetch/issues/101 |
216 if (isClientRequest(m_frameType, m_requestContext)) { | 219 if (isClientRequest(m_frameType, m_requestContext)) { |
217 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueF
orClientRequest); | 220 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueF
orClientRequest); |
218 return; | 221 return; |
219 } | 222 } |
220 } | 223 } |
221 if (!isNavigationRequest(m_frameType) && responseType == FetchResponseData::
OpaqueRedirectType) { | 224 if (!isNavigationRequest(m_frameType) && responseType == FetchResponseData::
OpaqueRedirectType) { |
222 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueRedir
ect); | 225 responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueRedir
ect); |
223 return; | 226 return; |
224 } | 227 } |
| 228 if (response->isBodyLocked()) { |
| 229 responseWasRejected(WebServiceWorkerResponseErrorBodyLocked); |
| 230 return; |
| 231 } |
225 if (response->bodyUsed()) { | 232 if (response->bodyUsed()) { |
226 responseWasRejected(WebServiceWorkerResponseErrorBodyUsed); | 233 responseWasRejected(WebServiceWorkerResponseErrorBodyUsed); |
227 return; | 234 return; |
228 } | 235 } |
229 | 236 |
230 response->setBodyPassed(); | |
231 WebServiceWorkerResponse webResponse; | 237 WebServiceWorkerResponse webResponse; |
232 response->populateWebServiceWorkerResponse(webResponse); | 238 response->populateWebServiceWorkerResponse(webResponse); |
233 BodyStreamBuffer* buffer = response->internalBodyBuffer(); | 239 BodyStreamBuffer* buffer = response->internalBodyBuffer(); |
234 if (buffer) { | 240 if (buffer) { |
235 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(Fe
tchDataConsumerHandle::Reader::AllowBlobWithInvalidSize); | 241 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(Fe
tchDataConsumerHandle::Reader::AllowBlobWithInvalidSize); |
236 if (blobDataHandle) { | 242 if (blobDataHandle) { |
237 webResponse.setBlobDataHandle(blobDataHandle); | 243 webResponse.setBlobDataHandle(blobDataHandle); |
238 } else { | 244 } else { |
239 Stream* outStream = Stream::create(executionContext(), ""); | 245 Stream* outStream = Stream::create(executionContext(), ""); |
240 webResponse.setStreamURL(outStream->url()); | 246 webResponse.setStreamURL(outStream->url()); |
(...skipping 14 matching lines...) Expand all Loading... |
255 , m_state(Initial) | 261 , m_state(Initial) |
256 { | 262 { |
257 } | 263 } |
258 | 264 |
259 DEFINE_TRACE(RespondWithObserver) | 265 DEFINE_TRACE(RespondWithObserver) |
260 { | 266 { |
261 ContextLifecycleObserver::trace(visitor); | 267 ContextLifecycleObserver::trace(visitor); |
262 } | 268 } |
263 | 269 |
264 } // namespace blink | 270 } // namespace blink |
OLD | NEW |