Chromium Code Reviews| 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 |