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

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: Rebase. 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, BodyStreamBuffer2* buffer, FetchDa taLoader* loader)
182 : m_resolver(resolver) 185 : m_resolver(resolver)
183 , m_cache(cache) 186 , m_cache(cache)
187 , m_buffer(buffer)
184 { 188 {
185 request->populateWebServiceWorkerRequest(m_webRequest); 189 request->populateWebServiceWorkerRequest(m_webRequest);
186 response->populateWebServiceWorkerResponse(m_webResponse); 190 response->populateWebServiceWorkerResponse(m_webResponse);
191 m_buffer->registerLoader(loader);
187 } 192 }
188 ~AsyncPutBatch() override { } 193 ~AsyncPutBatch() override { }
189 void didCreateBlobHandle(PassRefPtr<BlobDataHandle> handle) override 194
195 void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> handle) overrid e
190 { 196 {
197 m_buffer->unregisterLoader();
191 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t( 1)); 198 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t( 1));
192 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeP ut; 199 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeP ut;
193 batchOperations[0].request = m_webRequest; 200 batchOperations[0].request = m_webRequest;
194 batchOperations[0].response = m_webResponse; 201 batchOperations[0].response = m_webResponse;
195 batchOperations[0].response.setBlobDataHandle(handle); 202 batchOperations[0].response.setBlobDataHandle(handle);
196 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver.get()), batchOperations); 203 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver.get()), batchOperations);
197 cleanup(); 204 cleanup();
198 } 205 }
199 void didFail(DOMException* exception) override 206
207 void didFetchDataLoadFailed() override
200 { 208 {
209 m_buffer->unregisterLoader();
201 ScriptState* state = m_resolver->scriptState(); 210 ScriptState* state = m_resolver->scriptState();
202 ScriptState::Scope scope(state); 211 ScriptState::Scope scope(state);
203 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), e xception->toString())); 212 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), " FOXES ARE CUTE")); // FIXME error message
yhirano 2015/06/25 10:45:31 Please use TODO. I do like messages like "network
hiroshige 2015/06/25 11:27:28 Done.
204 cleanup(); 213 cleanup();
205 } 214 }
206 215
207 DEFINE_INLINE_VIRTUAL_TRACE() 216 DEFINE_INLINE_VIRTUAL_TRACE()
208 { 217 {
218 Client::trace(visitor);
209 visitor->trace(m_resolver); 219 visitor->trace(m_resolver);
210 visitor->trace(m_cache); 220 visitor->trace(m_cache);
211 BlobHandleCreatorClient::trace(visitor); 221 visitor->trace(m_buffer);
212 } 222 }
213 223
214 private: 224 private:
215 void cleanup() 225 void cleanup()
216 { 226 {
217 m_resolver = nullptr; 227 m_resolver = nullptr;
218 m_cache = nullptr; 228 m_cache = nullptr;
229 m_buffer = nullptr;
219 } 230 }
220 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver; 231 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver;
221 Member<Cache> m_cache; 232 Member<Cache> m_cache;
233 Member<BodyStreamBuffer2> m_buffer;
222 WebServiceWorkerRequest m_webRequest; 234 WebServiceWorkerRequest m_webRequest;
223 WebServiceWorkerResponse m_webResponse; 235 WebServiceWorkerResponse m_webResponse;
224 }; 236 };
225 237
226 Cache* Cache::create(WeakPtr<GlobalFetch::ScopedFetcher> fetcher, WebServiceWork erCache* webCache) 238 Cache* Cache::create(WeakPtr<GlobalFetch::ScopedFetcher> fetcher, WebServiceWork erCache* webCache)
227 { 239 {
228 return new Cache(fetcher, webCache); 240 return new Cache(fetcher, webCache);
229 } 241 }
230 242
231 ScriptPromise Cache::match(ScriptState* scriptState, const RequestInfo& request, const CacheQueryOptions& options, ExceptionState& exceptionState) 243 ScriptPromise Cache::match(ScriptState* scriptState, const RequestInfo& request, const CacheQueryOptions& options, ExceptionState& exceptionState)
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 if (response->hasBody() && response->bodyUsed()) 405 if (response->hasBody() && response->bodyUsed())
394 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Response body is already used")); 406 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Response body is already used"));
395 407
396 if (request->hasBody()) 408 if (request->hasBody())
397 request->lockBody(Body::PassBody); 409 request->lockBody(Body::PassBody);
398 if (response->hasBody()) 410 if (response->hasBody())
399 response->lockBody(Body::PassBody); 411 response->lockBody(Body::PassBody);
400 412
401 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState); 413 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
402 const ScriptPromise promise = resolver->promise(); 414 const ScriptPromise promise = resolver->promise();
403 if (BodyStreamBuffer* buffer = response->internalBuffer()) { 415 if (BodyStreamBuffer2* buffer = response->internalBuffer()) {
404 if (buffer == response->buffer() && response->isBodyConsumed()) 416 if (buffer == response->buffer() && response->isBodyConsumed())
405 buffer = response->createDrainingStream(); 417 buffer = response->createDrainingStream();
406 // If the response body type is stream, read the all data and create the 418 // Create a blob handle and dispatch the put batch asynchronously.
407 // blob handle and dispatch the put batch asynchronously. 419 FetchDataLoader* loader = FetchDataLoader::createLoaderAsBlobHandle(resp onse->internalMIMEType());
408 buffer->readAllAndCreateBlobHandle(response->internalMIMEType(), new Asy ncPutBatch(resolver, this, request, response)); 420 loader->start(buffer->handle(), new AsyncPutBatch(resolver, this, reques t, response, buffer, loader));
409 return promise; 421 return promise;
410 } 422 }
411 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); 423 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
412 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut; 424 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut;
413 request->populateWebServiceWorkerRequest(batchOperations[0].request); 425 request->populateWebServiceWorkerRequest(batchOperations[0].request);
414 response->populateWebServiceWorkerResponse(batchOperations[0].response); 426 response->populateWebServiceWorkerResponse(batchOperations[0].response);
415 427
416 m_webCache->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError >(resolver), batchOperations); 428 m_webCache->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError >(resolver), batchOperations);
417 return promise; 429 return promise;
418 } 430 }
(...skipping 16 matching lines...) Expand all
435 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options)); 447 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options));
436 return promise; 448 return promise;
437 } 449 }
438 450
439 WebServiceWorkerCache* Cache::webCache() const 451 WebServiceWorkerCache* Cache::webCache() const
440 { 452 {
441 return m_webCache.get(); 453 return m_webCache.get();
442 } 454 }
443 455
444 } // namespace blink 456 } // 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