Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(217)

Side by Side Diff: third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698