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 "modules/serviceworkers/FetchRespondWithObserver.h" | 5 #include "modules/serviceworkers/FetchRespondWithObserver.h" |
6 | 6 |
7 #include <v8.h> | 7 #include <v8.h> |
8 #include "bindings/core/v8/ScriptValue.h" | 8 #include "bindings/core/v8/ScriptValue.h" |
9 #include "bindings/core/v8/V8Binding.h" | 9 #include "bindings/core/v8/V8Binding.h" |
10 #include "bindings/modules/v8/V8Response.h" | 10 #include "bindings/modules/v8/V8Response.h" |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 DCHECK(getExecutionContext()); | 144 DCHECK(getExecutionContext()); |
145 getExecutionContext()->addConsoleMessage( | 145 getExecutionContext()->addConsoleMessage( |
146 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, | 146 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, |
147 getMessageForResponseError(error, m_requestURL))); | 147 getMessageForResponseError(error, m_requestURL))); |
148 | 148 |
149 // The default value of WebServiceWorkerResponse's status is 0, which maps | 149 // The default value of WebServiceWorkerResponse's status is 0, which maps |
150 // to a network error. | 150 // to a network error. |
151 WebServiceWorkerResponse webResponse; | 151 WebServiceWorkerResponse webResponse; |
152 webResponse.setError(error); | 152 webResponse.setError(error); |
153 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | 153 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
154 ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); | 154 ->respondToFetchEventWithResponse(m_eventID, webResponse, |
| 155 m_eventDispatchTime); |
155 } | 156 } |
156 | 157 |
157 void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) { | 158 void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) { |
158 DCHECK(getExecutionContext()); | 159 DCHECK(getExecutionContext()); |
159 if (!V8Response::hasInstance(value.v8Value(), | 160 if (!V8Response::hasInstance(value.v8Value(), |
160 toIsolate(getExecutionContext()))) { | 161 toIsolate(getExecutionContext()))) { |
161 onResponseRejected(WebServiceWorkerResponseErrorNoV8Instance); | 162 onResponseRejected(WebServiceWorkerResponseErrorNoV8Instance); |
162 return; | 163 return; |
163 } | 164 } |
164 Response* response = V8Response::toImplWithTypeCheck( | 165 Response* response = V8Response::toImplWithTypeCheck( |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 return; | 207 return; |
207 } | 208 } |
208 if (response->bodyUsed()) { | 209 if (response->bodyUsed()) { |
209 onResponseRejected(WebServiceWorkerResponseErrorBodyUsed); | 210 onResponseRejected(WebServiceWorkerResponseErrorBodyUsed); |
210 return; | 211 return; |
211 } | 212 } |
212 | 213 |
213 WebServiceWorkerResponse webResponse; | 214 WebServiceWorkerResponse webResponse; |
214 response->populateWebServiceWorkerResponse(webResponse); | 215 response->populateWebServiceWorkerResponse(webResponse); |
215 BodyStreamBuffer* buffer = response->internalBodyBuffer(); | 216 BodyStreamBuffer* buffer = response->internalBodyBuffer(); |
216 if (buffer) { | 217 if (!buffer) { |
| 218 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
| 219 ->respondToFetchEventWithResponse(m_eventID, webResponse, |
| 220 m_eventDispatchTime); |
| 221 } else { |
217 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle( | 222 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle( |
218 BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize); | 223 BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize); |
219 if (blobDataHandle) { | 224 if (blobDataHandle) { |
220 webResponse.setBlobDataHandle(blobDataHandle); | 225 webResponse.setBlobDataHandle(blobDataHandle); |
| 226 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
| 227 ->respondToFetchEventWithResponse(m_eventID, webResponse, |
| 228 m_eventDispatchTime); |
221 } else { | 229 } else { |
222 Stream* outStream = Stream::create(getExecutionContext(), ""); | 230 MojoCreateDataPipeOptions options; |
223 webResponse.setStreamURL(outStream->url()); | 231 options.struct_size = sizeof(MojoCreateDataPipeOptions); |
224 buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream), | 232 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
| 233 options.element_num_bytes = 1; |
| 234 options.capacity_num_bytes = 512 * 1024; |
| 235 mojo::DataPipe data_pipe(options); |
| 236 DCHECK(data_pipe.producer_handle.is_valid()); |
| 237 DCHECK(data_pipe.consumer_handle.is_valid()); |
| 238 buffer->startLoading(FetchDataLoader::createLoaderAsDataPipe( |
| 239 std::move(data_pipe.producer_handle)), |
225 new NoopLoaderClient); | 240 new NoopLoaderClient); |
| 241 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
| 242 ->respondToFetchEventWithResponseStream( |
| 243 m_eventID, webResponse, std::move(data_pipe.consumer_handle), |
| 244 m_eventDispatchTime); |
226 } | 245 } |
227 } | 246 } |
228 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | |
229 ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); | |
230 } | 247 } |
231 | 248 |
232 void FetchRespondWithObserver::onNoResponse() { | 249 void FetchRespondWithObserver::onNoResponse() { |
233 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | 250 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
234 ->respondToFetchEvent(m_eventID, m_eventDispatchTime); | 251 ->respondToFetchEvent(m_eventID, m_eventDispatchTime); |
235 } | 252 } |
236 | 253 |
237 FetchRespondWithObserver::FetchRespondWithObserver( | 254 FetchRespondWithObserver::FetchRespondWithObserver( |
238 ExecutionContext* context, | 255 ExecutionContext* context, |
239 int fetchEventID, | 256 int fetchEventID, |
240 const KURL& requestURL, | 257 const KURL& requestURL, |
241 WebURLRequest::FetchRequestMode requestMode, | 258 WebURLRequest::FetchRequestMode requestMode, |
242 WebURLRequest::FetchRedirectMode redirectMode, | 259 WebURLRequest::FetchRedirectMode redirectMode, |
243 WebURLRequest::FrameType frameType, | 260 WebURLRequest::FrameType frameType, |
244 WebURLRequest::RequestContext requestContext, | 261 WebURLRequest::RequestContext requestContext, |
245 WaitUntilObserver* observer) | 262 WaitUntilObserver* observer) |
246 : RespondWithObserver(context, fetchEventID, observer), | 263 : RespondWithObserver(context, fetchEventID, observer), |
247 m_requestURL(requestURL), | 264 m_requestURL(requestURL), |
248 m_requestMode(requestMode), | 265 m_requestMode(requestMode), |
249 m_redirectMode(redirectMode), | 266 m_redirectMode(redirectMode), |
250 m_frameType(frameType), | 267 m_frameType(frameType), |
251 m_requestContext(requestContext) {} | 268 m_requestContext(requestContext) {} |
252 | 269 |
253 DEFINE_TRACE(FetchRespondWithObserver) { | 270 DEFINE_TRACE(FetchRespondWithObserver) { |
254 RespondWithObserver::trace(visitor); | 271 RespondWithObserver::trace(visitor); |
255 } | 272 } |
256 | 273 |
257 } // namespace blink | 274 } // namespace blink |
OLD | NEW |