Chromium Code Reviews| 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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 return frameType != WebURLRequest::FrameTypeNone; | 103 return frameType != WebURLRequest::FrameTypeNone; |
| 104 } | 104 } |
| 105 | 105 |
| 106 bool isClientRequest(WebURLRequest::FrameType frameType, | 106 bool isClientRequest(WebURLRequest::FrameType frameType, |
| 107 WebURLRequest::RequestContext requestContext) { | 107 WebURLRequest::RequestContext requestContext) { |
| 108 return isNavigationRequest(frameType) || | 108 return isNavigationRequest(frameType) || |
| 109 requestContext == WebURLRequest::RequestContextSharedWorker || | 109 requestContext == WebURLRequest::RequestContextSharedWorker || |
| 110 requestContext == WebURLRequest::RequestContextWorker; | 110 requestContext == WebURLRequest::RequestContextWorker; |
| 111 } | 111 } |
| 112 | 112 |
| 113 class NoopLoaderClient final | 113 class FetchLoaderClient final |
| 114 : public GarbageCollectedFinalized<NoopLoaderClient>, | 114 : public GarbageCollectedFinalized<FetchLoaderClient>, |
| 115 public FetchDataLoader::Client { | 115 public FetchDataLoader::Client { |
| 116 WTF_MAKE_NONCOPYABLE(NoopLoaderClient); | 116 WTF_MAKE_NONCOPYABLE(FetchLoaderClient); |
| 117 USING_GARBAGE_COLLECTED_MIXIN(NoopLoaderClient); | 117 USING_GARBAGE_COLLECTED_MIXIN(FetchLoaderClient); |
| 118 | 118 |
| 119 public: | 119 public: |
| 120 NoopLoaderClient() = default; | 120 FetchLoaderClient(std::unique_ptr<WebServiceWorkerStreamHandle> handle) |
| 121 void didFetchDataLoadedStream() override {} | 121 : m_handle(std::move(handle)) {} |
| 122 void didFetchDataLoadFailed() override {} | 122 |
| 123 void didFetchDataLoadedDataPipe() override { m_handle->completed(); } | |
| 124 void didFetchDataLoadFailed() override { m_handle->aborted(); } | |
| 123 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); } | 125 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); } |
| 126 | |
| 127 private: | |
| 128 std::unique_ptr<WebServiceWorkerStreamHandle> m_handle; | |
| 124 }; | 129 }; |
| 125 | 130 |
| 126 } // namespace | 131 } // namespace |
| 127 | 132 |
| 128 FetchRespondWithObserver* FetchRespondWithObserver::create( | 133 FetchRespondWithObserver* FetchRespondWithObserver::create( |
| 129 ExecutionContext* context, | 134 ExecutionContext* context, |
| 130 int fetchEventID, | 135 int fetchEventID, |
| 131 const KURL& requestURL, | 136 const KURL& requestURL, |
| 132 WebURLRequest::FetchRequestMode requestMode, | 137 WebURLRequest::FetchRequestMode requestMode, |
| 133 WebURLRequest::FetchRedirectMode redirectMode, | 138 WebURLRequest::FetchRedirectMode redirectMode, |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 144 DCHECK(getExecutionContext()); | 149 DCHECK(getExecutionContext()); |
| 145 getExecutionContext()->addConsoleMessage( | 150 getExecutionContext()->addConsoleMessage( |
| 146 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, | 151 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, |
| 147 getMessageForResponseError(error, m_requestURL))); | 152 getMessageForResponseError(error, m_requestURL))); |
| 148 | 153 |
| 149 // The default value of WebServiceWorkerResponse's status is 0, which maps | 154 // The default value of WebServiceWorkerResponse's status is 0, which maps |
| 150 // to a network error. | 155 // to a network error. |
| 151 WebServiceWorkerResponse webResponse; | 156 WebServiceWorkerResponse webResponse; |
| 152 webResponse.setError(error); | 157 webResponse.setError(error); |
| 153 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | 158 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
| 154 ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); | 159 ->respondToFetchEventWithResponse(m_eventID, webResponse, |
| 160 m_eventDispatchTime); | |
| 155 } | 161 } |
| 156 | 162 |
| 157 void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) { | 163 void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) { |
| 158 DCHECK(getExecutionContext()); | 164 DCHECK(getExecutionContext()); |
| 159 if (!V8Response::hasInstance(value.v8Value(), | 165 if (!V8Response::hasInstance(value.v8Value(), |
| 160 toIsolate(getExecutionContext()))) { | 166 toIsolate(getExecutionContext()))) { |
| 161 onResponseRejected(WebServiceWorkerResponseErrorNoV8Instance); | 167 onResponseRejected(WebServiceWorkerResponseErrorNoV8Instance); |
| 162 return; | 168 return; |
| 163 } | 169 } |
| 164 Response* response = V8Response::toImplWithTypeCheck( | 170 Response* response = V8Response::toImplWithTypeCheck( |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 206 return; | 212 return; |
| 207 } | 213 } |
| 208 if (response->bodyUsed()) { | 214 if (response->bodyUsed()) { |
| 209 onResponseRejected(WebServiceWorkerResponseErrorBodyUsed); | 215 onResponseRejected(WebServiceWorkerResponseErrorBodyUsed); |
| 210 return; | 216 return; |
| 211 } | 217 } |
| 212 | 218 |
| 213 WebServiceWorkerResponse webResponse; | 219 WebServiceWorkerResponse webResponse; |
| 214 response->populateWebServiceWorkerResponse(webResponse); | 220 response->populateWebServiceWorkerResponse(webResponse); |
| 215 BodyStreamBuffer* buffer = response->internalBodyBuffer(); | 221 BodyStreamBuffer* buffer = response->internalBodyBuffer(); |
| 216 if (buffer) { | 222 if (buffer) { |
|
horo
2017/04/06 05:22:09
Why don't you handle null buffer case?
shimazu
2017/04/07 08:52:29
Ohh, thanks. I missed that..
Updated.
| |
| 217 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle( | 223 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle( |
| 218 BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize); | 224 BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize); |
| 219 if (blobDataHandle) { | 225 if (blobDataHandle) { |
| 226 // Handle the blob response. | |
| 220 webResponse.setBlobDataHandle(blobDataHandle); | 227 webResponse.setBlobDataHandle(blobDataHandle); |
| 228 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | |
| 229 ->respondToFetchEventWithResponse(m_eventID, webResponse, | |
| 230 m_eventDispatchTime); | |
| 221 } else { | 231 } else { |
| 222 Stream* outStream = Stream::create(getExecutionContext(), ""); | 232 // Handle the stream response. |
| 223 webResponse.setStreamURL(outStream->url()); | 233 // MojoCreateDataPipeOptions options; |
|
shimazu
2017/04/06 03:22:16
Do you have insight for these parameters?
I think
horo
2017/04/06 05:22:09
SGTM
shimazu
2017/04/07 08:52:29
Done.
| |
| 224 buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream), | 234 // options.struct_size = sizeof(MojoCreateDataPipeOptions); |
| 225 new NoopLoaderClient); | 235 // options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
| 236 // options.element_num_bytes = 1; | |
| 237 // options.capacity_num_bytes = 512 * 1024; | |
| 238 | |
| 239 mojo::DataPipe dataPipe; | |
| 240 DCHECK(dataPipe.producer_handle.is_valid()); | |
| 241 DCHECK(dataPipe.consumer_handle.is_valid()); | |
| 242 | |
| 243 std::unique_ptr<WebServiceWorkerStreamHandle> streamHandle = | |
| 244 WTF::makeUnique<WebServiceWorkerStreamHandle>( | |
| 245 std::move(dataPipe.consumer_handle)); | |
| 246 WebServiceWorkerStreamHandle* streamHandleRawptr = streamHandle.get(); | |
| 247 | |
| 248 buffer->startLoading(FetchDataLoader::createLoaderAsDataPipe( | |
| 249 std::move(dataPipe.producer_handle)), | |
| 250 new FetchLoaderClient(std::move(streamHandle))); | |
| 251 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | |
| 252 ->respondToFetchEventWithResponseStream( | |
| 253 m_eventID, webResponse, streamHandleRawptr, m_eventDispatchTime); | |
| 226 } | 254 } |
| 227 } | 255 } |
| 228 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | |
| 229 ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); | |
| 230 } | 256 } |
| 231 | 257 |
| 232 void FetchRespondWithObserver::onNoResponse() { | 258 void FetchRespondWithObserver::onNoResponse() { |
| 233 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) | 259 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
| 234 ->respondToFetchEvent(m_eventID, m_eventDispatchTime); | 260 ->respondToFetchEvent(m_eventID, m_eventDispatchTime); |
| 235 } | 261 } |
| 236 | 262 |
| 237 FetchRespondWithObserver::FetchRespondWithObserver( | 263 FetchRespondWithObserver::FetchRespondWithObserver( |
| 238 ExecutionContext* context, | 264 ExecutionContext* context, |
| 239 int fetchEventID, | 265 int fetchEventID, |
| 240 const KURL& requestURL, | 266 const KURL& requestURL, |
| 241 WebURLRequest::FetchRequestMode requestMode, | 267 WebURLRequest::FetchRequestMode requestMode, |
| 242 WebURLRequest::FetchRedirectMode redirectMode, | 268 WebURLRequest::FetchRedirectMode redirectMode, |
| 243 WebURLRequest::FrameType frameType, | 269 WebURLRequest::FrameType frameType, |
| 244 WebURLRequest::RequestContext requestContext, | 270 WebURLRequest::RequestContext requestContext, |
| 245 WaitUntilObserver* observer) | 271 WaitUntilObserver* observer) |
| 246 : RespondWithObserver(context, fetchEventID, observer), | 272 : RespondWithObserver(context, fetchEventID, observer), |
| 247 m_requestURL(requestURL), | 273 m_requestURL(requestURL), |
| 248 m_requestMode(requestMode), | 274 m_requestMode(requestMode), |
| 249 m_redirectMode(redirectMode), | 275 m_redirectMode(redirectMode), |
| 250 m_frameType(frameType), | 276 m_frameType(frameType), |
| 251 m_requestContext(requestContext) {} | 277 m_requestContext(requestContext) {} |
| 252 | 278 |
| 253 DEFINE_TRACE(FetchRespondWithObserver) { | 279 DEFINE_TRACE(FetchRespondWithObserver) { |
| 254 RespondWithObserver::trace(visitor); | 280 RespondWithObserver::trace(visitor); |
| 255 } | 281 } |
| 256 | 282 |
| 257 } // namespace blink | 283 } // namespace blink |
| OLD | NEW |