| 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 |