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

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: Used TEST_P to test closing the connection first and On{Aborted,Completed} first 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
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) {
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);
231 return;
221 } else { 232 } else {
222 Stream* outStream = Stream::create(getExecutionContext(), ""); 233 // Handle the stream response.
223 webResponse.setStreamURL(outStream->url()); 234 mojo::DataPipe dataPipe;
224 buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream), 235 DCHECK(dataPipe.producer_handle.is_valid());
225 new NoopLoaderClient); 236 DCHECK(dataPipe.consumer_handle.is_valid());
237
238 std::unique_ptr<WebServiceWorkerStreamHandle> streamHandle =
239 WTF::makeUnique<WebServiceWorkerStreamHandle>(
240 std::move(dataPipe.consumer_handle));
241 WebServiceWorkerStreamHandle* streamHandleRawptr = streamHandle.get();
242
243 buffer->startLoading(FetchDataLoader::createLoaderAsDataPipe(
244 std::move(dataPipe.producer_handle)),
245 new FetchLoaderClient(std::move(streamHandle)));
246 ServiceWorkerGlobalScopeClient::from(getExecutionContext())
247 ->respondToFetchEventWithResponseStream(
248 m_eventID, webResponse, streamHandleRawptr, m_eventDispatchTime);
249 return;
226 } 250 }
227 } 251 }
228 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) 252 ServiceWorkerGlobalScopeClient::from(getExecutionContext())
229 ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); 253 ->respondToFetchEventWithResponse(m_eventID, webResponse,
254 m_eventDispatchTime);
230 } 255 }
231 256
232 void FetchRespondWithObserver::onNoResponse() { 257 void FetchRespondWithObserver::onNoResponse() {
233 ServiceWorkerGlobalScopeClient::from(getExecutionContext()) 258 ServiceWorkerGlobalScopeClient::from(getExecutionContext())
234 ->respondToFetchEvent(m_eventID, m_eventDispatchTime); 259 ->respondToFetchEvent(m_eventID, m_eventDispatchTime);
235 } 260 }
236 261
237 FetchRespondWithObserver::FetchRespondWithObserver( 262 FetchRespondWithObserver::FetchRespondWithObserver(
238 ExecutionContext* context, 263 ExecutionContext* context,
239 int fetchEventID, 264 int fetchEventID,
240 const KURL& requestURL, 265 const KURL& requestURL,
241 WebURLRequest::FetchRequestMode requestMode, 266 WebURLRequest::FetchRequestMode requestMode,
242 WebURLRequest::FetchRedirectMode redirectMode, 267 WebURLRequest::FetchRedirectMode redirectMode,
243 WebURLRequest::FrameType frameType, 268 WebURLRequest::FrameType frameType,
244 WebURLRequest::RequestContext requestContext, 269 WebURLRequest::RequestContext requestContext,
245 WaitUntilObserver* observer) 270 WaitUntilObserver* observer)
246 : RespondWithObserver(context, fetchEventID, observer), 271 : RespondWithObserver(context, fetchEventID, observer),
247 m_requestURL(requestURL), 272 m_requestURL(requestURL),
248 m_requestMode(requestMode), 273 m_requestMode(requestMode),
249 m_redirectMode(redirectMode), 274 m_redirectMode(redirectMode),
250 m_frameType(frameType), 275 m_frameType(frameType),
251 m_requestContext(requestContext) {} 276 m_requestContext(requestContext) {}
252 277
253 DEFINE_TRACE(FetchRespondWithObserver) { 278 DEFINE_TRACE(FetchRespondWithObserver) {
254 RespondWithObserver::trace(visitor); 279 RespondWithObserver::trace(visitor);
255 } 280 }
256 281
257 } // namespace blink 282 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698