| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |