Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: Source/modules/serviceworkers/Cache.cpp

Issue 433793002: Introducing the WebServiceWorkerCache. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase, some changes pulled out Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/modules/serviceworkers/Cache.h ('k') | Source/modules/serviceworkers/Cache.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 const char* cacheErrorToString(WebServiceWorkerCacheError reason)
22 {
23 // FIXME: Construct correct DOM error objects rather than returning strings.
24 switch (reason) {
25 case WebServiceWorkerCacheError::WebServiceWorkerCacheErrorNotImplemented:
26 return "not implemented";
27 case WebServiceWorkerCacheError::WebServiceWorkerCacheErrorNotFound:
28 return "not found";
29 case WebServiceWorkerCacheError::WebServiceWorkerCacheErrorExists:
30 return "entry already exists";
31 default:
32 ASSERT_NOT_REACHED();
33 return "unknown error";
34 }
35 }
36
37 WebServiceWorkerCache::QueryParams queryParamsFromDictionary(const Dictionary& d ictionary)
38 {
39 WebServiceWorkerCache::QueryParams queryParams;
40 DictionaryHelper::get(dictionary, "ignoreSearch", queryParams.ignoreSearch);
41 DictionaryHelper::get(dictionary, "ignoreMethod", queryParams.ignoreMethod);
42 DictionaryHelper::get(dictionary, "ignoreVary", queryParams.ignoreVary);
43 DictionaryHelper::get(dictionary, "prefixMatch", queryParams.prefixMatch);
44 // FIXME: Add cacheName.
45 return queryParams;
46 }
47
48 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks {
49 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks);
50 public:
51 CacheMatchCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver (resolver) { }
52
53 virtual void onSuccess(WebServiceWorkerResponse* webResponse) OVERRIDE
54 {
55 m_resolver->resolve(Response::create(*webResponse));
56 m_resolver.clear();
57 }
58
59 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
60 {
61 m_resolver->reject(cacheErrorToString(*reason));
62 m_resolver.clear();
63 }
64
65 private:
66 RefPtr<ScriptPromiseResolver> m_resolver;
67 };
68
69 class CacheWithResponsesCallbacks : public WebServiceWorkerCache::CacheWithRespo nsesCallbacks {
70 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks);
71 public:
72 CacheWithResponsesCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_ resolver(resolver) { }
73
74 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) OV ERRIDE
75 {
76 Vector<RefPtrWillBeRawPtr<Response> > responses;
77 for (size_t i = 0; i < webResponses->size(); ++i)
78 responses.append(Response::create((*webResponses)[i]));
79 m_resolver->resolve(responses);
80 m_resolver.clear();
81 }
82
83 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
84 {
85 m_resolver->reject(cacheErrorToString(*reason));
86 m_resolver.clear();
87 }
88
89 private:
90 RefPtr<ScriptPromiseResolver> m_resolver;
91 };
92
93 class CacheWithRequestsCallbacks : public WebServiceWorkerCache::CacheWithReques tsCallbacks {
94 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks);
95 public:
96 CacheWithRequestsCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_r esolver(resolver) { }
97
98 virtual void onSuccess(WebVector<WebServiceWorkerRequest>* webRequests) OVER RIDE
99 {
100 Vector<RefPtrWillBeRawPtr<Request> > requests;
101 for (size_t i = 0; i < webRequests->size(); ++i)
102 requests.append(Request::create((*webRequests)[i]));
103 m_resolver->resolve(requests);
104 m_resolver.clear();
105 }
106
107 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
108 {
109 m_resolver->reject(cacheErrorToString(*reason));
110 m_resolver.clear();
111 }
112
113 private:
114 RefPtr<ScriptPromiseResolver> m_resolver;
115 };
116
15 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) 117 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState)
16 { 118 {
17 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 119 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
18 const ScriptPromise promise = resolver->promise(); 120 const ScriptPromise promise = resolver->promise();
19 resolver->reject(DOMException::create(NotSupportedError, "Cache is not imple mented")); 121 resolver->reject(DOMException::create(NotSupportedError, "Cache is not imple mented"));
20 return promise; 122 return promise;
21 } 123 }
22 124
23 } 125 } // namespace
24 126
25 PassRefPtrWillBeRawPtr<Cache> Cache::fromWebServiceWorkerCache(WebServiceWorkerC ache* webCache) 127 PassRefPtrWillBeRawPtr<Cache> Cache::fromWebServiceWorkerCache(WebServiceWorkerC ache* webCache)
26 { 128 {
27 return adoptRefWillBeNoop(new Cache(webCache)); 129 if (Cache* cache = static_cast<Cache*>(webCache->proxyInterface()))
130 return cache;
131 return create(webCache);
28 } 132 }
29 133
30 // FIXME: Implement these methods. 134 Cache::~Cache()
31 ScriptPromise Cache::match(ScriptState* scriptState, Request* request, const Dic tionary& queryParams)
32 { 135 {
33 return rejectAsNotImplemented(scriptState);
34 } 136 }
35 137
36 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParams) 138 ScriptPromise Cache::match(ScriptState* scriptState, Request* originalRequest, c onst Dictionary& queryParamsDict)
37 { 139 {
38 return rejectAsNotImplemented(scriptState); 140 TrackExceptionState exceptionState;
141 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
142 if (exceptionState.hadException())
143 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
144 // return ScriptPromise::reject(DOMException::create(NotFoundError, " The specified Service Worker resource was not found."));
gavinp 2014/08/28 13:39:36 Sadly, this doesn't work because the type coercion
jsbell 2014/08/28 23:48:45 The bindings code automagically converts throws ex
145 return matchImpl(scriptState, request, queryParamsDict);
39 } 146 }
40 147
41 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* request, const Dictionary& queryParams) 148 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParamsDict)
42 { 149 {
43 return rejectAsNotImplemented(scriptState); 150 TrackExceptionState exceptionState;
151 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
152 if (exceptionState.hadException())
153 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
154 // return ScriptPromise::reject(DOMException::create(NotFoundError, " The specified Service Worker resource was not found."));
155 return matchImpl(scriptState, request, queryParamsDict);
44 } 156 }
45 157
46 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr ing, const Dictionary& queryParams) 158 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* originalRequest , const Dictionary& queryParamsDict)
47 { 159 {
48 return rejectAsNotImplemented(scriptState); 160 TrackExceptionState exceptionState;
161 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
162 if (exceptionState.hadException()) {
163 // FIXME: We should throw the caught error.
164 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
165 }
166 return matchAllImpl(scriptState, request, queryParamsDict);
49 } 167 }
50 168
51 ScriptPromise Cache::add(ScriptState* scriptState, Request* request) 169 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr ing, const Dictionary& queryParamsDict)
52 { 170 {
53 return rejectAsNotImplemented(scriptState); 171 TrackExceptionState exceptionState;
172 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
173 if (exceptionState.hadException()) {
174 // FIXME: We should throw the caught error.
175 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
176 }
177 return matchAllImpl(scriptState, request, queryParamsDict);
178 }
179
180 ScriptPromise Cache::add(ScriptState* scriptState, Request* originalRequest)
181 {
182 TrackExceptionState exceptionState;
183 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
184 if (exceptionState.hadException()) {
185 // FIXME: We should throw the caught error.
186 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
187 }
188 return addImpl(scriptState, request);
54 } 189 }
55 190
56 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString) 191 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString)
57 { 192 {
58 return rejectAsNotImplemented(scriptState); 193 TrackExceptionState exceptionState;
194 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
195 if (exceptionState.hadException()) {
196 // FIXME: We should throw the caught error.
197 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
198 }
199 return addImpl(scriptState, request);
59 } 200 }
60 201
61 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>& rawRequests) 202 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>& rawRequests)
62 { 203 {
63 return rejectAsNotImplemented(scriptState); 204 return rejectAsNotImplemented(scriptState);
64 } 205 }
65 206
66 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* request, const Dictionary& queryParams) 207 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* originalR equest, const Dictionary& queryParamsDict)
208 {
209 TrackExceptionState exceptionState;
210 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
211 if (exceptionState.hadException()) {
212 // FIXME: We should throw the caught error.
213 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
214 }
215 return deleteImpl(scriptState, request, queryParamsDict);
216 }
217
218 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ estString, const Dictionary& queryParamsDict)
219 {
220 TrackExceptionState exceptionState;
221 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
222 if (exceptionState.hadException()) {
223 // FIXME: We should throw the caught error.
224 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
225 }
226 return deleteImpl(scriptState, request, queryParamsDict);
227 }
228
229 ScriptPromise Cache::put(ScriptState* scriptState, Request* originalRequest, Res ponse* response)
230 {
231 TrackExceptionState exceptionState;
232 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
233 if (exceptionState.hadException()) {
234 // FIXME: We should throw the caught error.
235 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
236 }
237 return putImpl(scriptState, request, response);
238 }
239
240 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString, Response* response)
241 {
242 TrackExceptionState exceptionState;
243 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
244 if (exceptionState.hadException()) {
245 // FIXME: We should throw the caught error.
246 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
247 }
248 return putImpl(scriptState, request, response);
249 }
250
251 ScriptPromise Cache::keys(ScriptState* scriptState)
252 {
253 return keysImpl(scriptState, RefPtrWillBeRawPtr<Request>(), Dictionary());
254 }
255
256 ScriptPromise Cache::keys(ScriptState* scriptState, Request* originalRequest, co nst Dictionary& queryParamsDict)
257 {
258 TrackExceptionState exceptionState;
259 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
260 if (exceptionState.hadException()) {
261 // FIXME: We should throw the caught error.
262 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
263 }
264 return keysImpl(scriptState);
265 }
266
267 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString, const Dictionary& queryParamsDict)
268 {
269 TrackExceptionState exceptionState;
270 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
271 if (exceptionState.hadException()) {
272 // FIXME: We should throw the caught error.
273 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(exceptionState.message(), scriptState->isolate()));
274 }
275 return keysImpl(scriptState, request, queryParamsDict);
276 }
277
278 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(adoptPtr(webCache))
279 {
280 ScriptWrappable::init(this);
281 ASSERT(m_webCache->proxyInterface() == 0);
282 m_webCache->setProxyInterface(this);
283 }
284
285 PassRefPtrWillBeRawPtr<Cache> Cache::create(WebServiceWorkerCache* webCache)
286 {
287 return adoptRefWillBeNoop(new Cache(webCache));
288 }
289
290 ScriptPromise Cache::matchImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr< Request> request, const Dictionary& queryParamsDict)
291 {
292 WebServiceWorkerRequest webRequest;
293 request->populateWebServiceWorkerRequest(webRequest);
294
295 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
296 const ScriptPromise promise = resolver->promise();
297 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, que ryParamsFromDictionary(queryParamsDict));
298 return promise;
299 }
300
301 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, PassRefPtrWillBeRawP tr<Request> request, const Dictionary& queryParamsDict)
302 {
303 WebServiceWorkerRequest webRequest;
304 request->populateWebServiceWorkerRequest(webRequest);
305
306 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
307 const ScriptPromise promise = resolver->promise();
308 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR equest, queryParamsFromDictionary(queryParamsDict));
309 return promise;
310 }
311
312 ScriptPromise Cache::addImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<Re quest>)
67 { 313 {
68 return rejectAsNotImplemented(scriptState); 314 return rejectAsNotImplemented(scriptState);
69 } 315 }
70 316
71 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ estString, const Dictionary& queryParams) 317 ScriptPromise Cache::addAllImpl(ScriptState* scriptState, Vector<RefPtrWillBeRaw Ptr<Request> >)
72 { 318 {
73 return rejectAsNotImplemented(scriptState); 319 return rejectAsNotImplemented(scriptState);
74 } 320 }
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 321
101 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService WorkerCacheError reason) 322 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService WorkerCacheError reason)
102 { 323 {
103 switch (reason) { 324 switch (reason) {
104 case WebServiceWorkerCacheErrorNotImplemented: 325 case WebServiceWorkerCacheErrorNotImplemented:
105 return DOMException::create(NotSupportedError, "Method is not implemente d."); 326 return DOMException::create(NotSupportedError, "Method is not implemente d.");
106 case WebServiceWorkerCacheErrorNotFound: 327 case WebServiceWorkerCacheErrorNotFound:
107 return DOMException::create(NotFoundError, "Entry was not found."); 328 return DOMException::create(NotFoundError, "Entry was not found.");
108 case WebServiceWorkerCacheErrorExists: 329 case WebServiceWorkerCacheErrorExists:
109 return DOMException::create(InvalidAccessError, "Entry already exists.") ; 330 return DOMException::create(InvalidAccessError, "Entry already exists.") ;
110 default: 331 default:
111 ASSERT_NOT_REACHED(); 332 ASSERT_NOT_REACHED();
112 return DOMException::create(NotSupportedError, "Unknown error."); 333 return DOMException::create(NotSupportedError, "Unknown error.");
113 } 334 }
114 } 335 }
115 336
116 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(webCache) 337 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr <Request> request, const Dictionary& queryParamsDict)
117 { 338 {
118 ScriptWrappable::init(this); 339 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
340 batchOperations[0].operationType = WebServiceWorkerCache::WebServiceWorkerCa cheOperationTypeDelete;
341 request->populateWebServiceWorkerRequest(batchOperations[0].request);
342 batchOperations[0].matchParams = queryParamsFromDictionary(queryParamsDict);
343
344 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
345 const ScriptPromise promise = resolver->promise();
346 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations);
347 return promise;
348 }
349
350 ScriptPromise Cache::putImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<Re quest> request, Response* response)
351 {
352 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
353 batchOperations[0].operationType = WebServiceWorkerCache::WebServiceWorkerCa cheOperationTypePut;
354 request->populateWebServiceWorkerRequest(batchOperations[0].request);
355 response->populateWebServiceWorkerResponse(batchOperations[0].response);
356
357 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
358 const ScriptPromise promise = resolver->promise();
359 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations);
360 return promise;
361 }
362
363 ScriptPromise Cache::keysImpl(ScriptState* scriptState)
364 {
365 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
366 const ScriptPromise promise = resolver->promise();
367 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams());
368 return promise;
369 }
370
371 ScriptPromise Cache::keysImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<R equest> request, const Dictionary& queryParamsDict)
372 {
373 WebServiceWorkerRequest webRequest;
374 request->populateWebServiceWorkerRequest(webRequest);
375
376 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
377 const ScriptPromise promise = resolver->promise();
378 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams());
379 return promise;
119 } 380 }
120 381
121 } // namespace blink 382 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/serviceworkers/Cache.h ('k') | Source/modules/serviceworkers/Cache.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698