| 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 "modules/cachestorage/Cache.h" | 5 #include "modules/cachestorage/Cache.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" | 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
| 8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // FIXME: Consider using CallbackPromiseAdapter. | 32 // FIXME: Consider using CallbackPromiseAdapter. |
| 33 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { | 33 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { |
| 34 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); | 34 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); |
| 35 | 35 |
| 36 public: | 36 public: |
| 37 explicit CacheMatchCallbacks(ScriptPromiseResolver* resolver) | 37 explicit CacheMatchCallbacks(ScriptPromiseResolver* resolver) |
| 38 : m_resolver(resolver) {} | 38 : m_resolver(resolver) {} |
| 39 | 39 |
| 40 void onSuccess(const WebServiceWorkerResponse& webResponse) override { | 40 void onSuccess(const WebServiceWorkerResponse& webResponse) override { |
| 41 if (!m_resolver->getExecutionContext() || | 41 if (!m_resolver->getExecutionContext() || |
| 42 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 42 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 43 return; | 43 return; |
| 44 ScriptState::Scope scope(m_resolver->getScriptState()); | 44 ScriptState::Scope scope(m_resolver->getScriptState()); |
| 45 m_resolver->resolve( | 45 m_resolver->resolve( |
| 46 Response::create(m_resolver->getScriptState(), webResponse)); | 46 Response::create(m_resolver->getScriptState(), webResponse)); |
| 47 m_resolver.clear(); | 47 m_resolver.clear(); |
| 48 } | 48 } |
| 49 | 49 |
| 50 void onError(WebServiceWorkerCacheError reason) override { | 50 void onError(WebServiceWorkerCacheError reason) override { |
| 51 if (!m_resolver->getExecutionContext() || | 51 if (!m_resolver->getExecutionContext() || |
| 52 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 52 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 53 return; | 53 return; |
| 54 if (reason == WebServiceWorkerCacheErrorNotFound) | 54 if (reason == WebServiceWorkerCacheErrorNotFound) |
| 55 m_resolver->resolve(); | 55 m_resolver->resolve(); |
| 56 else | 56 else |
| 57 m_resolver->reject(CacheStorageError::createException(reason)); | 57 m_resolver->reject(CacheStorageError::createException(reason)); |
| 58 m_resolver.clear(); | 58 m_resolver.clear(); |
| 59 } | 59 } |
| 60 | 60 |
| 61 private: | 61 private: |
| 62 Persistent<ScriptPromiseResolver> m_resolver; | 62 Persistent<ScriptPromiseResolver> m_resolver; |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 // FIXME: Consider using CallbackPromiseAdapter. | 65 // FIXME: Consider using CallbackPromiseAdapter. |
| 66 class CacheWithResponsesCallbacks | 66 class CacheWithResponsesCallbacks |
| 67 : public WebServiceWorkerCache::CacheWithResponsesCallbacks { | 67 : public WebServiceWorkerCache::CacheWithResponsesCallbacks { |
| 68 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks); | 68 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks); |
| 69 | 69 |
| 70 public: | 70 public: |
| 71 explicit CacheWithResponsesCallbacks(ScriptPromiseResolver* resolver) | 71 explicit CacheWithResponsesCallbacks(ScriptPromiseResolver* resolver) |
| 72 : m_resolver(resolver) {} | 72 : m_resolver(resolver) {} |
| 73 | 73 |
| 74 void onSuccess( | 74 void onSuccess( |
| 75 const WebVector<WebServiceWorkerResponse>& webResponses) override { | 75 const WebVector<WebServiceWorkerResponse>& webResponses) override { |
| 76 if (!m_resolver->getExecutionContext() || | 76 if (!m_resolver->getExecutionContext() || |
| 77 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 77 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 78 return; | 78 return; |
| 79 ScriptState::Scope scope(m_resolver->getScriptState()); | 79 ScriptState::Scope scope(m_resolver->getScriptState()); |
| 80 HeapVector<Member<Response>> responses; | 80 HeapVector<Member<Response>> responses; |
| 81 for (size_t i = 0; i < webResponses.size(); ++i) | 81 for (size_t i = 0; i < webResponses.size(); ++i) |
| 82 responses.append( | 82 responses.append( |
| 83 Response::create(m_resolver->getScriptState(), webResponses[i])); | 83 Response::create(m_resolver->getScriptState(), webResponses[i])); |
| 84 m_resolver->resolve(responses); | 84 m_resolver->resolve(responses); |
| 85 m_resolver.clear(); | 85 m_resolver.clear(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void onError(WebServiceWorkerCacheError reason) override { | 88 void onError(WebServiceWorkerCacheError reason) override { |
| 89 if (!m_resolver->getExecutionContext() || | 89 if (!m_resolver->getExecutionContext() || |
| 90 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 90 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 91 return; | 91 return; |
| 92 m_resolver->reject(CacheStorageError::createException(reason)); | 92 m_resolver->reject(CacheStorageError::createException(reason)); |
| 93 m_resolver.clear(); | 93 m_resolver.clear(); |
| 94 } | 94 } |
| 95 | 95 |
| 96 protected: | 96 protected: |
| 97 Persistent<ScriptPromiseResolver> m_resolver; | 97 Persistent<ScriptPromiseResolver> m_resolver; |
| 98 }; | 98 }; |
| 99 | 99 |
| 100 // FIXME: Consider using CallbackPromiseAdapter. | 100 // FIXME: Consider using CallbackPromiseAdapter. |
| 101 class CacheDeleteCallback : public WebServiceWorkerCache::CacheBatchCallbacks { | 101 class CacheDeleteCallback : public WebServiceWorkerCache::CacheBatchCallbacks { |
| 102 WTF_MAKE_NONCOPYABLE(CacheDeleteCallback); | 102 WTF_MAKE_NONCOPYABLE(CacheDeleteCallback); |
| 103 | 103 |
| 104 public: | 104 public: |
| 105 explicit CacheDeleteCallback(ScriptPromiseResolver* resolver) | 105 explicit CacheDeleteCallback(ScriptPromiseResolver* resolver) |
| 106 : m_resolver(resolver) {} | 106 : m_resolver(resolver) {} |
| 107 | 107 |
| 108 void onSuccess() override { | 108 void onSuccess() override { |
| 109 if (!m_resolver->getExecutionContext() || | 109 if (!m_resolver->getExecutionContext() || |
| 110 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 110 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 111 return; | 111 return; |
| 112 m_resolver->resolve(true); | 112 m_resolver->resolve(true); |
| 113 m_resolver.clear(); | 113 m_resolver.clear(); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void onError(WebServiceWorkerCacheError reason) override { | 116 void onError(WebServiceWorkerCacheError reason) override { |
| 117 if (!m_resolver->getExecutionContext() || | 117 if (!m_resolver->getExecutionContext() || |
| 118 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 118 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 119 return; | 119 return; |
| 120 if (reason == WebServiceWorkerCacheErrorNotFound) | 120 if (reason == WebServiceWorkerCacheErrorNotFound) |
| 121 m_resolver->resolve(false); | 121 m_resolver->resolve(false); |
| 122 else | 122 else |
| 123 m_resolver->reject(CacheStorageError::createException(reason)); | 123 m_resolver->reject(CacheStorageError::createException(reason)); |
| 124 m_resolver.clear(); | 124 m_resolver.clear(); |
| 125 } | 125 } |
| 126 | 126 |
| 127 private: | 127 private: |
| 128 Persistent<ScriptPromiseResolver> m_resolver; | 128 Persistent<ScriptPromiseResolver> m_resolver; |
| 129 }; | 129 }; |
| 130 | 130 |
| 131 // FIXME: Consider using CallbackPromiseAdapter. | 131 // FIXME: Consider using CallbackPromiseAdapter. |
| 132 class CacheWithRequestsCallbacks | 132 class CacheWithRequestsCallbacks |
| 133 : public WebServiceWorkerCache::CacheWithRequestsCallbacks { | 133 : public WebServiceWorkerCache::CacheWithRequestsCallbacks { |
| 134 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks); | 134 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks); |
| 135 | 135 |
| 136 public: | 136 public: |
| 137 explicit CacheWithRequestsCallbacks(ScriptPromiseResolver* resolver) | 137 explicit CacheWithRequestsCallbacks(ScriptPromiseResolver* resolver) |
| 138 : m_resolver(resolver) {} | 138 : m_resolver(resolver) {} |
| 139 | 139 |
| 140 void onSuccess( | 140 void onSuccess( |
| 141 const WebVector<WebServiceWorkerRequest>& webRequests) override { | 141 const WebVector<WebServiceWorkerRequest>& webRequests) override { |
| 142 if (!m_resolver->getExecutionContext() || | 142 if (!m_resolver->getExecutionContext() || |
| 143 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 143 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 144 return; | 144 return; |
| 145 ScriptState::Scope scope(m_resolver->getScriptState()); | 145 ScriptState::Scope scope(m_resolver->getScriptState()); |
| 146 HeapVector<Member<Request>> requests; | 146 HeapVector<Member<Request>> requests; |
| 147 for (size_t i = 0; i < webRequests.size(); ++i) | 147 for (size_t i = 0; i < webRequests.size(); ++i) |
| 148 requests.append( | 148 requests.append( |
| 149 Request::create(m_resolver->getScriptState(), webRequests[i])); | 149 Request::create(m_resolver->getScriptState(), webRequests[i])); |
| 150 m_resolver->resolve(requests); | 150 m_resolver->resolve(requests); |
| 151 m_resolver.clear(); | 151 m_resolver.clear(); |
| 152 } | 152 } |
| 153 | 153 |
| 154 void onError(WebServiceWorkerCacheError reason) override { | 154 void onError(WebServiceWorkerCacheError reason) override { |
| 155 if (!m_resolver->getExecutionContext() || | 155 if (!m_resolver->getExecutionContext() || |
| 156 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 156 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 157 return; | 157 return; |
| 158 m_resolver->reject(CacheStorageError::createException(reason)); | 158 m_resolver->reject(CacheStorageError::createException(reason)); |
| 159 m_resolver.clear(); | 159 m_resolver.clear(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 private: | 162 private: |
| 163 Persistent<ScriptPromiseResolver> m_resolver; | 163 Persistent<ScriptPromiseResolver> m_resolver; |
| 164 }; | 164 }; |
| 165 | 165 |
| 166 // Used for UMA. Append only. | 166 // Used for UMA. Append only. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 ASSERT(0 < m_numberOfRemainingOperations); | 293 ASSERT(0 < m_numberOfRemainingOperations); |
| 294 m_batchOperations.resize(numberOfOperations); | 294 m_batchOperations.resize(numberOfOperations); |
| 295 } | 295 } |
| 296 | 296 |
| 297 void onSuccess(size_t index, | 297 void onSuccess(size_t index, |
| 298 const WebServiceWorkerCache::BatchOperation& batchOperation) { | 298 const WebServiceWorkerCache::BatchOperation& batchOperation) { |
| 299 ASSERT(index < m_batchOperations.size()); | 299 ASSERT(index < m_batchOperations.size()); |
| 300 if (m_completed) | 300 if (m_completed) |
| 301 return; | 301 return; |
| 302 if (!m_resolver->getExecutionContext() || | 302 if (!m_resolver->getExecutionContext() || |
| 303 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 303 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 304 return; | 304 return; |
| 305 m_batchOperations[index] = batchOperation; | 305 m_batchOperations[index] = batchOperation; |
| 306 if (--m_numberOfRemainingOperations != 0) | 306 if (--m_numberOfRemainingOperations != 0) |
| 307 return; | 307 return; |
| 308 m_cache->webCache()->dispatchBatch( | 308 m_cache->webCache()->dispatchBatch( |
| 309 WTF::makeUnique<CallbackPromiseAdapter<void, CacheStorageError>>( | 309 WTF::makeUnique<CallbackPromiseAdapter<void, CacheStorageError>>( |
| 310 m_resolver), | 310 m_resolver), |
| 311 m_batchOperations); | 311 m_batchOperations); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void onError(const String& errorMessage) { | 314 void onError(const String& errorMessage) { |
| 315 if (m_completed) | 315 if (m_completed) |
| 316 return; | 316 return; |
| 317 m_completed = true; | 317 m_completed = true; |
| 318 if (!m_resolver->getExecutionContext() || | 318 if (!m_resolver->getExecutionContext() || |
| 319 m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) | 319 m_resolver->getExecutionContext()->isContextDestroyed()) |
| 320 return; | 320 return; |
| 321 ScriptState* state = m_resolver->getScriptState(); | 321 ScriptState* state = m_resolver->getScriptState(); |
| 322 ScriptState::Scope scope(state); | 322 ScriptState::Scope scope(state); |
| 323 m_resolver->reject( | 323 m_resolver->reject( |
| 324 V8ThrowException::createTypeError(state->isolate(), errorMessage)); | 324 V8ThrowException::createTypeError(state->isolate(), errorMessage)); |
| 325 } | 325 } |
| 326 | 326 |
| 327 DEFINE_INLINE_VIRTUAL_TRACE() { | 327 DEFINE_INLINE_VIRTUAL_TRACE() { |
| 328 visitor->trace(m_cache); | 328 visitor->trace(m_cache); |
| 329 visitor->trace(m_resolver); | 329 visitor->trace(m_resolver); |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 WTF::makeUnique<CacheWithRequestsCallbacks>(resolver), webRequest, | 699 WTF::makeUnique<CacheWithRequestsCallbacks>(resolver), webRequest, |
| 700 toWebQueryParams(options)); | 700 toWebQueryParams(options)); |
| 701 return promise; | 701 return promise; |
| 702 } | 702 } |
| 703 | 703 |
| 704 WebServiceWorkerCache* Cache::webCache() const { | 704 WebServiceWorkerCache* Cache::webCache() const { |
| 705 return m_webCache.get(); | 705 return m_webCache.get(); |
| 706 } | 706 } |
| 707 | 707 |
| 708 } // namespace blink | 708 } // namespace blink |
| OLD | NEW |