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/serviceworkers/Cache.h" | 6 #include "modules/serviceworkers/Cache.h" |
7 | 7 |
8 #include "bindings/core/v8/Dictionary.h" | |
8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
9 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
11 #include "bindings/core/v8/V8ThrowException.h" | |
12 #include "core/dom/DOMException.h" | |
13 #include "modules/serviceworkers/Request.h" | |
14 #include "modules/serviceworkers/Response.h" | |
15 #include "public/platform/WebServiceWorkerCache.h" | |
10 | 16 |
11 namespace blink { | 17 namespace blink { |
12 | 18 |
13 namespace { | 19 namespace { |
14 | 20 |
21 WebServiceWorkerCache::QueryParams queryParamsFromDictionary(const Dictionary& d ictionary) | |
22 { | |
23 WebServiceWorkerCache::QueryParams queryParams; | |
24 DictionaryHelper::get(dictionary, "ignoreSearch", queryParams.ignoreSearch); | |
25 DictionaryHelper::get(dictionary, "ignoreMethod", queryParams.ignoreMethod); | |
26 DictionaryHelper::get(dictionary, "ignoreVary", queryParams.ignoreVary); | |
27 DictionaryHelper::get(dictionary, "prefixMatch", queryParams.prefixMatch); | |
28 { | |
29 String cacheName; | |
30 DictionaryHelper::get(dictionary, "cacheName", cacheName); | |
31 queryParams.cacheName = cacheName; | |
32 } | |
33 return queryParams; | |
34 } | |
35 | |
36 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { | |
37 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); | |
38 public: | |
39 CacheMatchCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver (resolver) { } | |
jsbell
2014/09/03 19:15:00
style: break before :
per http://www.chromium.org
gavinp
2014/09/04 19:47:33
Done.
But isn't the rule you mean to quote http:/
| |
40 | |
41 virtual void onSuccess(WebServiceWorkerResponse* webResponse) OVERRIDE | |
42 { | |
43 m_resolver->resolve(Response::create(*webResponse)); | |
44 m_resolver.clear(); | |
45 } | |
46 | |
47 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE | |
48 { | |
49 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); | |
50 m_resolver.clear(); | |
51 } | |
52 | |
53 private: | |
54 RefPtr<ScriptPromiseResolver> m_resolver; | |
55 }; | |
56 | |
57 class CacheWithResponsesCallbacks : public WebServiceWorkerCache::CacheWithRespo nsesCallbacks { | |
58 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks); | |
59 public: | |
60 CacheWithResponsesCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_ resolver(resolver) { } | |
jsbell
2014/09/03 19:15:00
style: break before :
gavinp
2014/09/04 19:47:33
Done.
| |
61 | |
62 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) OV ERRIDE | |
63 { | |
64 Vector<RefPtrWillBeRawPtr<Response> > responses; | |
65 for (size_t i = 0; i < webResponses->size(); ++i) | |
66 responses.append(Response::create((*webResponses)[i])); | |
67 m_resolver->resolve(responses); | |
68 m_resolver.clear(); | |
69 } | |
70 | |
71 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE | |
72 { | |
73 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); | |
74 m_resolver.clear(); | |
75 } | |
76 | |
77 private: | |
78 RefPtr<ScriptPromiseResolver> m_resolver; | |
79 }; | |
80 | |
81 class CacheWithRequestsCallbacks : public WebServiceWorkerCache::CacheWithReques tsCallbacks { | |
82 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks); | |
83 public: | |
84 CacheWithRequestsCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_r esolver(resolver) { } | |
jsbell
2014/09/03 19:15:01
style: break before :
gavinp
2014/09/04 19:47:33
Done.
| |
85 | |
86 virtual void onSuccess(WebVector<WebServiceWorkerRequest>* webRequests) OVER RIDE | |
87 { | |
88 Vector<RefPtrWillBeRawPtr<Request> > requests; | |
89 for (size_t i = 0; i < webRequests->size(); ++i) | |
90 requests.append(Request::create((*webRequests)[i])); | |
91 m_resolver->resolve(requests); | |
92 m_resolver.clear(); | |
93 } | |
94 | |
95 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE | |
96 { | |
97 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); | |
98 m_resolver.clear(); | |
99 } | |
100 | |
101 private: | |
102 RefPtr<ScriptPromiseResolver> m_resolver; | |
103 }; | |
104 | |
105 ScriptPromise rejectForCacheError(ScriptState* scriptState, WebServiceWorkerCach eError error) | |
106 { | |
107 return ScriptPromise::rejectWithDOMException(scriptState, Cache::domExceptio nForCacheError(error)); | |
108 } | |
109 | |
15 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) | 110 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) |
16 { | 111 { |
112 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::crea te(NotSupportedError, "Cache is not implemented")); | |
113 } | |
114 | |
115 } // namespace | |
116 | |
117 PassRefPtrWillBeRawPtr<Cache> Cache::fromWebServiceWorkerCache(WebServiceWorkerC ache* webCache) | |
118 { | |
119 if (Cache* cache = static_cast<Cache*>(webCache->proxyInterface())) | |
120 return cache; | |
121 return create(webCache); | |
122 } | |
123 | |
124 ScriptPromise Cache::match(ScriptState* scriptState, Request* originalRequest, c onst Dictionary& queryParamsDict) | |
125 { | |
126 TrackExceptionState exceptionState; | |
127 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState); | |
128 if (exceptionState.hadException()) | |
129 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
130 return matchImpl(scriptState, request, queryParamsDict); | |
131 } | |
132 | |
133 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParamsDict) | |
134 { | |
135 TrackExceptionState exceptionState; | |
136 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState); | |
137 if (exceptionState.hadException()) | |
138 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
139 return matchImpl(scriptState, request, queryParamsDict); | |
140 } | |
141 | |
142 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* originalRequest , const Dictionary& queryParamsDict) | |
143 { | |
144 TrackExceptionState exceptionState; | |
145 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState); | |
146 if (exceptionState.hadException()) | |
147 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
148 return matchAllImpl(scriptState, request, queryParamsDict); | |
149 } | |
150 | |
151 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr ing, const Dictionary& queryParamsDict) | |
152 { | |
153 TrackExceptionState exceptionState; | |
154 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState); | |
155 if (exceptionState.hadException()) | |
156 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
157 return matchAllImpl(scriptState, request, queryParamsDict); | |
158 } | |
159 | |
160 ScriptPromise Cache::add(ScriptState* scriptState, Request* originalRequest) | |
161 { | |
162 TrackExceptionState exceptionState; | |
163 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState); | |
164 if (exceptionState.hadException()) | |
165 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
166 return addImpl(scriptState, request); | |
167 } | |
168 | |
169 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString) | |
170 { | |
171 TrackExceptionState exceptionState; | |
172 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState); | |
173 if (exceptionState.hadException()) | |
174 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
175 return addImpl(scriptState, request); | |
176 } | |
177 | |
178 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>& rawRequests) | |
179 { | |
180 // FIXME: Implement this. | |
181 return rejectAsNotImplemented(scriptState); | |
182 } | |
183 | |
184 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* originalR equest, const Dictionary& queryParamsDict) | |
185 { | |
186 TrackExceptionState exceptionState; | |
187 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState); | |
188 if (exceptionState.hadException()) | |
189 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
190 return deleteImpl(scriptState, request, queryParamsDict); | |
191 } | |
192 | |
193 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ estString, const Dictionary& queryParamsDict) | |
194 { | |
195 TrackExceptionState exceptionState; | |
196 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState); | |
197 if (exceptionState.hadException()) | |
198 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
199 return deleteImpl(scriptState, request, queryParamsDict); | |
200 } | |
201 | |
202 ScriptPromise Cache::put(ScriptState* scriptState, Request* originalRequest, Res ponse* response) | |
203 { | |
204 TrackExceptionState exceptionState; | |
205 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState); | |
206 if (exceptionState.hadException()) | |
207 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
208 return putImpl(scriptState, request, response); | |
209 } | |
210 | |
211 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString, Response* response) | |
212 { | |
213 TrackExceptionState exceptionState; | |
214 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState); | |
215 if (exceptionState.hadException()) | |
216 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
217 return putImpl(scriptState, request, response); | |
218 } | |
219 | |
220 ScriptPromise Cache::keys(ScriptState* scriptState) | |
221 { | |
222 return keysImpl(scriptState); | |
223 } | |
224 | |
225 ScriptPromise Cache::keys(ScriptState* scriptState, Request* originalRequest, co nst Dictionary& queryParamsDict) | |
226 { | |
227 TrackExceptionState exceptionState; | |
228 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState); | |
229 if (exceptionState.hadException()) | |
230 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
231 return keysImpl(scriptState); | |
232 } | |
233 | |
234 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString, const Dictionary& queryParamsDict) | |
235 { | |
236 TrackExceptionState exceptionState; | |
237 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState); | |
238 if (exceptionState.hadException()) | |
239 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd); | |
240 return keysImpl(scriptState, request, queryParamsDict); | |
241 } | |
242 | |
243 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(adoptPtr(webCache)) | |
jsbell
2014/09/03 19:15:00
style: break before :
gavinp
2014/09/04 19:47:33
Done.
gavinp
2014/09/04 19:47:33
Done.
| |
244 { | |
245 ScriptWrappable::init(this); | |
246 ASSERT(m_webCache->proxyInterface() == 0); | |
jsbell
2014/09/03 19:15:00
nit: seems more common to ASSERT(!x)
gavinp
2014/09/04 19:47:33
Done.
| |
247 m_webCache->setProxyInterface(this); | |
248 } | |
249 | |
250 PassRefPtrWillBeRawPtr<Cache> Cache::create(WebServiceWorkerCache* webCache) | |
251 { | |
252 return adoptRefWillBeNoop(new Cache(webCache)); | |
253 } | |
254 | |
255 ScriptPromise Cache::matchImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr< Request> request, const Dictionary& queryParamsDict) | |
256 { | |
257 WebServiceWorkerRequest webRequest; | |
258 request->populateWebServiceWorkerRequest(webRequest); | |
259 | |
17 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); | 260 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); |
18 const ScriptPromise promise = resolver->promise(); | 261 const ScriptPromise promise = resolver->promise(); |
19 resolver->reject(DOMException::create(NotSupportedError, "Cache is not imple mented")); | 262 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, que ryParamsFromDictionary(queryParamsDict)); |
20 return promise; | 263 return promise; |
21 } | 264 } |
22 | 265 |
23 } | 266 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, PassRefPtrWillBeRawP tr<Request> request, const Dictionary& queryParamsDict) |
24 | 267 { |
25 PassRefPtrWillBeRawPtr<Cache> Cache::fromWebServiceWorkerCache(WebServiceWorkerC ache* webCache) | 268 WebServiceWorkerRequest webRequest; |
26 { | 269 request->populateWebServiceWorkerRequest(webRequest); |
27 return adoptRefWillBeNoop(new Cache(webCache)); | 270 |
28 } | 271 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); |
29 | 272 const ScriptPromise promise = resolver->promise(); |
30 // FIXME: Implement these methods. | 273 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR equest, queryParamsFromDictionary(queryParamsDict)); |
31 ScriptPromise Cache::match(ScriptState* scriptState, Request* request, const Dic tionary& queryParams) | 274 return promise; |
32 { | 275 } |
276 | |
277 ScriptPromise Cache::addImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<Re quest>) | |
278 { | |
279 // FIXME: Implement this. | |
33 return rejectAsNotImplemented(scriptState); | 280 return rejectAsNotImplemented(scriptState); |
34 } | 281 } |
35 | 282 |
36 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParams) | 283 ScriptPromise Cache::addAllImpl(ScriptState* scriptState, Vector<RefPtrWillBeRaw Ptr<Request> >) |
37 { | 284 { |
285 // FIXME: Implement this. | |
38 return rejectAsNotImplemented(scriptState); | 286 return rejectAsNotImplemented(scriptState); |
39 } | 287 } |
40 | 288 |
41 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* request, const Dictionary& queryParams) | |
42 { | |
43 return rejectAsNotImplemented(scriptState); | |
44 } | |
45 | |
46 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr ing, const Dictionary& queryParams) | |
47 { | |
48 return rejectAsNotImplemented(scriptState); | |
49 } | |
50 | |
51 ScriptPromise Cache::add(ScriptState* scriptState, Request* request) | |
52 { | |
53 return rejectAsNotImplemented(scriptState); | |
54 } | |
55 | |
56 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString) | |
57 { | |
58 return rejectAsNotImplemented(scriptState); | |
59 } | |
60 | |
61 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>& rawRequests) | |
62 { | |
63 return rejectAsNotImplemented(scriptState); | |
64 } | |
65 | |
66 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* request, const Dictionary& queryParams) | |
67 { | |
68 return rejectAsNotImplemented(scriptState); | |
69 } | |
70 | |
71 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ estString, const Dictionary& queryParams) | |
72 { | |
73 return rejectAsNotImplemented(scriptState); | |
74 } | |
75 | |
76 ScriptPromise Cache::put(ScriptState* scriptState, Request* request, Response*) | |
77 { | |
78 return rejectAsNotImplemented(scriptState); | |
79 } | |
80 | |
81 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString, Response*) | |
82 { | |
83 return rejectAsNotImplemented(scriptState); | |
84 } | |
85 | |
86 ScriptPromise Cache::keys(ScriptState* scriptState) | |
87 { | |
88 return rejectAsNotImplemented(scriptState); | |
89 } | |
90 | |
91 ScriptPromise Cache::keys(ScriptState* scriptState, Request* request, const Dict ionary& queryParams) | |
92 { | |
93 return rejectAsNotImplemented(scriptState); | |
94 } | |
95 | |
96 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString, const Dictionary& queryParams) | |
97 { | |
98 return rejectAsNotImplemented(scriptState); | |
99 } | |
100 | |
101 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService WorkerCacheError reason) | 289 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService WorkerCacheError reason) |
102 { | 290 { |
103 switch (reason) { | 291 switch (reason) { |
104 case WebServiceWorkerCacheErrorNotImplemented: | 292 case WebServiceWorkerCacheErrorNotImplemented: |
105 return DOMException::create(NotSupportedError, "Method is not implemente d."); | 293 return DOMException::create(NotSupportedError, "Method is not implemente d."); |
106 case WebServiceWorkerCacheErrorNotFound: | 294 case WebServiceWorkerCacheErrorNotFound: |
107 return DOMException::create(NotFoundError, "Entry was not found."); | 295 return DOMException::create(NotFoundError, "Entry was not found."); |
108 case WebServiceWorkerCacheErrorExists: | 296 case WebServiceWorkerCacheErrorExists: |
109 return DOMException::create(InvalidAccessError, "Entry already exists.") ; | 297 return DOMException::create(InvalidAccessError, "Entry already exists.") ; |
110 default: | 298 default: |
111 ASSERT_NOT_REACHED(); | 299 ASSERT_NOT_REACHED(); |
112 return DOMException::create(NotSupportedError, "Unknown error."); | 300 return DOMException::create(NotSupportedError, "Unknown error."); |
113 } | 301 } |
114 } | 302 } |
115 | 303 |
116 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(webCache) | 304 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr <Request> request, const Dictionary& queryParamsDict) |
117 { | 305 { |
118 ScriptWrappable::init(this); | 306 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); |
307 batchOperations[0].operationType = WebServiceWorkerCache::WebServiceWorkerCa cheOperationTypeDelete; | |
308 request->populateWebServiceWorkerRequest(batchOperations[0].request); | |
309 batchOperations[0].matchParams = queryParamsFromDictionary(queryParamsDict); | |
310 | |
311 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); | |
312 const ScriptPromise promise = resolver->promise(); | |
313 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations); | |
314 return promise; | |
315 } | |
316 | |
317 ScriptPromise Cache::putImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<Re quest> request, Response* response) | |
318 { | |
319 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); | |
320 batchOperations[0].operationType = WebServiceWorkerCache::WebServiceWorkerCa cheOperationTypePut; | |
321 request->populateWebServiceWorkerRequest(batchOperations[0].request); | |
322 response->populateWebServiceWorkerResponse(batchOperations[0].response); | |
323 | |
324 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); | |
325 const ScriptPromise promise = resolver->promise(); | |
326 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations); | |
327 return promise; | |
328 } | |
329 | |
330 ScriptPromise Cache::keysImpl(ScriptState* scriptState) | |
331 { | |
332 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); | |
333 const ScriptPromise promise = resolver->promise(); | |
334 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams()); | |
335 return promise; | |
336 } | |
337 | |
338 ScriptPromise Cache::keysImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<R equest> request, const Dictionary& queryParamsDict) | |
339 { | |
340 WebServiceWorkerRequest webRequest; | |
341 request->populateWebServiceWorkerRequest(webRequest); | |
342 | |
343 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); | |
344 const ScriptPromise promise = resolver->promise(); | |
345 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, queryP aramsFromDictionary(queryParamsDict)); | |
346 return promise; | |
119 } | 347 } |
120 | 348 |
121 } // namespace blink | 349 } // namespace blink |
OLD | NEW |