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 |