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, BodyStreamBuffer2* buffer, FetchDa taLoader* loader) |
182 : m_resolver(resolver) | 185 : m_resolver(resolver) |
183 , m_cache(cache) | 186 , m_cache(cache) |
187 , m_buffer(buffer) | |
184 { | 188 { |
185 request->populateWebServiceWorkerRequest(m_webRequest); | 189 request->populateWebServiceWorkerRequest(m_webRequest); |
186 response->populateWebServiceWorkerResponse(m_webResponse); | 190 response->populateWebServiceWorkerResponse(m_webResponse); |
191 m_buffer->registerLoader(loader); | |
187 } | 192 } |
188 ~AsyncPutBatch() override { } | 193 ~AsyncPutBatch() override { } |
189 void didCreateBlobHandle(PassRefPtr<BlobDataHandle> handle) override | 194 |
195 void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> handle) overrid e | |
190 { | 196 { |
197 m_buffer->unregisterLoader(); | |
191 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t( 1)); | 198 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t( 1)); |
192 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeP ut; | 199 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeP ut; |
193 batchOperations[0].request = m_webRequest; | 200 batchOperations[0].request = m_webRequest; |
194 batchOperations[0].response = m_webResponse; | 201 batchOperations[0].response = m_webResponse; |
195 batchOperations[0].response.setBlobDataHandle(handle); | 202 batchOperations[0].response.setBlobDataHandle(handle); |
196 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver.get()), batchOperations); | 203 m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, Cach eStorageError>(m_resolver.get()), batchOperations); |
197 cleanup(); | 204 cleanup(); |
198 } | 205 } |
199 void didFail(DOMException* exception) override | 206 |
207 void didFetchDataLoadFailed() override | |
200 { | 208 { |
209 m_buffer->unregisterLoader(); | |
201 ScriptState* state = m_resolver->scriptState(); | 210 ScriptState* state = m_resolver->scriptState(); |
202 ScriptState::Scope scope(state); | 211 ScriptState::Scope scope(state); |
203 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), e xception->toString())); | 212 m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), " FOXES ARE CUTE")); // FIXME error message |
yhirano
2015/06/25 10:45:31
Please use TODO.
I do like messages like "network
hiroshige
2015/06/25 11:27:28
Done.
| |
204 cleanup(); | 213 cleanup(); |
205 } | 214 } |
206 | 215 |
207 DEFINE_INLINE_VIRTUAL_TRACE() | 216 DEFINE_INLINE_VIRTUAL_TRACE() |
208 { | 217 { |
218 Client::trace(visitor); | |
209 visitor->trace(m_resolver); | 219 visitor->trace(m_resolver); |
210 visitor->trace(m_cache); | 220 visitor->trace(m_cache); |
211 BlobHandleCreatorClient::trace(visitor); | 221 visitor->trace(m_buffer); |
212 } | 222 } |
213 | 223 |
214 private: | 224 private: |
215 void cleanup() | 225 void cleanup() |
216 { | 226 { |
217 m_resolver = nullptr; | 227 m_resolver = nullptr; |
218 m_cache = nullptr; | 228 m_cache = nullptr; |
229 m_buffer = nullptr; | |
219 } | 230 } |
220 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver; | 231 RefPtrWillBeMember<ScriptPromiseResolver> m_resolver; |
221 Member<Cache> m_cache; | 232 Member<Cache> m_cache; |
233 Member<BodyStreamBuffer2> m_buffer; | |
222 WebServiceWorkerRequest m_webRequest; | 234 WebServiceWorkerRequest m_webRequest; |
223 WebServiceWorkerResponse m_webResponse; | 235 WebServiceWorkerResponse m_webResponse; |
224 }; | 236 }; |
225 | 237 |
226 Cache* Cache::create(WeakPtr<GlobalFetch::ScopedFetcher> fetcher, WebServiceWork erCache* webCache) | 238 Cache* Cache::create(WeakPtr<GlobalFetch::ScopedFetcher> fetcher, WebServiceWork erCache* webCache) |
227 { | 239 { |
228 return new Cache(fetcher, webCache); | 240 return new Cache(fetcher, webCache); |
229 } | 241 } |
230 | 242 |
231 ScriptPromise Cache::match(ScriptState* scriptState, const RequestInfo& request, const CacheQueryOptions& options, ExceptionState& exceptionState) | 243 ScriptPromise Cache::match(ScriptState* scriptState, const RequestInfo& request, const CacheQueryOptions& options, ExceptionState& exceptionState) |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
393 if (response->hasBody() && response->bodyUsed()) | 405 if (response->hasBody() && response->bodyUsed()) |
394 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Response body is already used")); | 406 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Response body is already used")); |
395 | 407 |
396 if (request->hasBody()) | 408 if (request->hasBody()) |
397 request->lockBody(Body::PassBody); | 409 request->lockBody(Body::PassBody); |
398 if (response->hasBody()) | 410 if (response->hasBody()) |
399 response->lockBody(Body::PassBody); | 411 response->lockBody(Body::PassBody); |
400 | 412 |
401 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState); | 413 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState); |
402 const ScriptPromise promise = resolver->promise(); | 414 const ScriptPromise promise = resolver->promise(); |
403 if (BodyStreamBuffer* buffer = response->internalBuffer()) { | 415 if (BodyStreamBuffer2* buffer = response->internalBuffer()) { |
404 if (buffer == response->buffer() && response->isBodyConsumed()) | 416 if (buffer == response->buffer() && response->isBodyConsumed()) |
405 buffer = response->createDrainingStream(); | 417 buffer = response->createDrainingStream(); |
406 // If the response body type is stream, read the all data and create the | 418 // Create a blob handle and dispatch the put batch asynchronously. |
407 // blob handle and dispatch the put batch asynchronously. | 419 FetchDataLoader* loader = FetchDataLoader::createLoaderAsBlobHandle(resp onse->internalMIMEType()); |
408 buffer->readAllAndCreateBlobHandle(response->internalMIMEType(), new Asy ncPutBatch(resolver, this, request, response)); | 420 loader->start(buffer->handle(), new AsyncPutBatch(resolver, this, reques t, response, buffer, loader)); |
409 return promise; | 421 return promise; |
410 } | 422 } |
411 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); | 423 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); |
412 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut; | 424 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut; |
413 request->populateWebServiceWorkerRequest(batchOperations[0].request); | 425 request->populateWebServiceWorkerRequest(batchOperations[0].request); |
414 response->populateWebServiceWorkerResponse(batchOperations[0].response); | 426 response->populateWebServiceWorkerResponse(batchOperations[0].response); |
415 | 427 |
416 m_webCache->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError >(resolver), batchOperations); | 428 m_webCache->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError >(resolver), batchOperations); |
417 return promise; | 429 return promise; |
418 } | 430 } |
(...skipping 16 matching lines...) Expand all Loading... | |
435 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options)); | 447 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options)); |
436 return promise; | 448 return promise; |
437 } | 449 } |
438 | 450 |
439 WebServiceWorkerCache* Cache::webCache() const | 451 WebServiceWorkerCache* Cache::webCache() const |
440 { | 452 { |
441 return m_webCache.get(); | 453 return m_webCache.get(); |
442 } | 454 } |
443 | 455 |
444 } // namespace blink | 456 } // namespace blink |
OLD | NEW |