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 |