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

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, 5 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 "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/V8Binding.h" 12 #include "bindings/core/v8/V8Binding.h"
13 #include "bindings/core/v8/V8ThrowException.h" 13 #include "bindings/core/v8/V8ThrowException.h"
14 #include "bindings/modules/v8/V8Response.h" 14 #include "bindings/modules/v8/V8Response.h"
15 #include "core/dom/DOMException.h" 15 #include "core/dom/DOMException.h"
16 #include "core/dom/ExceptionCode.h" 16 #include "core/dom/ExceptionCode.h"
17 #include "modules/cachestorage/CacheStorageError.h" 17 #include "modules/cachestorage/CacheStorageError.h"
18 #include "modules/fetch/BodyStreamBuffer.h" 18 #include "modules/fetch/BodyStreamBuffer.h"
19 #include "modules/fetch/FetchDataLoader.h"
19 #include "modules/fetch/GlobalFetch.h" 20 #include "modules/fetch/GlobalFetch.h"
20 #include "modules/fetch/Request.h" 21 #include "modules/fetch/Request.h"
21 #include "modules/fetch/Response.h" 22 #include "modules/fetch/Response.h"
22 #include "public/platform/WebServiceWorkerCache.h" 23 #include "public/platform/WebServiceWorkerCache.h"
23 24
24 namespace blink { 25 namespace blink {
25 26
26 namespace { 27 namespace {
27 28
28 // FIXME: Consider using CallbackPromiseAdapter. 29 // FIXME: Consider using CallbackPromiseAdapter.
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 { 289 {
289 ASSERT(index < m_batchOperations.size()); 290 ASSERT(index < m_batchOperations.size());
290 if (m_completed) 291 if (m_completed)
291 return; 292 return;
292 m_batchOperations[index] = batchOperation; 293 m_batchOperations[index] = batchOperation;
293 if (--m_numberOfRemainingOperations != 0) 294 if (--m_numberOfRemainingOperations != 0)
294 return; 295 return;
295 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver), m_batchOperations); 296 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver), m_batchOperations);
296 } 297 }
297 298
298 void onError(DOMException* exception) 299 void onError(const String& errorMessage)
299 { 300 {
300 if (m_completed) 301 if (m_completed)
301 return; 302 return;
302 m_completed = true; 303 m_completed = true;
303 m_resolver->reject(exception); 304 ScriptState* state = m_resolver->scriptState();
304 } 305 ScriptState::Scope scope(state);
305 306 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), e rrorMessage));
306 void onError(v8::Local<v8::Value> exception)
307 {
308 if (m_completed)
309 return;
310 m_completed = true;
311 m_resolver->reject(exception);
312 } 307 }
313 308
314 DEFINE_INLINE_VIRTUAL_TRACE() 309 DEFINE_INLINE_VIRTUAL_TRACE()
315 { 310 {
316 visitor->trace(m_cache); 311 visitor->trace(m_cache);
317 visitor->trace(m_resolver); 312 visitor->trace(m_resolver);
318 } 313 }
319 314
320 private: 315 private:
321 bool m_completed = false; 316 bool m_completed = false;
322 int m_numberOfRemainingOperations; 317 int m_numberOfRemainingOperations;
323 Member<Cache> m_cache; 318 Member<Cache> m_cache;
324 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver; 319 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver;
325 Vector<WebServiceWorkerCache::BatchOperation> m_batchOperations; 320 Vector<WebServiceWorkerCache::BatchOperation> m_batchOperations;
326 }; 321 };
327 322
328 class Cache::BlobHandleCallbackForPut final : public BodyStreamBuffer::BlobHandl eCreatorClient { 323 class Cache::BlobHandleCallbackForPut final : public GarbageCollectedFinalized<B lobHandleCallbackForPut>, public FetchDataLoader::Client {
324 USING_GARBAGE_COLLECTED_MIXIN(BlobHandleCallbackForPut);
329 public: 325 public:
330 BlobHandleCallbackForPut(size_t index, BarrierCallbackForPut* barrierCallbac k, Request* request, Response* response) 326 BlobHandleCallbackForPut(size_t index, BarrierCallbackForPut* barrierCallbac k, Request* request, Response* response)
331 : m_index(index) 327 : m_index(index)
332 , m_barrierCallback(barrierCallback) 328 , m_barrierCallback(barrierCallback)
333 { 329 {
334 request->populateWebServiceWorkerRequest(m_webRequest); 330 request->populateWebServiceWorkerRequest(m_webRequest);
335 response->populateWebServiceWorkerResponse(m_webResponse); 331 response->populateWebServiceWorkerResponse(m_webResponse);
336 } 332 }
337 ~BlobHandleCallbackForPut() override { } 333 ~BlobHandleCallbackForPut() override { }
338 334
339 void didCreateBlobHandle(PassRefPtr<BlobDataHandle> handle) override 335 void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> handle) overrid e
340 { 336 {
341 WebServiceWorkerCache::BatchOperation batchOperation; 337 WebServiceWorkerCache::BatchOperation batchOperation;
342 batchOperation.operationType = WebServiceWorkerCache::OperationTypePut; 338 batchOperation.operationType = WebServiceWorkerCache::OperationTypePut;
343 batchOperation.request = m_webRequest; 339 batchOperation.request = m_webRequest;
344 batchOperation.response = m_webResponse; 340 batchOperation.response = m_webResponse;
345 batchOperation.response.setBlobDataHandle(handle); 341 batchOperation.response.setBlobDataHandle(handle);
346 m_barrierCallback->onSuccess(m_index, batchOperation); 342 m_barrierCallback->onSuccess(m_index, batchOperation);
347 } 343 }
348 344
349 void didFail(DOMException* exception) override 345 void didFetchDataLoadFailed() override
350 { 346 {
351 m_barrierCallback->onError(exception); 347 m_barrierCallback->onError("network error");
352 } 348 }
353 349
354 DEFINE_INLINE_VIRTUAL_TRACE() 350 DEFINE_INLINE_VIRTUAL_TRACE()
355 { 351 {
356 visitor->trace(m_barrierCallback); 352 visitor->trace(m_barrierCallback);
357 BlobHandleCreatorClient::trace(visitor); 353 FetchDataLoader::Client::trace(visitor);
358 } 354 }
359 355
360 private: 356 private:
361 const size_t m_index; 357 const size_t m_index;
362 Member<BarrierCallbackForPut> m_barrierCallback; 358 Member<BarrierCallbackForPut> m_barrierCallback;
363 359
364 WebServiceWorkerRequest m_webRequest; 360 WebServiceWorkerRequest m_webRequest;
365 WebServiceWorkerResponse m_webResponse; 361 WebServiceWorkerResponse m_webResponse;
366 }; 362 };
367 363
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 530
535 ScriptPromise Cache::putImpl(ScriptState* scriptState, const HeapVector<Member<R equest>>& requests, const HeapVector<Member<Response>>& responses) 531 ScriptPromise Cache::putImpl(ScriptState* scriptState, const HeapVector<Member<R equest>>& requests, const HeapVector<Member<Response>>& responses)
536 { 532 {
537 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState); 533 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
538 const ScriptPromise promise = resolver->promise(); 534 const ScriptPromise promise = resolver->promise();
539 BarrierCallbackForPut* barrierCallback = new BarrierCallbackForPut(requests. size(), this, resolver.get()); 535 BarrierCallbackForPut* barrierCallback = new BarrierCallbackForPut(requests. size(), this, resolver.get());
540 536
541 for (size_t i = 0; i < requests.size(); ++i) { 537 for (size_t i = 0; i < requests.size(); ++i) {
542 KURL url(KURL(), requests[i]->url()); 538 KURL url(KURL(), requests[i]->url());
543 if (!url.protocolIsInHTTPFamily()) { 539 if (!url.protocolIsInHTTPFamily()) {
544 barrierCallback->onError(V8ThrowException::createTypeError(scriptSta te->isolate(), "Request scheme '" + url.protocol() + "' is unsupported")); 540 barrierCallback->onError("Request scheme '" + url.protocol() + "' is unsupported");
545 return promise; 541 return promise;
546 } 542 }
547 if (requests[i]->method() != "GET") { 543 if (requests[i]->method() != "GET") {
548 barrierCallback->onError(V8ThrowException::createTypeError(scriptSta te->isolate(), "Request method '" + requests[i]->method() + "' is unsupported")) ; 544 barrierCallback->onError("Request method '" + requests[i]->method() + "' is unsupported");
549 return promise; 545 return promise;
550 } 546 }
551 if (requests[i]->hasBody() && requests[i]->bodyUsed()) { 547 if (requests[i]->hasBody() && requests[i]->bodyUsed()) {
552 barrierCallback->onError(V8ThrowException::createTypeError(scriptSta te->isolate(), "Request body is already used")); 548 barrierCallback->onError("Request body is already used");
553 return promise; 549 return promise;
554 } 550 }
555 if (responses[i]->hasBody() && responses[i]->bodyUsed()) { 551 if (responses[i]->hasBody() && responses[i]->bodyUsed()) {
556 barrierCallback->onError(V8ThrowException::createTypeError(scriptSta te->isolate(), "Response body is already used")); 552 barrierCallback->onError("Response body is already used");
557 return promise; 553 return promise;
558 } 554 }
559 555
560 if (requests[i]->hasBody()) 556 if (requests[i]->hasBody())
561 requests[i]->lockBody(Body::PassBody); 557 requests[i]->lockBody(Body::PassBody);
562 if (responses[i]->hasBody()) 558 if (responses[i]->hasBody())
563 responses[i]->lockBody(Body::PassBody); 559 responses[i]->lockBody(Body::PassBody);
564 560
565 if (BodyStreamBuffer* buffer = responses[i]->internalBuffer()) { 561 if (OwnPtr<DrainingBodyStreamBuffer> buffer = responses[i]->createIntern alDrainingStream()) {
566 if (buffer == responses[i]->buffer() && responses[i]->isBodyConsumed ()) 562 // If the response has body, read the all data and create
567 buffer = responses[i]->createDrainingStream();
568 // If the response body type is stream, read the all data and create
569 // the blob handle and dispatch the put batch asynchronously. 563 // the blob handle and dispatch the put batch asynchronously.
570 buffer->readAllAndCreateBlobHandle(responses[i]->internalMIMEType(), new BlobHandleCallbackForPut(i, barrierCallback, requests[i], responses[i])); 564 FetchDataLoader* loader = FetchDataLoader::createLoaderAsBlobHandle( responses[i]->internalMIMEType());
565 buffer->startLoading(loader, new BlobHandleCallbackForPut(i, barrier Callback, requests[i], responses[i]));
571 continue; 566 continue;
572 } 567 }
573 568
574 WebServiceWorkerCache::BatchOperation batchOperation; 569 WebServiceWorkerCache::BatchOperation batchOperation;
575 batchOperation.operationType = WebServiceWorkerCache::OperationTypePut; 570 batchOperation.operationType = WebServiceWorkerCache::OperationTypePut;
576 requests[i]->populateWebServiceWorkerRequest(batchOperation.request); 571 requests[i]->populateWebServiceWorkerRequest(batchOperation.request);
577 responses[i]->populateWebServiceWorkerResponse(batchOperation.response); 572 responses[i]->populateWebServiceWorkerResponse(batchOperation.response);
578 barrierCallback->onSuccess(i, batchOperation); 573 barrierCallback->onSuccess(i, batchOperation);
579 } 574 }
580 575
(...skipping 18 matching lines...) Expand all
599 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options)); 594 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options));
600 return promise; 595 return promise;
601 } 596 }
602 597
603 WebServiceWorkerCache* Cache::webCache() const 598 WebServiceWorkerCache* Cache::webCache() const
604 { 599 {
605 return m_webCache.get(); 600 return m_webCache.get();
606 } 601 }
607 602
608 } // namespace blink 603 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/http/tests/cachestorage/script-tests/cache-put.js ('k') | Source/modules/fetch/Body.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698