| 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/CacheStorage.h" | 5 #include "modules/cachestorage/CacheStorage.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ScriptPromiseResolver.h" | 7 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 8 #include "bindings/core/v8/ScriptState.h" | 8 #include "bindings/core/v8/ScriptState.h" |
| 9 #include "core/dom/DOMException.h" | 9 #include "core/dom/DOMException.h" |
| 10 #include "core/dom/ExceptionCode.h" | 10 #include "core/dom/ExceptionCode.h" |
| 11 #include "core/inspector/ConsoleMessage.h" | 11 #include "core/inspector/ConsoleMessage.h" |
| 12 #include "modules/cachestorage/CacheStorageError.h" | 12 #include "modules/cachestorage/CacheStorageError.h" |
| 13 #include "modules/fetch/Request.h" | 13 #include "modules/fetch/Request.h" |
| 14 #include "modules/fetch/Response.h" | 14 #include "modules/fetch/Response.h" |
| 15 #include "platform/RuntimeEnabledFeatures.h" | 15 #include "platform/RuntimeEnabledFeatures.h" |
| 16 #include "public/platform/modules/serviceworker/WebServiceWorkerCacheError.h" | 16 #include "public/platform/modules/serviceworker/WebServiceWorkerCacheError.h" |
| 17 #include "public/platform/modules/serviceworker/WebServiceWorkerCacheStorage.h" | 17 #include "public/platform/modules/serviceworker/WebServiceWorkerCacheStorage.h" |
| 18 | 18 |
| 19 namespace blink { | 19 namespace blink { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 DOMException* createNoImplementationException() | 23 DOMException* createNoImplementationException() |
| 24 { | 24 { |
| 25 return DOMException::create(NotSupportedError, "No CacheStorage implementati
on provided."); | 25 return DOMException::create(NotSupportedError, "No CacheStorage implementati
on provided."); |
| 26 } | 26 } |
| 27 | 27 |
| 28 bool commonChecks(ScriptState* scriptState, ExceptionState& exceptionState) | 28 bool commonChecks(ScriptState* scriptState, ExceptionState& exceptionState) |
| 29 { | 29 { |
| 30 ExecutionContext* executionContext = scriptState->executionContext(); | 30 ExecutionContext* executionContext = scriptState->getExecutionContext(); |
| 31 // FIXME: May be null due to worker termination: http://crbug.com/413518. | 31 // FIXME: May be null due to worker termination: http://crbug.com/413518. |
| 32 if (!executionContext) | 32 if (!executionContext) |
| 33 return false; | 33 return false; |
| 34 | 34 |
| 35 String errorMessage; | 35 String errorMessage; |
| 36 if (!executionContext->isSecureContext(errorMessage)) { | 36 if (!executionContext->isSecureContext(errorMessage)) { |
| 37 exceptionState.throwSecurityError(errorMessage); | 37 exceptionState.throwSecurityError(errorMessage); |
| 38 return false; | 38 return false; |
| 39 } | 39 } |
| 40 return true; | 40 return true; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 55 // FIXME: Consider using CallbackPromiseAdapter. | 55 // FIXME: Consider using CallbackPromiseAdapter. |
| 56 class CacheStorage::Callbacks final : public WebServiceWorkerCacheStorage::Cache
StorageCallbacks { | 56 class CacheStorage::Callbacks final : public WebServiceWorkerCacheStorage::Cache
StorageCallbacks { |
| 57 WTF_MAKE_NONCOPYABLE(Callbacks); | 57 WTF_MAKE_NONCOPYABLE(Callbacks); |
| 58 public: | 58 public: |
| 59 explicit Callbacks(ScriptPromiseResolver* resolver) | 59 explicit Callbacks(ScriptPromiseResolver* resolver) |
| 60 : m_resolver(resolver) { } | 60 : m_resolver(resolver) { } |
| 61 ~Callbacks() override { } | 61 ~Callbacks() override { } |
| 62 | 62 |
| 63 void onSuccess() override | 63 void onSuccess() override |
| 64 { | 64 { |
| 65 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 65 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 66 return; | 66 return; |
| 67 m_resolver->resolve(true); | 67 m_resolver->resolve(true); |
| 68 m_resolver.clear(); | 68 m_resolver.clear(); |
| 69 } | 69 } |
| 70 | 70 |
| 71 void onError(WebServiceWorkerCacheError reason) override | 71 void onError(WebServiceWorkerCacheError reason) override |
| 72 { | 72 { |
| 73 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 73 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 74 return; | 74 return; |
| 75 if (reason == WebServiceWorkerCacheErrorNotFound) | 75 if (reason == WebServiceWorkerCacheErrorNotFound) |
| 76 m_resolver->resolve(false); | 76 m_resolver->resolve(false); |
| 77 else | 77 else |
| 78 m_resolver->reject(CacheStorageError::createException(reason)); | 78 m_resolver->reject(CacheStorageError::createException(reason)); |
| 79 m_resolver.clear(); | 79 m_resolver.clear(); |
| 80 } | 80 } |
| 81 | 81 |
| 82 private: | 82 private: |
| 83 Persistent<ScriptPromiseResolver> m_resolver; | 83 Persistent<ScriptPromiseResolver> m_resolver; |
| 84 }; | 84 }; |
| 85 | 85 |
| 86 // FIXME: Consider using CallbackPromiseAdapter. | 86 // FIXME: Consider using CallbackPromiseAdapter. |
| 87 class CacheStorage::WithCacheCallbacks final : public WebServiceWorkerCacheStora
ge::CacheStorageWithCacheCallbacks { | 87 class CacheStorage::WithCacheCallbacks final : public WebServiceWorkerCacheStora
ge::CacheStorageWithCacheCallbacks { |
| 88 WTF_MAKE_NONCOPYABLE(WithCacheCallbacks); | 88 WTF_MAKE_NONCOPYABLE(WithCacheCallbacks); |
| 89 public: | 89 public: |
| 90 WithCacheCallbacks(const String& cacheName, CacheStorage* cacheStorage, Scri
ptPromiseResolver* resolver) | 90 WithCacheCallbacks(const String& cacheName, CacheStorage* cacheStorage, Scri
ptPromiseResolver* resolver) |
| 91 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol
ver) { } | 91 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol
ver) { } |
| 92 ~WithCacheCallbacks() override { } | 92 ~WithCacheCallbacks() override { } |
| 93 | 93 |
| 94 void onSuccess(WebPassOwnPtr<WebServiceWorkerCache> webCache) override | 94 void onSuccess(WebPassOwnPtr<WebServiceWorkerCache> webCache) override |
| 95 { | 95 { |
| 96 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 96 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 97 return; | 97 return; |
| 98 Cache* cache = Cache::create(m_cacheStorage->m_scopedFetcher, webCache.r
elease()); | 98 Cache* cache = Cache::create(m_cacheStorage->m_scopedFetcher, webCache.r
elease()); |
| 99 m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache); | 99 m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache); |
| 100 m_resolver->resolve(cache); | 100 m_resolver->resolve(cache); |
| 101 m_resolver.clear(); | 101 m_resolver.clear(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 void onError(WebServiceWorkerCacheError reason) override | 104 void onError(WebServiceWorkerCacheError reason) override |
| 105 { | 105 { |
| 106 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 106 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 107 return; | 107 return; |
| 108 if (reason == WebServiceWorkerCacheErrorNotFound) | 108 if (reason == WebServiceWorkerCacheErrorNotFound) |
| 109 m_resolver->resolve(); | 109 m_resolver->resolve(); |
| 110 else | 110 else |
| 111 m_resolver->reject(CacheStorageError::createException(reason)); | 111 m_resolver->reject(CacheStorageError::createException(reason)); |
| 112 m_resolver.clear(); | 112 m_resolver.clear(); |
| 113 } | 113 } |
| 114 | 114 |
| 115 private: | 115 private: |
| 116 String m_cacheName; | 116 String m_cacheName; |
| 117 Persistent<CacheStorage> m_cacheStorage; | 117 Persistent<CacheStorage> m_cacheStorage; |
| 118 Persistent<ScriptPromiseResolver> m_resolver; | 118 Persistent<ScriptPromiseResolver> m_resolver; |
| 119 }; | 119 }; |
| 120 | 120 |
| 121 // FIXME: Consider using CallbackPromiseAdapter. | 121 // FIXME: Consider using CallbackPromiseAdapter. |
| 122 class CacheStorage::MatchCallbacks : public WebServiceWorkerCacheStorage::CacheS
torageMatchCallbacks { | 122 class CacheStorage::MatchCallbacks : public WebServiceWorkerCacheStorage::CacheS
torageMatchCallbacks { |
| 123 WTF_MAKE_NONCOPYABLE(MatchCallbacks); | 123 WTF_MAKE_NONCOPYABLE(MatchCallbacks); |
| 124 public: | 124 public: |
| 125 explicit MatchCallbacks(ScriptPromiseResolver* resolver) | 125 explicit MatchCallbacks(ScriptPromiseResolver* resolver) |
| 126 : m_resolver(resolver) { } | 126 : m_resolver(resolver) { } |
| 127 | 127 |
| 128 void onSuccess(const WebServiceWorkerResponse& webResponse) override | 128 void onSuccess(const WebServiceWorkerResponse& webResponse) override |
| 129 { | 129 { |
| 130 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 130 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 131 return; | 131 return; |
| 132 m_resolver->resolve(Response::create(m_resolver->scriptState()->executio
nContext(), webResponse)); | 132 m_resolver->resolve(Response::create(m_resolver->getScriptState()->getEx
ecutionContext(), webResponse)); |
| 133 m_resolver.clear(); | 133 m_resolver.clear(); |
| 134 } | 134 } |
| 135 | 135 |
| 136 void onError(WebServiceWorkerCacheError reason) override | 136 void onError(WebServiceWorkerCacheError reason) override |
| 137 { | 137 { |
| 138 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 138 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 139 return; | 139 return; |
| 140 if (reason == WebServiceWorkerCacheErrorNotFound) | 140 if (reason == WebServiceWorkerCacheErrorNotFound) |
| 141 m_resolver->resolve(); | 141 m_resolver->resolve(); |
| 142 else | 142 else |
| 143 m_resolver->reject(CacheStorageError::createException(reason)); | 143 m_resolver->reject(CacheStorageError::createException(reason)); |
| 144 m_resolver.clear(); | 144 m_resolver.clear(); |
| 145 } | 145 } |
| 146 | 146 |
| 147 private: | 147 private: |
| 148 Persistent<ScriptPromiseResolver> m_resolver; | 148 Persistent<ScriptPromiseResolver> m_resolver; |
| 149 }; | 149 }; |
| 150 | 150 |
| 151 | 151 |
| 152 // FIXME: Consider using CallbackPromiseAdapter. | 152 // FIXME: Consider using CallbackPromiseAdapter. |
| 153 class CacheStorage::DeleteCallbacks final : public WebServiceWorkerCacheStorage:
:CacheStorageCallbacks { | 153 class CacheStorage::DeleteCallbacks final : public WebServiceWorkerCacheStorage:
:CacheStorageCallbacks { |
| 154 WTF_MAKE_NONCOPYABLE(DeleteCallbacks); | 154 WTF_MAKE_NONCOPYABLE(DeleteCallbacks); |
| 155 public: | 155 public: |
| 156 DeleteCallbacks(const String& cacheName, CacheStorage* cacheStorage, ScriptP
romiseResolver* resolver) | 156 DeleteCallbacks(const String& cacheName, CacheStorage* cacheStorage, ScriptP
romiseResolver* resolver) |
| 157 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol
ver) { } | 157 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol
ver) { } |
| 158 ~DeleteCallbacks() override { } | 158 ~DeleteCallbacks() override { } |
| 159 | 159 |
| 160 void onSuccess() override | 160 void onSuccess() override |
| 161 { | 161 { |
| 162 m_cacheStorage->m_nameToCacheMap.remove(m_cacheName); | 162 m_cacheStorage->m_nameToCacheMap.remove(m_cacheName); |
| 163 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 163 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 164 return; | 164 return; |
| 165 m_resolver->resolve(true); | 165 m_resolver->resolve(true); |
| 166 m_resolver.clear(); | 166 m_resolver.clear(); |
| 167 } | 167 } |
| 168 | 168 |
| 169 void onError(WebServiceWorkerCacheError reason) override | 169 void onError(WebServiceWorkerCacheError reason) override |
| 170 { | 170 { |
| 171 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 171 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 172 return; | 172 return; |
| 173 if (reason == WebServiceWorkerCacheErrorNotFound) | 173 if (reason == WebServiceWorkerCacheErrorNotFound) |
| 174 m_resolver->resolve(false); | 174 m_resolver->resolve(false); |
| 175 else | 175 else |
| 176 m_resolver->reject(CacheStorageError::createException(reason)); | 176 m_resolver->reject(CacheStorageError::createException(reason)); |
| 177 m_resolver.clear(); | 177 m_resolver.clear(); |
| 178 } | 178 } |
| 179 | 179 |
| 180 private: | 180 private: |
| 181 String m_cacheName; | 181 String m_cacheName; |
| 182 Persistent<CacheStorage> m_cacheStorage; | 182 Persistent<CacheStorage> m_cacheStorage; |
| 183 Persistent<ScriptPromiseResolver> m_resolver; | 183 Persistent<ScriptPromiseResolver> m_resolver; |
| 184 }; | 184 }; |
| 185 | 185 |
| 186 // FIXME: Consider using CallbackPromiseAdapter. | 186 // FIXME: Consider using CallbackPromiseAdapter. |
| 187 class CacheStorage::KeysCallbacks final : public WebServiceWorkerCacheStorage::C
acheStorageKeysCallbacks { | 187 class CacheStorage::KeysCallbacks final : public WebServiceWorkerCacheStorage::C
acheStorageKeysCallbacks { |
| 188 WTF_MAKE_NONCOPYABLE(KeysCallbacks); | 188 WTF_MAKE_NONCOPYABLE(KeysCallbacks); |
| 189 public: | 189 public: |
| 190 explicit KeysCallbacks(ScriptPromiseResolver* resolver) | 190 explicit KeysCallbacks(ScriptPromiseResolver* resolver) |
| 191 : m_resolver(resolver) { } | 191 : m_resolver(resolver) { } |
| 192 ~KeysCallbacks() override { } | 192 ~KeysCallbacks() override { } |
| 193 | 193 |
| 194 void onSuccess(const WebVector<WebString>& keys) override | 194 void onSuccess(const WebVector<WebString>& keys) override |
| 195 { | 195 { |
| 196 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 196 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 197 return; | 197 return; |
| 198 Vector<String> wtfKeys; | 198 Vector<String> wtfKeys; |
| 199 for (size_t i = 0; i < keys.size(); ++i) | 199 for (size_t i = 0; i < keys.size(); ++i) |
| 200 wtfKeys.append(keys[i]); | 200 wtfKeys.append(keys[i]); |
| 201 m_resolver->resolve(wtfKeys); | 201 m_resolver->resolve(wtfKeys); |
| 202 m_resolver.clear(); | 202 m_resolver.clear(); |
| 203 } | 203 } |
| 204 | 204 |
| 205 void onError(WebServiceWorkerCacheError reason) override | 205 void onError(WebServiceWorkerCacheError reason) override |
| 206 { | 206 { |
| 207 if (!m_resolver->executionContext() || m_resolver->executionContext()->a
ctiveDOMObjectsAreStopped()) | 207 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex
t()->activeDOMObjectsAreStopped()) |
| 208 return; | 208 return; |
| 209 m_resolver->reject(CacheStorageError::createException(reason)); | 209 m_resolver->reject(CacheStorageError::createException(reason)); |
| 210 m_resolver.clear(); | 210 m_resolver.clear(); |
| 211 } | 211 } |
| 212 | 212 |
| 213 private: | 213 private: |
| 214 Persistent<ScriptPromiseResolver> m_resolver; | 214 Persistent<ScriptPromiseResolver> m_resolver; |
| 215 }; | 215 }; |
| 216 | 216 |
| 217 CacheStorage* CacheStorage::create(WeakPtrWillBeRawPtr<GlobalFetch::ScopedFetche
r> fetcher, WebServiceWorkerCacheStorage* webCacheStorage) | 217 CacheStorage* CacheStorage::create(WeakPtrWillBeRawPtr<GlobalFetch::ScopedFetche
r> fetcher, WebServiceWorkerCacheStorage* webCacheStorage) |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 Request* newRequest = Request::create(scriptState, request.getAsUSVString(),
exceptionState); | 305 Request* newRequest = Request::create(scriptState, request.getAsUSVString(),
exceptionState); |
| 306 if (exceptionState.hadException()) | 306 if (exceptionState.hadException()) |
| 307 return ScriptPromise(); | 307 return ScriptPromise(); |
| 308 return matchImpl(scriptState, newRequest, options); | 308 return matchImpl(scriptState, newRequest, options); |
| 309 } | 309 } |
| 310 | 310 |
| 311 ScriptPromise CacheStorage::matchImpl(ScriptState* scriptState, const Request* r
equest, const CacheQueryOptions& options) | 311 ScriptPromise CacheStorage::matchImpl(ScriptState* scriptState, const Request* r
equest, const CacheQueryOptions& options) |
| 312 { | 312 { |
| 313 WebServiceWorkerRequest webRequest; | 313 WebServiceWorkerRequest webRequest; |
| 314 request->populateWebServiceWorkerRequest(webRequest); | 314 request->populateWebServiceWorkerRequest(webRequest); |
| 315 checkCacheQueryOptions(options, scriptState->executionContext()); | 315 checkCacheQueryOptions(options, scriptState->getExecutionContext()); |
| 316 | 316 |
| 317 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 317 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 318 const ScriptPromise promise = resolver->promise(); | 318 const ScriptPromise promise = resolver->promise(); |
| 319 | 319 |
| 320 if (m_webCacheStorage) | 320 if (m_webCacheStorage) |
| 321 m_webCacheStorage->dispatchMatch(new MatchCallbacks(resolver), webReques
t, Cache::toWebQueryParams(options)); | 321 m_webCacheStorage->dispatchMatch(new MatchCallbacks(resolver), webReques
t, Cache::toWebQueryParams(options)); |
| 322 else | 322 else |
| 323 resolver->reject(createNoImplementationException()); | 323 resolver->reject(createNoImplementationException()); |
| 324 | 324 |
| 325 return promise; | 325 return promise; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 340 m_webCacheStorage.clear(); | 340 m_webCacheStorage.clear(); |
| 341 } | 341 } |
| 342 | 342 |
| 343 DEFINE_TRACE(CacheStorage) | 343 DEFINE_TRACE(CacheStorage) |
| 344 { | 344 { |
| 345 visitor->trace(m_scopedFetcher); | 345 visitor->trace(m_scopedFetcher); |
| 346 visitor->trace(m_nameToCacheMap); | 346 visitor->trace(m_nameToCacheMap); |
| 347 } | 347 } |
| 348 | 348 |
| 349 } // namespace blink | 349 } // namespace blink |
| OLD | NEW |