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

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: test isn't quite working 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
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 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) { }
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) { }
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) { }
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 int dcnt = 0;
127 fprintf(stderr, "Cache::match %d\n", ++dcnt);
128 TrackExceptionState exceptionState;
129 fprintf(stderr, "Cache::match %d\n", ++dcnt);
130 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
131 fprintf(stderr, "Cache::match %d\n", ++dcnt);
132 if (exceptionState.hadException())
133 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
134 fprintf(stderr, "Cache::match %d\n", ++dcnt);
135 return matchImpl(scriptState, request, queryParamsDict);
136 }
137
138 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParamsDict)
139 {
140 int dcnt = 0;
141 fprintf(stderr, "Cache::match %d\n", ++dcnt);
142 TrackExceptionState exceptionState;
143 fprintf(stderr, "Cache::match %d\n", ++dcnt);
144 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
145 fprintf(stderr, "Cache::match %d\n", ++dcnt);
146 if (exceptionState.hadException())
147 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
148 fprintf(stderr, "Cache::match %d\n", ++dcnt);
149 return matchImpl(scriptState, request, queryParamsDict);
150 }
151
152 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* originalRequest , const Dictionary& queryParamsDict)
153 {
154 TrackExceptionState exceptionState;
155 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
156 if (exceptionState.hadException())
157 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
158 return matchAllImpl(scriptState, request, queryParamsDict);
159 }
160
161 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr ing, const Dictionary& queryParamsDict)
162 {
163 TrackExceptionState exceptionState;
164 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
165 if (exceptionState.hadException())
166 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
167 return matchAllImpl(scriptState, request, queryParamsDict);
168 }
169
170 ScriptPromise Cache::add(ScriptState* scriptState, Request* originalRequest)
171 {
172 TrackExceptionState exceptionState;
173 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
174 if (exceptionState.hadException())
175 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
176 return addImpl(scriptState, request);
177 }
178
179 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString)
180 {
181 TrackExceptionState exceptionState;
182 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
183 if (exceptionState.hadException())
184 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
185 return addImpl(scriptState, request);
186 }
187
188 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>& rawRequests)
189 {
190 // FIXME: Implement this.
191 return rejectAsNotImplemented(scriptState);
192 }
193
194 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* originalR equest, const Dictionary& queryParamsDict)
195 {
196 TrackExceptionState exceptionState;
197 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
198 if (exceptionState.hadException())
199 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
200 return deleteImpl(scriptState, request, queryParamsDict);
201 }
202
203 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ estString, const Dictionary& queryParamsDict)
204 {
205 TrackExceptionState exceptionState;
206 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
207 if (exceptionState.hadException())
208 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
209 return deleteImpl(scriptState, request, queryParamsDict);
210 }
211
212 ScriptPromise Cache::put(ScriptState* scriptState, Request* originalRequest, Res ponse* response)
213 {
214 TrackExceptionState exceptionState;
215 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
216 if (exceptionState.hadException())
217 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
218 return putImpl(scriptState, request, response);
219 }
220
221 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString, Response* response)
222 {
223 TrackExceptionState exceptionState;
224 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
225 if (exceptionState.hadException())
226 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
227 return putImpl(scriptState, request, response);
228 }
229
230 ScriptPromise Cache::keys(ScriptState* scriptState)
231 {
232 return keysImpl(scriptState, RefPtrWillBeRawPtr<Request>(), Dictionary());
233 }
234
235 ScriptPromise Cache::keys(ScriptState* scriptState, Request* originalRequest, co nst Dictionary& queryParamsDict)
236 {
237 TrackExceptionState exceptionState;
238 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), originalRequest, exceptionState);
239 if (exceptionState.hadException())
240 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
241 return keysImpl(scriptState);
242 }
243
244 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString, const Dictionary& queryParamsDict)
245 {
246 TrackExceptionState exceptionState;
247 RefPtrWillBeRawPtr<Request> request = Request::create(scriptState->execution Context(), requestString, exceptionState);
248 if (exceptionState.hadException())
249 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
250 return keysImpl(scriptState, request, queryParamsDict);
251 }
252
253 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(adoptPtr(webCache))
254 {
255 ScriptWrappable::init(this);
256 ASSERT(m_webCache->proxyInterface() == 0);
257 m_webCache->setProxyInterface(this);
258 }
259
260 PassRefPtrWillBeRawPtr<Cache> Cache::create(WebServiceWorkerCache* webCache)
261 {
262 return adoptRefWillBeNoop(new Cache(webCache));
263 }
264
265 ScriptPromise Cache::matchImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr< Request> request, const Dictionary& queryParamsDict)
266 {
267 int dcnt = 0;
268 fprintf(stderr, "Cache::matchImpl %d\n", ++dcnt);
269 WebServiceWorkerRequest webRequest;
270 fprintf(stderr, "Cache::matchImpl %d\n", ++dcnt);
271 request->populateWebServiceWorkerRequest(webRequest);
272 fprintf(stderr, "Cache::matchImpl %d\n", ++dcnt);
273
274 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
275 fprintf(stderr, "Cache::matchImpl %d\n", ++dcnt);
276 const ScriptPromise promise = resolver->promise();
277 fprintf(stderr, "Cache::matchImpl %d\n", ++dcnt);
278 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, que ryParamsFromDictionary(queryParamsDict));
279 fprintf(stderr, "Cache::matchImpl %d\n", ++dcnt);
280 return promise;
281 }
282
283 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, PassRefPtrWillBeRawP tr<Request> request, const Dictionary& queryParamsDict)
284 {
285 WebServiceWorkerRequest webRequest;
286 request->populateWebServiceWorkerRequest(webRequest);
287
17 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 288 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
18 const ScriptPromise promise = resolver->promise(); 289 const ScriptPromise promise = resolver->promise();
19 resolver->reject(DOMException::create(NotSupportedError, "Cache is not imple mented")); 290 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR equest, queryParamsFromDictionary(queryParamsDict));
20 return promise; 291 return promise;
21 } 292 }
22 293
23 } 294 ScriptPromise Cache::addImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<Re quest>)
24 295 {
25 PassRefPtrWillBeRawPtr<Cache> Cache::fromWebServiceWorkerCache(WebServiceWorkerC ache* webCache) 296 // FIXME: Implement this.
26 {
27 return adoptRefWillBeNoop(new Cache(webCache));
28 }
29
30 // FIXME: Implement these methods.
31 ScriptPromise Cache::match(ScriptState* scriptState, Request* request, const Dic tionary& queryParams)
32 {
33 return rejectAsNotImplemented(scriptState); 297 return rejectAsNotImplemented(scriptState);
34 } 298 }
35 299
36 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParams) 300 ScriptPromise Cache::addAllImpl(ScriptState* scriptState, Vector<RefPtrWillBeRaw Ptr<Request> >)
37 { 301 {
302 // FIXME: Implement this.
38 return rejectAsNotImplemented(scriptState); 303 return rejectAsNotImplemented(scriptState);
39 } 304 }
40 305
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) 306 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService WorkerCacheError reason)
102 { 307 {
103 switch (reason) { 308 switch (reason) {
104 case WebServiceWorkerCacheErrorNotImplemented: 309 case WebServiceWorkerCacheErrorNotImplemented:
105 return DOMException::create(NotSupportedError, "Method is not implemente d."); 310 return DOMException::create(NotSupportedError, "Method is not implemente d.");
106 case WebServiceWorkerCacheErrorNotFound: 311 case WebServiceWorkerCacheErrorNotFound:
107 return DOMException::create(NotFoundError, "Entry was not found."); 312 return DOMException::create(NotFoundError, "Entry was not found.");
108 case WebServiceWorkerCacheErrorExists: 313 case WebServiceWorkerCacheErrorExists:
109 return DOMException::create(InvalidAccessError, "Entry already exists.") ; 314 return DOMException::create(InvalidAccessError, "Entry already exists.") ;
110 default: 315 default:
111 ASSERT_NOT_REACHED(); 316 ASSERT_NOT_REACHED();
112 return DOMException::create(NotSupportedError, "Unknown error."); 317 return DOMException::create(NotSupportedError, "Unknown error.");
113 } 318 }
114 } 319 }
115 320
116 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(webCache) 321 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr <Request> request, const Dictionary& queryParamsDict)
117 { 322 {
118 ScriptWrappable::init(this); 323 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
324 batchOperations[0].operationType = WebServiceWorkerCache::WebServiceWorkerCa cheOperationTypeDelete;
325 request->populateWebServiceWorkerRequest(batchOperations[0].request);
326 batchOperations[0].matchParams = queryParamsFromDictionary(queryParamsDict);
327
328 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
329 const ScriptPromise promise = resolver->promise();
330 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations);
331 return promise;
332 }
333
334 ScriptPromise Cache::putImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<Re quest> request, Response* response)
335 {
336 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
337 batchOperations[0].operationType = WebServiceWorkerCache::WebServiceWorkerCa cheOperationTypePut;
338 request->populateWebServiceWorkerRequest(batchOperations[0].request);
339 response->populateWebServiceWorkerResponse(batchOperations[0].response);
340
341 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
342 const ScriptPromise promise = resolver->promise();
343 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations);
344 return promise;
345 }
346
347 ScriptPromise Cache::keysImpl(ScriptState* scriptState)
348 {
349 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
350 const ScriptPromise promise = resolver->promise();
351 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams());
352 return promise;
353 }
354
355 ScriptPromise Cache::keysImpl(ScriptState* scriptState, PassRefPtrWillBeRawPtr<R equest> request, const Dictionary& queryParamsDict)
356 {
357 WebServiceWorkerRequest webRequest;
358 request->populateWebServiceWorkerRequest(webRequest);
359
360 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
361 const ScriptPromise promise = resolver->promise();
362 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, queryP aramsFromDictionary(queryParamsDict));
363 return promise;
119 } 364 }
120 365
121 } // namespace blink 366 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698