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

Side by Side Diff: Source/modules/cachestorage/Cache.cpp

Issue 1192913007: Change BodyStreamBuffer to be FetchDataConsumerHandle-based and enable backpressure in Fetch API (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Reflect comments. Created 5 years, 6 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
« no previous file with comments | « no previous file | Source/modules/fetch/Body.h » ('j') | Source/modules/fetch/Body.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "config.h" 5 #include "config.h"
6 #include "modules/cachestorage/Cache.h" 6 #include "modules/cachestorage/Cache.h"
7 7
8 #include "bindings/core/v8/CallbackPromiseAdapter.h" 8 #include "bindings/core/v8/CallbackPromiseAdapter.h"
9 #include "bindings/core/v8/ExceptionState.h" 9 #include "bindings/core/v8/ExceptionState.h"
10 #include "bindings/core/v8/ScriptPromiseResolver.h" 10 #include "bindings/core/v8/ScriptPromiseResolver.h"
11 #include "bindings/core/v8/ScriptState.h" 11 #include "bindings/core/v8/ScriptState.h"
12 #include "bindings/core/v8/V8ThrowException.h" 12 #include "bindings/core/v8/V8ThrowException.h"
13 #include "bindings/modules/v8/V8Response.h" 13 #include "bindings/modules/v8/V8Response.h"
14 #include "core/dom/DOMException.h" 14 #include "core/dom/DOMException.h"
15 #include "core/dom/ExceptionCode.h"
15 #include "modules/cachestorage/CacheStorageError.h" 16 #include "modules/cachestorage/CacheStorageError.h"
16 #include "modules/fetch/BodyStreamBuffer.h" 17 #include "modules/fetch/BodyStreamBuffer.h"
18 #include "modules/fetch/FetchDataLoader.h"
17 #include "modules/fetch/GlobalFetch.h" 19 #include "modules/fetch/GlobalFetch.h"
18 #include "modules/fetch/Request.h" 20 #include "modules/fetch/Request.h"
19 #include "modules/fetch/Response.h" 21 #include "modules/fetch/Response.h"
20 #include "public/platform/WebServiceWorkerCache.h" 22 #include "public/platform/WebServiceWorkerCache.h"
21 23
22 namespace blink { 24 namespace blink {
23 25
24 namespace { 26 namespace {
25 27
26 // FIXME: Consider using CallbackPromiseAdapter. 28 // FIXME: Consider using CallbackPromiseAdapter.
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 : ScriptFunction(scriptState) 171 : ScriptFunction(scriptState)
170 , m_cache(cache) 172 , m_cache(cache)
171 , m_request(request) 173 , m_request(request)
172 { 174 {
173 } 175 }
174 176
175 Member<Cache> m_cache; 177 Member<Cache> m_cache;
176 Member<Request> m_request; 178 Member<Request> m_request;
177 }; 179 };
178 180
179 class Cache::AsyncPutBatch final : public BodyStreamBuffer::BlobHandleCreatorCli ent { 181 class Cache::AsyncPutBatch final : public GarbageCollectedFinalized<AsyncPutBatc h>, public FetchDataLoader::Client {
182 USING_GARBAGE_COLLECTED_MIXIN(AsyncPutBatch);
180 public: 183 public:
181 AsyncPutBatch(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver, Cache* cache, Request* request, Response* response) 184 AsyncPutBatch(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver, Cache* cache, Request* request, Response* response)
182 : m_resolver(resolver) 185 : m_resolver(resolver)
183 , m_cache(cache) 186 , m_cache(cache)
184 { 187 {
185 request->populateWebServiceWorkerRequest(m_webRequest); 188 request->populateWebServiceWorkerRequest(m_webRequest);
186 response->populateWebServiceWorkerResponse(m_webResponse); 189 response->populateWebServiceWorkerResponse(m_webResponse);
187 } 190 }
188 ~AsyncPutBatch() override { } 191 ~AsyncPutBatch() override { }
189 void didCreateBlobHandle(PassRefPtr<BlobDataHandle> handle) override 192
193 void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> handle) overrid e
190 { 194 {
191 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t( 1)); 195 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t( 1));
192 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeP ut; 196 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeP ut;
193 batchOperations[0].request = m_webRequest; 197 batchOperations[0].request = m_webRequest;
194 batchOperations[0].response = m_webResponse; 198 batchOperations[0].response = m_webResponse;
195 batchOperations[0].response.setBlobDataHandle(handle); 199 batchOperations[0].response.setBlobDataHandle(handle);
196 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver.get()), batchOperations); 200 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver.get()), batchOperations);
197 cleanup(); 201 cleanup();
198 } 202 }
199 void didFail(DOMException* exception) override 203
204 void didFetchDataLoadFailed() override
200 { 205 {
201 ScriptState* state = m_resolver->scriptState(); 206 ScriptState* state = m_resolver->scriptState();
202 ScriptState::Scope scope(state); 207 ScriptState::Scope scope(state);
203 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), e xception->toString())); 208 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), " network error"));
204 cleanup(); 209 cleanup();
205 } 210 }
206 211
207 DEFINE_INLINE_VIRTUAL_TRACE() 212 DEFINE_INLINE_VIRTUAL_TRACE()
208 { 213 {
214 Client::trace(visitor);
209 visitor->trace(m_resolver); 215 visitor->trace(m_resolver);
210 visitor->trace(m_cache); 216 visitor->trace(m_cache);
211 BlobHandleCreatorClient::trace(visitor);
212 } 217 }
213 218
214 private: 219 private:
215 void cleanup() 220 void cleanup()
216 { 221 {
217 m_resolver = nullptr; 222 m_resolver = nullptr;
218 m_cache = nullptr; 223 m_cache = nullptr;
219 } 224 }
220 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver; 225 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver;
221 Member<Cache> m_cache; 226 Member<Cache> m_cache;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 if (request->hasBody()) 401 if (request->hasBody())
397 request->lockBody(Body::PassBody); 402 request->lockBody(Body::PassBody);
398 if (response->hasBody()) 403 if (response->hasBody())
399 response->lockBody(Body::PassBody); 404 response->lockBody(Body::PassBody);
400 405
401 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState); 406 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
402 const ScriptPromise promise = resolver->promise(); 407 const ScriptPromise promise = resolver->promise();
403 if (BodyStreamBuffer* buffer = response->internalBuffer()) { 408 if (BodyStreamBuffer* buffer = response->internalBuffer()) {
404 if (buffer == response->buffer() && response->isBodyConsumed()) 409 if (buffer == response->buffer() && response->isBodyConsumed())
405 buffer = response->createDrainingStream(); 410 buffer = response->createDrainingStream();
406 // If the response body type is stream, read the all data and create the 411 // Create a blob handle and dispatch the put batch asynchronously.
407 // blob handle and dispatch the put batch asynchronously. 412 FetchDataLoader* loader = FetchDataLoader::createLoaderAsBlobHandle(resp onse->internalMIMEType());
408 buffer->readAllAndCreateBlobHandle(response->internalMIMEType(), new Asy ncPutBatch(resolver, this, request, response)); 413 buffer->startLoading(loader, new AsyncPutBatch(resolver, this, request, response));
409 return promise; 414 return promise;
410 } 415 }
411 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); 416 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
412 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut; 417 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut;
413 request->populateWebServiceWorkerRequest(batchOperations[0].request); 418 request->populateWebServiceWorkerRequest(batchOperations[0].request);
414 response->populateWebServiceWorkerResponse(batchOperations[0].response); 419 response->populateWebServiceWorkerResponse(batchOperations[0].response);
415 420
416 m_webCache->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError >(resolver), batchOperations); 421 m_webCache->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError >(resolver), batchOperations);
417 return promise; 422 return promise;
418 } 423 }
(...skipping 16 matching lines...) Expand all
435 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options)); 440 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options));
436 return promise; 441 return promise;
437 } 442 }
438 443
439 WebServiceWorkerCache* Cache::webCache() const 444 WebServiceWorkerCache* Cache::webCache() const
440 { 445 {
441 return m_webCache.get(); 446 return m_webCache.get();
442 } 447 }
443 448
444 } // namespace blink 449 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | Source/modules/fetch/Body.h » ('j') | Source/modules/fetch/Body.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698