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
3 // found in the LICENSE file.
4
5 #include "content/renderer/service_worker/service_worker_cache_storage_dispatcher.h"
6
7 #include <map>
8 #include <string>
9 #include <utility>
10
11 #include "base/logging.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "content/common/service_worker/service_worker_messages.h"
14 #include "content/public/renderer/render_thread.h"
15 #include "content/renderer/service_worker/service_worker_script_context.h"
16 #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
17 #include "third_party/WebKit/public/platform/WebServiceWorkerCache.h"
18 #include "third_party/WebKit/public/platform/WebServiceWorkerRequest.h"
19 #include "third_party/WebKit/public/platform/WebServiceWorkerResponse.h"
20
21 namespace content {
22
23 using blink::WebServiceWorkerCacheError;
24 using blink::WebServiceWorkerRequest;
25
26 namespace {
27
28 class HeaderVisitor : public blink::WebHTTPHeaderVisitor {
29 public:
HeaderVisitor(ServiceWorkerHeaderMap * headers)30 HeaderVisitor(ServiceWorkerHeaderMap* headers) : headers_(headers) {}
~HeaderVisitor()31 virtual ~HeaderVisitor() {}
32
visitHeader(const blink::WebString & name,const blink::WebString & value)33 virtual void visitHeader(const blink::WebString& name,
34 const blink::WebString& value) {
35 headers_->insert(ServiceWorkerHeaderMap::value_type(
36 base::UTF16ToASCII(name), base::UTF16ToASCII(value)));
37 }
38
39 private:
40 ServiceWorkerHeaderMap* headers_;
41 };
42
MakeHeaderVisitor(ServiceWorkerHeaderMap * headers)43 scoped_ptr<HeaderVisitor> MakeHeaderVisitor(ServiceWorkerHeaderMap* headers) {
44 return scoped_ptr<HeaderVisitor>(new HeaderVisitor(headers)).Pass();
45 }
46
FetchRequestFromWebRequest(const blink::WebServiceWorkerRequest & web_request)47 ServiceWorkerFetchRequest FetchRequestFromWebRequest(
48 const blink::WebServiceWorkerRequest& web_request) {
49 ServiceWorkerHeaderMap headers;
50 web_request.visitHTTPHeaderFields(MakeHeaderVisitor(&headers).get());
51
52 return ServiceWorkerFetchRequest(web_request.url(),
53 base::UTF16ToASCII(web_request.method()),
54 headers, web_request.referrerUrl(),
55 web_request.isReload());
56 }
57
PopulateWebRequestFromFetchRequest(const ServiceWorkerFetchRequest & request,blink::WebServiceWorkerRequest * web_request)58 void PopulateWebRequestFromFetchRequest(
59 const ServiceWorkerFetchRequest& request,
60 blink::WebServiceWorkerRequest* web_request) {
61 web_request->setURL(request.url);
62 web_request->setMethod(base::ASCIIToUTF16(request.method));
63 for (ServiceWorkerHeaderMap::const_iterator i = request.headers.begin(),
64 end = request.headers.end();
65 i != end; ++i) {
66 web_request->setHeader(base::ASCIIToUTF16(i->first),
67 base::ASCIIToUTF16(i->second));
68 }
69 web_request->setReferrer(base::ASCIIToUTF16(request.referrer.spec()),
70 blink::WebReferrerPolicy::WebReferrerPolicyNever);
71 web_request->setIsReload(request.is_reload);
72 }
73
WebRequestsFromRequests(const std::vector<ServiceWorkerFetchRequest> & requests)74 blink::WebVector<blink::WebServiceWorkerRequest> WebRequestsFromRequests(
75 const std::vector<ServiceWorkerFetchRequest>& requests) {
76 blink::WebVector<blink::WebServiceWorkerRequest>
77 web_requests(requests.size());
78 for (size_t i = 0; i < requests.size(); ++i)
79 PopulateWebRequestFromFetchRequest(requests[i], &(web_requests[i]));
80 return web_requests;
81 }
82
ResponseFromWebResponse(const blink::WebServiceWorkerResponse & web_response)83 ServiceWorkerResponse ResponseFromWebResponse(
84 const blink::WebServiceWorkerResponse& web_response) {
85 ServiceWorkerHeaderMap headers;
86 web_response.visitHTTPHeaderFields(MakeHeaderVisitor(&headers).get());
87
88 return ServiceWorkerResponse(
89 web_response.url(), web_response.status(),
90 base::UTF16ToASCII(web_response.statusText()), headers,
91 base::UTF16ToASCII(web_response.blobUUID()));
92 }
93
PopulateWebResponseFromResponse(const ServiceWorkerResponse & response,blink::WebServiceWorkerResponse * web_response)94 void PopulateWebResponseFromResponse(
95 const ServiceWorkerResponse& response,
96 blink::WebServiceWorkerResponse* web_response) {
97 web_response->setURL(response.url);
98 web_response->setStatus(response.status_code);
99 web_response->setStatusText(base::ASCIIToUTF16(response.status_text));
100 for (ServiceWorkerHeaderMap::const_iterator i = response.headers.begin(),
101 end = response.headers.end();
102 i != end; ++i) {
103 web_response->setHeader(base::ASCIIToUTF16(i->first),
104 base::ASCIIToUTF16(i->second));
105 }
106 // TODO(gavinp): set blob here.
107 }
108
WebResponsesFromResponses(const std::vector<ServiceWorkerResponse> & responses)109 blink::WebVector<blink::WebServiceWorkerResponse> WebResponsesFromResponses(
110 const std::vector<ServiceWorkerResponse>& responses) {
111 blink::WebVector<blink::WebServiceWorkerResponse>
112 web_responses(responses.size());
113 for (size_t i = 0; i < responses.size(); ++i)
114 PopulateWebResponseFromResponse(responses[i], &(web_responses[i]));
115 return web_responses;
116 }
117
QueryParamsFromWebQueryParams(const blink::WebServiceWorkerCache::QueryParams & web_query_params)118 ServiceWorkerCacheQueryParams QueryParamsFromWebQueryParams(
119 const blink::WebServiceWorkerCache::QueryParams& web_query_params) {
120 ServiceWorkerCacheQueryParams query_params;
121 query_params.ignore_search = web_query_params.ignoreSearch;
122 query_params.ignore_method = web_query_params.ignoreMethod;
123 query_params.ignore_vary = web_query_params.ignoreVary;
124 query_params.prefix_match = web_query_params.prefixMatch;
125
126 return query_params;
127 }
128
CacheOperationTypeFromWebCacheOperationType(blink::WebServiceWorkerCache::OperationType operation_type)129 ServiceWorkerCacheOperationType CacheOperationTypeFromWebCacheOperationType(
130 blink::WebServiceWorkerCache::OperationType operation_type) {
131 switch (operation_type) {
132 case blink::WebServiceWorkerCache::OperationTypePut:
133 return SERVICE_WORKER_CACHE_OPERATION_TYPE_PUT;
134 case blink::WebServiceWorkerCache::OperationTypeDelete:
135 return SERVICE_WORKER_CACHE_OPERATION_TYPE_DELETE;
136 default:
137 return SERVICE_WORKER_CACHE_OPERATION_TYPE_UNDEFINED;
138 }
139 }
140
BatchOperationFromWebBatchOperation(const blink::WebServiceWorkerCache::BatchOperation & web_operation)141 ServiceWorkerBatchOperation BatchOperationFromWebBatchOperation(
142 const blink::WebServiceWorkerCache::BatchOperation& web_operation) {
143 ServiceWorkerBatchOperation operation;
144 operation.operation_type =
145 CacheOperationTypeFromWebCacheOperationType(web_operation.operationType);
146 operation.request = FetchRequestFromWebRequest(web_operation.request);
147 operation.response = ResponseFromWebResponse(web_operation.response);
148 operation.match_params =
149 QueryParamsFromWebQueryParams(web_operation.matchParams);
150 return operation;
151 }
152
153 template<typename T>
ClearCallbacksMapWithErrors(T * callbacks_map)154 void ClearCallbacksMapWithErrors(T* callbacks_map) {
155 typename T::iterator iter(callbacks_map);
156 while (!iter.IsAtEnd()) {
157 blink::WebServiceWorkerCacheError reason =
158 blink::WebServiceWorkerCacheErrorNotFound;
159 iter.GetCurrentValue()->onError(&reason);
160 callbacks_map->Remove(iter.GetCurrentKey());
161 iter.Advance();
162 }
163 }
164
165 } // namespace
166
167 // The WebCache object is the Chromium side implementation of the Blink
168 // WebServiceWorkerCache API. Most of its methods delegate directly to the
169 // ServiceWorkerStorage object, which is able to assign unique IDs as well
170 // as have a lifetime longer than the requests.
171 class ServiceWorkerCacheStorageDispatcher::WebCache
172 : public blink::WebServiceWorkerCache {
173 public:
WebCache(base::WeakPtr<ServiceWorkerCacheStorageDispatcher> dispatcher,int cache_id)174 WebCache(base::WeakPtr<ServiceWorkerCacheStorageDispatcher> dispatcher,
175 int cache_id)
176 : dispatcher_(dispatcher),
177 cache_id_(cache_id) {}
178
~WebCache()179 virtual ~WebCache() {
180 if (dispatcher_)
181 dispatcher_->OnWebCacheDestruction(cache_id_);
182 }
183
184 // From blink::WebServiceWorkerCache:
dispatchMatch(CacheMatchCallbacks * callbacks,const blink::WebServiceWorkerRequest & request,const QueryParams & query_params)185 virtual void dispatchMatch(CacheMatchCallbacks* callbacks,
186 const blink::WebServiceWorkerRequest& request,
187 const QueryParams& query_params) {
188 if (!dispatcher_)
189 return;
190 dispatcher_->dispatchMatchForCache(cache_id_, callbacks, request,
191 query_params);
192 }
dispatchMatchAll(CacheWithResponsesCallbacks * callbacks,const blink::WebServiceWorkerRequest & request,const QueryParams & query_params)193 virtual void dispatchMatchAll(CacheWithResponsesCallbacks* callbacks,
194 const blink::WebServiceWorkerRequest& request,
195 const QueryParams& query_params) {
196 if (!dispatcher_)
197 return;
198 dispatcher_->dispatchMatchAllForCache(cache_id_, callbacks, request,
199 query_params);
200 }
dispatchKeys(CacheWithRequestsCallbacks * callbacks,const blink::WebServiceWorkerRequest * request,const QueryParams & query_params)201 virtual void dispatchKeys(CacheWithRequestsCallbacks* callbacks,
202 const blink::WebServiceWorkerRequest* request,
203 const QueryParams& query_params) {
204 if (!dispatcher_)
205 return;
206 dispatcher_->dispatchKeysForCache(cache_id_, callbacks, request,
207 query_params);
208 }
dispatchBatch(CacheWithResponsesCallbacks * callbacks,const blink::WebVector<BatchOperation> & batch_operations)209 virtual void dispatchBatch(
210 CacheWithResponsesCallbacks* callbacks,
211 const blink::WebVector<BatchOperation>& batch_operations) {
212 if (!dispatcher_)
213 return;
214 dispatcher_->dispatchBatchForCache(cache_id_, callbacks, batch_operations);
215 }
216
217 private:
218 const base::WeakPtr<ServiceWorkerCacheStorageDispatcher> dispatcher_;
219 const int cache_id_;
220 };
221
ServiceWorkerCacheStorageDispatcher(ServiceWorkerScriptContext * script_context)222 ServiceWorkerCacheStorageDispatcher::ServiceWorkerCacheStorageDispatcher(
223 ServiceWorkerScriptContext* script_context)
224 : script_context_(script_context),
225 weak_factory_(this) {}
226
~ServiceWorkerCacheStorageDispatcher()227 ServiceWorkerCacheStorageDispatcher::~ServiceWorkerCacheStorageDispatcher() {
228 ClearCallbacksMapWithErrors(&get_callbacks_);
229 ClearCallbacksMapWithErrors(&has_callbacks_);
230 ClearCallbacksMapWithErrors(&create_callbacks_);
231 ClearCallbacksMapWithErrors(&delete_callbacks_);
232 ClearCallbacksMapWithErrors(&keys_callbacks_);
233
234 ClearCallbacksMapWithErrors(&cache_match_callbacks_);
235 ClearCallbacksMapWithErrors(&cache_match_all_callbacks_);
236 ClearCallbacksMapWithErrors(&cache_keys_callbacks_);
237 ClearCallbacksMapWithErrors(&cache_batch_callbacks_);
238 }
239
OnMessageReceived(const IPC::Message & message)240 bool ServiceWorkerCacheStorageDispatcher::OnMessageReceived(
241 const IPC::Message& message) {
242 bool handled = true;
243 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerCacheStorageDispatcher, message)
244 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageGetSuccess,
245 OnCacheStorageGetSuccess)
246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageHasSuccess,
247 OnCacheStorageHasSuccess)
248 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageCreateSuccess,
249 OnCacheStorageCreateSuccess)
250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageDeleteSuccess,
251 OnCacheStorageDeleteSuccess)
252 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageKeysSuccess,
253 OnCacheStorageKeysSuccess)
254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageGetError,
255 OnCacheStorageGetError)
256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageHasError,
257 OnCacheStorageHasError)
258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageCreateError,
259 OnCacheStorageCreateError)
260 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageDeleteError,
261 OnCacheStorageDeleteError)
262 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheStorageKeysError,
263 OnCacheStorageKeysError)
264 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheMatchSuccess,
265 OnCacheMatchSuccess)
266 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheMatchAllSuccess,
267 OnCacheMatchAllSuccess)
268 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheKeysSuccess,
269 OnCacheKeysSuccess)
270 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheBatchSuccess,
271 OnCacheBatchSuccess)
272 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheMatchError,
273 OnCacheMatchError)
274 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheMatchAllError,
275 OnCacheMatchAllError)
276 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheKeysError,
277 OnCacheKeysError)
278 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CacheBatchError,
279 OnCacheBatchError)
280 IPC_MESSAGE_UNHANDLED(handled = false)
281 IPC_END_MESSAGE_MAP()
282
283 return handled;
284 }
285
OnCacheStorageGetSuccess(int request_id,int cache_id)286 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageGetSuccess(
287 int request_id,
288 int cache_id) {
289 WebCache* web_cache = new WebCache(weak_factory_.GetWeakPtr(), cache_id);
290 web_caches_.AddWithID(web_cache, cache_id);
291 CacheStorageWithCacheCallbacks* callbacks = get_callbacks_.Lookup(request_id);
292 callbacks->onSuccess(web_cache);
293 get_callbacks_.Remove(request_id);
294 }
295
OnCacheStorageHasSuccess(int request_id)296 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageHasSuccess(
297 int request_id) {
298 CacheStorageCallbacks* callbacks = has_callbacks_.Lookup(request_id);
299 callbacks->onSuccess();
300 has_callbacks_.Remove(request_id);
301 }
302
OnCacheStorageCreateSuccess(int request_id,int cache_id)303 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageCreateSuccess(
304 int request_id,
305 int cache_id) {
306 WebCache* web_cache = new WebCache(weak_factory_.GetWeakPtr(), cache_id);
307 web_caches_.AddWithID(web_cache, cache_id);
308 CacheStorageWithCacheCallbacks* callbacks =
309 create_callbacks_.Lookup(request_id);
310 callbacks->onSuccess(web_cache);
311 create_callbacks_.Remove(request_id);
312 }
313
OnCacheStorageDeleteSuccess(int request_id)314 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageDeleteSuccess(
315 int request_id) {
316 CacheStorageCallbacks* callbacks = delete_callbacks_.Lookup(request_id);
317 callbacks->onSuccess();
318 delete_callbacks_.Remove(request_id);
319 }
320
OnCacheStorageKeysSuccess(int request_id,const std::vector<base::string16> & keys)321 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageKeysSuccess(
322 int request_id,
323 const std::vector<base::string16>& keys) {
324 CacheStorageKeysCallbacks* callbacks = keys_callbacks_.Lookup(request_id);
325 blink::WebVector<blink::WebString> webKeys(keys.size());
326 for (size_t i = 0; i < keys.size(); ++i)
327 webKeys[i] = keys[i];
328
329 callbacks->onSuccess(&webKeys);
330 keys_callbacks_.Remove(request_id);
331 }
332
OnCacheStorageGetError(int request_id,blink::WebServiceWorkerCacheError reason)333 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageGetError(
334 int request_id,
335 blink::WebServiceWorkerCacheError reason) {
336 CacheStorageWithCacheCallbacks* callbacks =
337 get_callbacks_.Lookup(request_id);
338 callbacks->onError(&reason);
339 get_callbacks_.Remove(request_id);
340 }
341
OnCacheStorageHasError(int request_id,blink::WebServiceWorkerCacheError reason)342 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageHasError(
343 int request_id,
344 blink::WebServiceWorkerCacheError reason) {
345 CacheStorageCallbacks* callbacks = has_callbacks_.Lookup(request_id);
346 callbacks->onError(&reason);
347 has_callbacks_.Remove(request_id);
348 }
349
OnCacheStorageCreateError(int request_id,blink::WebServiceWorkerCacheError reason)350 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageCreateError(
351 int request_id,
352 blink::WebServiceWorkerCacheError reason) {
353 CacheStorageWithCacheCallbacks* callbacks =
354 create_callbacks_.Lookup(request_id);
355 callbacks->onError(&reason);
356 create_callbacks_.Remove(request_id);
357 }
358
OnCacheStorageDeleteError(int request_id,blink::WebServiceWorkerCacheError reason)359 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageDeleteError(
360 int request_id,
361 blink::WebServiceWorkerCacheError reason) {
362 CacheStorageCallbacks* callbacks = delete_callbacks_.Lookup(request_id);
363 callbacks->onError(&reason);
364 delete_callbacks_.Remove(request_id);
365 }
366
OnCacheStorageKeysError(int request_id,blink::WebServiceWorkerCacheError reason)367 void ServiceWorkerCacheStorageDispatcher::OnCacheStorageKeysError(
368 int request_id,
369 blink::WebServiceWorkerCacheError reason) {
370 CacheStorageKeysCallbacks* callbacks = keys_callbacks_.Lookup(request_id);
371 callbacks->onError(&reason);
372 keys_callbacks_.Remove(request_id);
373 }
374
OnCacheMatchSuccess(int request_id,const ServiceWorkerResponse & response)375 void ServiceWorkerCacheStorageDispatcher::OnCacheMatchSuccess(
376 int request_id,
377 const ServiceWorkerResponse& response) {
378 blink::WebServiceWorkerCache::CacheMatchCallbacks* callbacks =
379 cache_match_callbacks_.Lookup(request_id);
380
381 blink::WebServiceWorkerResponse web_response;
382 PopulateWebResponseFromResponse(response, &web_response);
383 callbacks->onSuccess(&web_response);
384 cache_match_callbacks_.Remove(request_id);
385 }
386
OnCacheMatchAllSuccess(int request_id,const std::vector<ServiceWorkerResponse> & responses)387 void ServiceWorkerCacheStorageDispatcher::OnCacheMatchAllSuccess(
388 int request_id,
389 const std::vector<ServiceWorkerResponse>& responses) {
390 blink::WebServiceWorkerCache::CacheWithResponsesCallbacks* callbacks =
391 cache_match_all_callbacks_.Lookup(request_id);
392
393 blink::WebVector<blink::WebServiceWorkerResponse>
394 web_responses = WebResponsesFromResponses(responses);
395 callbacks->onSuccess(&web_responses);
396 cache_match_all_callbacks_.Remove(request_id);
397 }
398
OnCacheKeysSuccess(int request_id,const std::vector<ServiceWorkerFetchRequest> & requests)399 void ServiceWorkerCacheStorageDispatcher::OnCacheKeysSuccess(
400
401 int request_id,
402 const std::vector<ServiceWorkerFetchRequest>& requests) {
403 blink::WebServiceWorkerCache::CacheWithRequestsCallbacks* callbacks =
404 cache_keys_callbacks_.Lookup(request_id);
405
406 blink::WebVector<blink::WebServiceWorkerRequest>
407 web_requests = WebRequestsFromRequests(requests);
408 callbacks->onSuccess(&web_requests);
409 cache_keys_callbacks_.Remove(request_id);
410 }
411
OnCacheBatchSuccess(int request_id,const std::vector<ServiceWorkerResponse> & responses)412 void ServiceWorkerCacheStorageDispatcher::OnCacheBatchSuccess(
413 int request_id,
414 const std::vector<ServiceWorkerResponse>& responses) {
415 blink::WebServiceWorkerCache::CacheWithResponsesCallbacks* callbacks =
416 cache_batch_callbacks_.Lookup(request_id);
417
418 blink::WebVector<blink::WebServiceWorkerResponse>
419 web_responses = WebResponsesFromResponses(responses);
420 callbacks->onSuccess(&web_responses);
421 cache_batch_callbacks_.Remove(request_id);
422 }
423
OnCacheMatchError(int request_id,blink::WebServiceWorkerCacheError reason)424 void ServiceWorkerCacheStorageDispatcher::OnCacheMatchError(
425 int request_id,
426 blink::WebServiceWorkerCacheError reason) {
427 blink::WebServiceWorkerCache::CacheMatchCallbacks* callbacks =
428 cache_match_callbacks_.Lookup(request_id);
429 callbacks->onError(&reason);
430 cache_match_callbacks_.Remove(request_id);
431 }
432
OnCacheMatchAllError(int request_id,blink::WebServiceWorkerCacheError reason)433 void ServiceWorkerCacheStorageDispatcher::OnCacheMatchAllError(
434 int request_id,
435 blink::WebServiceWorkerCacheError reason) {
436 blink::WebServiceWorkerCache::CacheWithResponsesCallbacks* callbacks =
437 cache_match_all_callbacks_.Lookup(request_id);
438 callbacks->onError(&reason);
439 cache_match_all_callbacks_.Remove(request_id);
440 }
441
OnCacheKeysError(int request_id,blink::WebServiceWorkerCacheError reason)442 void ServiceWorkerCacheStorageDispatcher::OnCacheKeysError(
443 int request_id,
444 blink::WebServiceWorkerCacheError reason) {
445 blink::WebServiceWorkerCache::CacheWithRequestsCallbacks* callbacks =
446 cache_keys_callbacks_.Lookup(request_id);
447 callbacks->onError(&reason);
448 cache_keys_callbacks_.Remove(request_id);
449 }
450
OnCacheBatchError(int request_id,blink::WebServiceWorkerCacheError reason)451 void ServiceWorkerCacheStorageDispatcher::OnCacheBatchError(
452 int request_id,
453 blink::WebServiceWorkerCacheError reason) {
454 blink::WebServiceWorkerCache::CacheWithResponsesCallbacks* callbacks =
455 cache_batch_callbacks_.Lookup(request_id);
456 callbacks->onError(&reason);
457 cache_batch_callbacks_.Remove(request_id);
458 }
459
dispatchGet(CacheStorageWithCacheCallbacks * callbacks,const blink::WebString & cacheName)460 void ServiceWorkerCacheStorageDispatcher::dispatchGet(
461 CacheStorageWithCacheCallbacks* callbacks,
462 const blink::WebString& cacheName) {
463 int request_id = get_callbacks_.Add(callbacks);
464 script_context_->Send(new ServiceWorkerHostMsg_CacheStorageGet(
465 script_context_->GetRoutingID(), request_id, cacheName));
466 }
467
dispatchHas(CacheStorageCallbacks * callbacks,const blink::WebString & cacheName)468 void ServiceWorkerCacheStorageDispatcher::dispatchHas(
469 CacheStorageCallbacks* callbacks,
470 const blink::WebString& cacheName) {
471 int request_id = has_callbacks_.Add(callbacks);
472 script_context_->Send(new ServiceWorkerHostMsg_CacheStorageHas(
473 script_context_->GetRoutingID(), request_id, cacheName));
474 }
475
dispatchCreate(CacheStorageWithCacheCallbacks * callbacks,const blink::WebString & cacheName)476 void ServiceWorkerCacheStorageDispatcher::dispatchCreate(
477 CacheStorageWithCacheCallbacks* callbacks,
478 const blink::WebString& cacheName) {
479 int request_id = create_callbacks_.Add(callbacks);
480 script_context_->Send(new ServiceWorkerHostMsg_CacheStorageCreate(
481 script_context_->GetRoutingID(), request_id, cacheName));
482 }
483
dispatchDelete(CacheStorageCallbacks * callbacks,const blink::WebString & cacheName)484 void ServiceWorkerCacheStorageDispatcher::dispatchDelete(
485 CacheStorageCallbacks* callbacks,
486 const blink::WebString& cacheName) {
487 int request_id = delete_callbacks_.Add(callbacks);
488 script_context_->Send(new ServiceWorkerHostMsg_CacheStorageDelete(
489 script_context_->GetRoutingID(), request_id, cacheName));
490 }
491
dispatchKeys(CacheStorageKeysCallbacks * callbacks)492 void ServiceWorkerCacheStorageDispatcher::dispatchKeys(
493 CacheStorageKeysCallbacks* callbacks) {
494 int request_id = keys_callbacks_.Add(callbacks);
495 script_context_->Send(new ServiceWorkerHostMsg_CacheStorageKeys(
496 script_context_->GetRoutingID(), request_id));
497 }
498
dispatchMatchForCache(int cache_id,blink::WebServiceWorkerCache::CacheMatchCallbacks * callbacks,const blink::WebServiceWorkerRequest & request,const blink::WebServiceWorkerCache::QueryParams & query_params)499 void ServiceWorkerCacheStorageDispatcher::dispatchMatchForCache(
500 int cache_id,
501 blink::WebServiceWorkerCache::CacheMatchCallbacks* callbacks,
502 const blink::WebServiceWorkerRequest& request,
503 const blink::WebServiceWorkerCache::QueryParams& query_params) {
504 int request_id = cache_match_callbacks_.Add(callbacks);
505
506 script_context_->Send(new ServiceWorkerHostMsg_CacheMatch(
507 script_context_->GetRoutingID(), request_id, cache_id,
508 FetchRequestFromWebRequest(request),
509 QueryParamsFromWebQueryParams(query_params)));
510 }
511
dispatchMatchAllForCache(int cache_id,blink::WebServiceWorkerCache::CacheWithResponsesCallbacks * callbacks,const blink::WebServiceWorkerRequest & request,const blink::WebServiceWorkerCache::QueryParams & query_params)512 void ServiceWorkerCacheStorageDispatcher::dispatchMatchAllForCache(
513 int cache_id,
514 blink::WebServiceWorkerCache::CacheWithResponsesCallbacks* callbacks,
515 const blink::WebServiceWorkerRequest& request,
516 const blink::WebServiceWorkerCache::QueryParams& query_params) {
517 int request_id = cache_match_all_callbacks_.Add(callbacks);
518
519 script_context_->Send(new ServiceWorkerHostMsg_CacheMatchAll(
520 script_context_->GetRoutingID(), request_id, cache_id,
521 FetchRequestFromWebRequest(request),
522 QueryParamsFromWebQueryParams(query_params)));
523 }
524
dispatchKeysForCache(int cache_id,blink::WebServiceWorkerCache::CacheWithRequestsCallbacks * callbacks,const blink::WebServiceWorkerRequest * request,const blink::WebServiceWorkerCache::QueryParams & query_params)525 void ServiceWorkerCacheStorageDispatcher::dispatchKeysForCache(
526 int cache_id,
527 blink::WebServiceWorkerCache::CacheWithRequestsCallbacks* callbacks,
528 const blink::WebServiceWorkerRequest* request,
529 const blink::WebServiceWorkerCache::QueryParams& query_params) {
530 int request_id = cache_keys_callbacks_.Add(callbacks);
531
532 script_context_->Send(new ServiceWorkerHostMsg_CacheKeys(
533 script_context_->GetRoutingID(), request_id, cache_id,
534 request ? FetchRequestFromWebRequest(*request)
535 : ServiceWorkerFetchRequest(),
536 QueryParamsFromWebQueryParams(query_params)));
537 }
538
dispatchBatchForCache(int cache_id,blink::WebServiceWorkerCache::CacheWithResponsesCallbacks * callbacks,const blink::WebVector<blink::WebServiceWorkerCache::BatchOperation> & web_operations)539 void ServiceWorkerCacheStorageDispatcher::dispatchBatchForCache(
540 int cache_id,
541 blink::WebServiceWorkerCache::CacheWithResponsesCallbacks* callbacks,
542 const blink::WebVector<
543 blink::WebServiceWorkerCache::BatchOperation>& web_operations) {
544 int request_id = cache_batch_callbacks_.Add(callbacks);
545
546 std::vector<ServiceWorkerBatchOperation> operations;
547 operations.reserve(web_operations.size());
548 for (size_t i = 0; i < web_operations.size(); ++i) {
549 operations.push_back(
550 BatchOperationFromWebBatchOperation(web_operations[i]));
551 }
552
553 script_context_->Send(new ServiceWorkerHostMsg_CacheBatch(
554 script_context_->GetRoutingID(), request_id, cache_id, operations));
555 }
556
OnWebCacheDestruction(int cache_id)557 void ServiceWorkerCacheStorageDispatcher::OnWebCacheDestruction(int cache_id) {
558 web_caches_.Remove(cache_id);
559 script_context_->Send(new ServiceWorkerHostMsg_CacheClosed(
560 script_context_->GetRoutingID(), cache_id));
561 }
562
563 } // namespace content
564