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

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: cleaner and oilpan 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/CacheTest.cpp » ('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 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 // FIXME: Consider using CallbackPromiseAdapter.
37 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks {
38 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks);
39 public:
40 CacheMatchCallbacks(PassRefPtr<ScriptPromiseResolver> resolver)
41 : m_resolver(resolver) { }
42
43 virtual void onSuccess(WebServiceWorkerResponse* webResponse) OVERRIDE
44 {
45 m_resolver->resolve(Response::create(m_resolver->scriptState()->executio nContext(), *webResponse));
46 m_resolver.clear();
47 }
48
49 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
50 {
51 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
52 m_resolver.clear();
53 }
54
55 private:
56 RefPtr<ScriptPromiseResolver> m_resolver;
57 };
58
59 // FIXME: Consider using CallbackPromiseAdapter.
60 class CacheWithResponsesCallbacks : public WebServiceWorkerCache::CacheWithRespo nsesCallbacks {
61 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks);
62 public:
63 CacheWithResponsesCallbacks(PassRefPtr<ScriptPromiseResolver> resolver)
64 : m_resolver(resolver) { }
65
66 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) OV ERRIDE
67 {
68 HeapVector<Member<Response> > responses;
69 for (size_t i = 0; i < webResponses->size(); ++i)
70 responses.append(Response::create(m_resolver->scriptState()->executi onContext(), (*webResponses)[i]));
71 m_resolver->resolve(responses);
72 m_resolver.clear();
73 }
74
75 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
76 {
77 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
78 m_resolver.clear();
79 }
80
81 private:
82 RefPtr<ScriptPromiseResolver> m_resolver;
83 };
84
85 // FIXME: Consider using CallbackPromiseAdapter.
86 class CacheWithRequestsCallbacks : public WebServiceWorkerCache::CacheWithReques tsCallbacks {
87 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks);
88 public:
89 CacheWithRequestsCallbacks(PassRefPtr<ScriptPromiseResolver> resolver)
90 : m_resolver(resolver) { }
91
92 virtual void onSuccess(WebVector<WebServiceWorkerRequest>* webRequests) OVER RIDE
93 {
94 HeapVector<Member<Request> > requests;
95 for (size_t i = 0; i < webRequests->size(); ++i)
96 requests.append(Request::create(m_resolver->scriptState()->execution Context(), (*webRequests)[i]));
97 m_resolver->resolve(requests);
98 m_resolver.clear();
99 }
100
101 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
102 {
103 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
104 m_resolver.clear();
105 }
106
107 private:
108 RefPtr<ScriptPromiseResolver> m_resolver;
109 };
110
111 ScriptPromise rejectForCacheError(ScriptState* scriptState, WebServiceWorkerCach eError error)
112 {
113 return ScriptPromise::rejectWithDOMException(scriptState, Cache::domExceptio nForCacheError(error));
114 }
115
15 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) 116 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState)
16 { 117 {
118 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::crea te(NotSupportedError, "Cache is not implemented"));
119 }
120
121 } // namespace
122
123 Cache* Cache::create(WebServiceWorkerCache* webCache)
124 {
125 return new Cache(webCache);
126 }
127
128 ScriptPromise Cache::match(ScriptState* scriptState, Request* originalRequest, c onst Dictionary& queryParamsDict)
129 {
130 TrackExceptionState exceptionState;
131 Request* request = Request::create(scriptState->executionContext(), original Request, exceptionState);
132 if (exceptionState.hadException()) {
133 // FIXME: We should throw the caught error.
134 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
135 }
136 return matchImpl(scriptState, request, queryParamsDict);
137 }
138
139 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParamsDict)
140 {
141 TrackExceptionState exceptionState;
142 Request* request = Request::create(scriptState->executionContext(), requestS tring, exceptionState);
143 if (exceptionState.hadException()) {
144 // FIXME: We should throw the caught error.
145 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
146 }
147 return matchImpl(scriptState, request, queryParamsDict);
148 }
149
150 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* originalRequest , const Dictionary& queryParamsDict)
151 {
152 TrackExceptionState exceptionState;
153 Request* request = Request::create(scriptState->executionContext(), original Request, exceptionState);
154 if (exceptionState.hadException()) {
155 // FIXME: We should throw the caught error.
156 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
157 }
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 Request* request = Request::create(scriptState->executionContext(), requestS tring, exceptionState);
165 if (exceptionState.hadException()) {
166 // FIXME: We should throw the caught error.
167 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
168 }
169 return matchAllImpl(scriptState, request, queryParamsDict);
170 }
171
172 ScriptPromise Cache::add(ScriptState* scriptState, Request* originalRequest)
173 {
174 TrackExceptionState exceptionState;
175 Request* request = Request::create(scriptState->executionContext(), original Request, exceptionState);
176 if (exceptionState.hadException()) {
177 // FIXME: We should throw the caught error.
178 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
179 }
180 return addImpl(scriptState, request);
181 }
182
183 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString)
184 {
185 TrackExceptionState exceptionState;
186 Request* request = Request::create(scriptState->executionContext(), requestS tring, exceptionState);
187 if (exceptionState.hadException()) {
188 // FIXME: We should throw the caught error.
189 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
190 }
191 return addImpl(scriptState, request);
192 }
193
194 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>& rawRequests)
195 {
196 // FIXME: Implement this.
197 return rejectAsNotImplemented(scriptState);
198 }
199
200 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* originalR equest, const Dictionary& queryParamsDict)
201 {
202 TrackExceptionState exceptionState;
203 Request* request = Request::create(scriptState->executionContext(), original Request, exceptionState);
204 if (exceptionState.hadException()) {
205 // FIXME: We should throw the caught error.
206 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
207 }
208 return deleteImpl(scriptState, request, queryParamsDict);
209 }
210
211 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ estString, const Dictionary& queryParamsDict)
212 {
213 TrackExceptionState exceptionState;
214 Request* request = Request::create(scriptState->executionContext(), requestS tring, exceptionState);
215 if (exceptionState.hadException()) {
216 // FIXME: We should throw the caught error.
217 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
218 }
219 return deleteImpl(scriptState, request, queryParamsDict);
220 }
221
222 ScriptPromise Cache::put(ScriptState* scriptState, Request* originalRequest, Res ponse* response)
223 {
224 TrackExceptionState exceptionState;
225 Request* request = Request::create(scriptState->executionContext(), original Request, exceptionState);
226 if (exceptionState.hadException()) {
227 // FIXME: We should throw the caught error.
228 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
229 }
230 return putImpl(scriptState, request, response);
231 }
232
233 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString, Response* response)
234 {
235 TrackExceptionState exceptionState;
236 Request* request = Request::create(scriptState->executionContext(), requestS tring, exceptionState);
237 if (exceptionState.hadException()) {
238 // FIXME: We should throw the caught error.
239 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
240 }
241 return putImpl(scriptState, request, response);
242 }
243
244 ScriptPromise Cache::keys(ScriptState* scriptState)
245 {
246 return keysImpl(scriptState);
247 }
248
249 ScriptPromise Cache::keys(ScriptState* scriptState, Request* originalRequest, co nst Dictionary& queryParamsDict)
250 {
251 TrackExceptionState exceptionState;
252 Request* request = Request::create(scriptState->executionContext(), original Request, exceptionState);
253 if (exceptionState.hadException()) {
254 // FIXME: We should throw the caught error.
255 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
256 }
257 return keysImpl(scriptState, request, queryParamsDict);
258 }
259
260 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString, const Dictionary& queryParamsDict)
261 {
262 TrackExceptionState exceptionState;
263 Request* request = Request::create(scriptState->executionContext(), requestS tring, exceptionState);
264 if (exceptionState.hadException()) {
265 // FIXME: We should throw the caught error.
266 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou nd);
267 }
268 return keysImpl(scriptState, request, queryParamsDict);
269 }
270
271 Cache::Cache(WebServiceWorkerCache* webCache)
272 : m_webCache(adoptPtr(webCache)) { }
273
274 ScriptPromise Cache::matchImpl(ScriptState* scriptState, Request* request, const Dictionary& queryParamsDict)
275 {
276 WebServiceWorkerRequest webRequest;
277 request->populateWebServiceWorkerRequest(webRequest);
278
17 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 279 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
18 const ScriptPromise promise = resolver->promise(); 280 const ScriptPromise promise = resolver->promise();
19 resolver->reject(DOMException::create(NotSupportedError, "Cache is not imple mented")); 281 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, que ryParamsFromDictionary(queryParamsDict));
20 return promise; 282 return promise;
21 } 283 }
22 284
23 } 285 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, Request* request, co nst Dictionary& queryParamsDict)
24 286 {
25 Cache* Cache::create(WebServiceWorkerCache* webCache) 287 WebServiceWorkerRequest webRequest;
26 { 288 request->populateWebServiceWorkerRequest(webRequest);
27 return new Cache(webCache); 289
28 } 290 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
29 291 const ScriptPromise promise = resolver->promise();
30 // FIXME: Implement these methods. 292 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR equest, queryParamsFromDictionary(queryParamsDict));
31 ScriptPromise Cache::match(ScriptState* scriptState, Request* request, const Dic tionary& queryParams) 293 return promise;
32 { 294 }
295
296 ScriptPromise Cache::addImpl(ScriptState* scriptState, Request*)
297 {
298 // FIXME: Implement this.
33 return rejectAsNotImplemented(scriptState); 299 return rejectAsNotImplemented(scriptState);
34 } 300 }
35 301
36 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString , const Dictionary& queryParams) 302 ScriptPromise Cache::addAllImpl(ScriptState* scriptState, Vector<Request*>)
37 { 303 {
304 // FIXME: Implement this.
38 return rejectAsNotImplemented(scriptState); 305 return rejectAsNotImplemented(scriptState);
39 } 306 }
40 307
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) 308 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService WorkerCacheError reason)
102 { 309 {
103 switch (reason) { 310 switch (reason) {
104 case WebServiceWorkerCacheErrorNotImplemented: 311 case WebServiceWorkerCacheErrorNotImplemented:
105 return DOMException::create(NotSupportedError, "Method is not implemente d."); 312 return DOMException::create(NotSupportedError, "Method is not implemente d.");
106 case WebServiceWorkerCacheErrorNotFound: 313 case WebServiceWorkerCacheErrorNotFound:
107 return DOMException::create(NotFoundError, "Entry was not found."); 314 return DOMException::create(NotFoundError, "Entry was not found.");
108 case WebServiceWorkerCacheErrorExists: 315 case WebServiceWorkerCacheErrorExists:
109 return DOMException::create(InvalidAccessError, "Entry already exists.") ; 316 return DOMException::create(InvalidAccessError, "Entry already exists.") ;
110 default: 317 default:
111 ASSERT_NOT_REACHED(); 318 ASSERT_NOT_REACHED();
112 return DOMException::create(NotSupportedError, "Unknown error."); 319 return DOMException::create(NotSupportedError, "Unknown error.");
113 } 320 }
114 } 321 }
115 322
116 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(webCache) 323 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, Request* request, cons t Dictionary& queryParamsDict)
117 { 324 {
325 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
326 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelet e;
327 request->populateWebServiceWorkerRequest(batchOperations[0].request);
328 batchOperations[0].matchParams = queryParamsFromDictionary(queryParamsDict);
329
330 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
331 const ScriptPromise promise = resolver->promise();
332 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations);
333 return promise;
334 }
335
336 ScriptPromise Cache::putImpl(ScriptState* scriptState, Request* request, Respons e* response)
337 {
338 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
339 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut;
340 request->populateWebServiceWorkerRequest(batchOperations[0].request);
341 response->populateWebServiceWorkerResponse(batchOperations[0].response);
342
343 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
344 const ScriptPromise promise = resolver->promise();
345 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp erations);
346 return promise;
347 }
348
349 ScriptPromise Cache::keysImpl(ScriptState* scriptState)
350 {
351 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
352 const ScriptPromise promise = resolver->promise();
353 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams());
354 return promise;
355 }
356
357 ScriptPromise Cache::keysImpl(ScriptState* scriptState, Request* request, const Dictionary& queryParamsDict)
358 {
359 WebServiceWorkerRequest webRequest;
360 request->populateWebServiceWorkerRequest(webRequest);
361
362 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
363 const ScriptPromise promise = resolver->promise();
364 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, queryP aramsFromDictionary(queryParamsDict));
365 return promise;
118 } 366 }
119 367
120 } // namespace blink 368 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/serviceworkers/Cache.h ('k') | Source/modules/serviceworkers/CacheTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698