OLD | NEW |
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/cachestorage/Cache.h" | 5 #include "modules/cachestorage/Cache.h" |
6 | 6 |
7 #include "bindings/core/v8/CallbackPromiseAdapter.h" | 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
11 #include "bindings/core/v8/V8Binding.h" | 11 #include "bindings/core/v8/V8Binding.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/inspector/ConsoleMessage.h" | 15 #include "core/inspector/ConsoleMessage.h" |
16 #include "modules/cachestorage/CacheStorageError.h" | 16 #include "modules/cachestorage/CacheStorageError.h" |
17 #include "modules/fetch/BodyStreamBuffer.h" | 17 #include "modules/fetch/BodyStreamBuffer.h" |
18 #include "modules/fetch/FetchDataLoader.h" | 18 #include "modules/fetch/FetchDataLoader.h" |
19 #include "modules/fetch/GlobalFetch.h" | 19 #include "modules/fetch/GlobalFetch.h" |
20 #include "modules/fetch/Request.h" | 20 #include "modules/fetch/Request.h" |
21 #include "modules/fetch/Response.h" | 21 #include "modules/fetch/Response.h" |
22 #include "platform/HTTPNames.h" | 22 #include "platform/HTTPNames.h" |
23 #include "platform/Histogram.h" | 23 #include "platform/Histogram.h" |
24 #include "platform/RuntimeEnabledFeatures.h" | |
25 #include "public/platform/modules/serviceworker/WebServiceWorkerCache.h" | 24 #include "public/platform/modules/serviceworker/WebServiceWorkerCache.h" |
26 #include <memory> | 25 #include <memory> |
27 | 26 |
28 namespace blink { | 27 namespace blink { |
29 | 28 |
30 namespace { | 29 namespace { |
31 | 30 |
32 void checkCacheQueryOptions(const CacheQueryOptions& options, ExecutionContext*
context) | |
33 { | |
34 if (!RuntimeEnabledFeatures::cacheIgnoreSearchOptionEnabled() && options.ign
oreSearch()) | |
35 context->addConsoleMessage(ConsoleMessage::create(JSMessageSource, Warni
ngMessageLevel, "Cache.match() does not support 'ignoreSearch' option yet. See h
ttp://crbug.com/520784")); | |
36 if (options.ignoreMethod()) | |
37 context->addConsoleMessage(ConsoleMessage::create(JSMessageSource, Warni
ngMessageLevel, "Cache.match() does not support 'ignoreMethod' option yet. See h
ttp://crbug.com/482256")); | |
38 if (options.ignoreVary()) | |
39 context->addConsoleMessage(ConsoleMessage::create(JSMessageSource, Warni
ngMessageLevel, "Cache.match() does not support 'ignoreVary' option yet. See htt
p://crbug.com/499216")); | |
40 } | |
41 | |
42 // FIXME: Consider using CallbackPromiseAdapter. | 31 // FIXME: Consider using CallbackPromiseAdapter. |
43 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { | 32 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { |
44 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); | 33 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); |
45 public: | 34 public: |
46 explicit CacheMatchCallbacks(ScriptPromiseResolver* resolver) | 35 explicit CacheMatchCallbacks(ScriptPromiseResolver* resolver) |
47 : m_resolver(resolver) { } | 36 : m_resolver(resolver) { } |
48 | 37 |
49 void onSuccess(const WebServiceWorkerResponse& webResponse) override | 38 void onSuccess(const WebServiceWorkerResponse& webResponse) override |
50 { | 39 { |
51 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) | 40 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 Request* newRequest = Request::create(scriptState, request.getAsUSVString(),
exceptionState); | 449 Request* newRequest = Request::create(scriptState, request.getAsUSVString(),
exceptionState); |
461 if (exceptionState.hadException()) | 450 if (exceptionState.hadException()) |
462 return ScriptPromise(); | 451 return ScriptPromise(); |
463 return keysImpl(scriptState, newRequest, options); | 452 return keysImpl(scriptState, newRequest, options); |
464 } | 453 } |
465 | 454 |
466 // static | 455 // static |
467 WebServiceWorkerCache::QueryParams Cache::toWebQueryParams(const CacheQueryOptio
ns& options) | 456 WebServiceWorkerCache::QueryParams Cache::toWebQueryParams(const CacheQueryOptio
ns& options) |
468 { | 457 { |
469 WebServiceWorkerCache::QueryParams webQueryParams; | 458 WebServiceWorkerCache::QueryParams webQueryParams; |
470 webQueryParams.ignoreSearch = options.ignoreSearch() && RuntimeEnabledFeatur
es::cacheIgnoreSearchOptionEnabled(); | 459 webQueryParams.ignoreSearch = options.ignoreSearch(); |
471 webQueryParams.ignoreMethod = options.ignoreMethod(); | 460 webQueryParams.ignoreMethod = options.ignoreMethod(); |
472 webQueryParams.ignoreVary = options.ignoreVary(); | 461 webQueryParams.ignoreVary = options.ignoreVary(); |
473 webQueryParams.cacheName = options.cacheName(); | 462 webQueryParams.cacheName = options.cacheName(); |
474 return webQueryParams; | 463 return webQueryParams; |
475 } | 464 } |
476 | 465 |
477 Cache::Cache(GlobalFetch::ScopedFetcher* fetcher, std::unique_ptr<WebServiceWork
erCache> webCache) | 466 Cache::Cache(GlobalFetch::ScopedFetcher* fetcher, std::unique_ptr<WebServiceWork
erCache> webCache) |
478 : m_scopedFetcher(fetcher) | 467 : m_scopedFetcher(fetcher) |
479 , m_webCache(std::move(webCache)) | 468 , m_webCache(std::move(webCache)) |
480 { | 469 { |
481 } | 470 } |
482 | 471 |
483 DEFINE_TRACE(Cache) | 472 DEFINE_TRACE(Cache) |
484 { | 473 { |
485 visitor->trace(m_scopedFetcher); | 474 visitor->trace(m_scopedFetcher); |
486 } | 475 } |
487 | 476 |
488 ScriptPromise Cache::matchImpl(ScriptState* scriptState, const Request* request,
const CacheQueryOptions& options) | 477 ScriptPromise Cache::matchImpl(ScriptState* scriptState, const Request* request,
const CacheQueryOptions& options) |
489 { | 478 { |
490 WebServiceWorkerRequest webRequest; | 479 WebServiceWorkerRequest webRequest; |
491 request->populateWebServiceWorkerRequest(webRequest); | 480 request->populateWebServiceWorkerRequest(webRequest); |
492 checkCacheQueryOptions(options, scriptState->getExecutionContext()); | |
493 | 481 |
494 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 482 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
495 const ScriptPromise promise = resolver->promise(); | 483 const ScriptPromise promise = resolver->promise(); |
496 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { | 484 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { |
497 resolver->resolve(); | 485 resolver->resolve(); |
498 return promise; | 486 return promise; |
499 } | 487 } |
500 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, toW
ebQueryParams(options)); | 488 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, toW
ebQueryParams(options)); |
501 return promise; | 489 return promise; |
502 } | 490 } |
503 | 491 |
504 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState) | 492 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState) |
505 { | 493 { |
506 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 494 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
507 const ScriptPromise promise = resolver->promise(); | 495 const ScriptPromise promise = resolver->promise(); |
508 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), WebS
erviceWorkerRequest(), WebServiceWorkerCache::QueryParams()); | 496 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), WebS
erviceWorkerRequest(), WebServiceWorkerCache::QueryParams()); |
509 return promise; | 497 return promise; |
510 } | 498 } |
511 | 499 |
512 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, const Request* reque
st, const CacheQueryOptions& options) | 500 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, const Request* reque
st, const CacheQueryOptions& options) |
513 { | 501 { |
514 WebServiceWorkerRequest webRequest; | 502 WebServiceWorkerRequest webRequest; |
515 request->populateWebServiceWorkerRequest(webRequest); | 503 request->populateWebServiceWorkerRequest(webRequest); |
516 checkCacheQueryOptions(options, scriptState->getExecutionContext()); | |
517 | 504 |
518 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 505 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
519 const ScriptPromise promise = resolver->promise(); | 506 const ScriptPromise promise = resolver->promise(); |
520 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { | 507 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { |
521 resolver->resolve(HeapVector<Member<Response>>()); | 508 resolver->resolve(HeapVector<Member<Response>>()); |
522 return promise; | 509 return promise; |
523 } | 510 } |
524 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR
equest, toWebQueryParams(options)); | 511 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR
equest, toWebQueryParams(options)); |
525 return promise; | 512 return promise; |
526 } | 513 } |
(...skipping 18 matching lines...) Expand all Loading... |
545 } | 532 } |
546 | 533 |
547 return ScriptPromise::all(scriptState, promises).then(FetchResolvedForAdd::c
reate(scriptState, this, requests)); | 534 return ScriptPromise::all(scriptState, promises).then(FetchResolvedForAdd::c
reate(scriptState, this, requests)); |
548 } | 535 } |
549 | 536 |
550 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, const Request* request
, const CacheQueryOptions& options) | 537 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, const Request* request
, const CacheQueryOptions& options) |
551 { | 538 { |
552 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); | 539 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); |
553 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelet
e; | 540 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelet
e; |
554 request->populateWebServiceWorkerRequest(batchOperations[0].request); | 541 request->populateWebServiceWorkerRequest(batchOperations[0].request); |
555 checkCacheQueryOptions(options, scriptState->getExecutionContext()); | |
556 batchOperations[0].matchParams = toWebQueryParams(options); | 542 batchOperations[0].matchParams = toWebQueryParams(options); |
557 | 543 |
558 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 544 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
559 const ScriptPromise promise = resolver->promise(); | 545 const ScriptPromise promise = resolver->promise(); |
560 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { | 546 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { |
561 resolver->resolve(false); | 547 resolver->resolve(false); |
562 return promise; | 548 return promise; |
563 } | 549 } |
564 m_webCache->dispatchBatch(new CacheDeleteCallback(resolver), batchOperations
); | 550 m_webCache->dispatchBatch(new CacheDeleteCallback(resolver), batchOperations
); |
565 return promise; | 551 return promise; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 606 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
621 const ScriptPromise promise = resolver->promise(); | 607 const ScriptPromise promise = resolver->promise(); |
622 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), WebServic
eWorkerRequest(), WebServiceWorkerCache::QueryParams()); | 608 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), WebServic
eWorkerRequest(), WebServiceWorkerCache::QueryParams()); |
623 return promise; | 609 return promise; |
624 } | 610 } |
625 | 611 |
626 ScriptPromise Cache::keysImpl(ScriptState* scriptState, const Request* request,
const CacheQueryOptions& options) | 612 ScriptPromise Cache::keysImpl(ScriptState* scriptState, const Request* request,
const CacheQueryOptions& options) |
627 { | 613 { |
628 WebServiceWorkerRequest webRequest; | 614 WebServiceWorkerRequest webRequest; |
629 request->populateWebServiceWorkerRequest(webRequest); | 615 request->populateWebServiceWorkerRequest(webRequest); |
630 checkCacheQueryOptions(options, scriptState->getExecutionContext()); | |
631 | 616 |
632 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 617 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
633 const ScriptPromise promise = resolver->promise(); | 618 const ScriptPromise promise = resolver->promise(); |
634 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { | 619 if (request->method() != HTTPNames::GET && !options.ignoreMethod()) { |
635 resolver->resolve(HeapVector<Member<Request>>()); | 620 resolver->resolve(HeapVector<Member<Request>>()); |
636 return promise; | 621 return promise; |
637 } | 622 } |
638 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), webReques
t, toWebQueryParams(options)); | 623 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), webReques
t, toWebQueryParams(options)); |
639 return promise; | 624 return promise; |
640 } | 625 } |
641 | 626 |
642 WebServiceWorkerCache* Cache::webCache() const | 627 WebServiceWorkerCache* Cache::webCache() const |
643 { | 628 { |
644 return m_webCache.get(); | 629 return m_webCache.get(); |
645 } | 630 } |
646 | 631 |
647 } // namespace blink | 632 } // namespace blink |
OLD | NEW |