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 |