16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_cache_listener.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/debug/trace_event.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_cache_storage_manager.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/common/service_worker/service_worker_messages.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebServiceWorkerCacheError.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace content {
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using blink::WebServiceWorkerCacheError;
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace {
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebServiceWorkerCacheError ToWebServiceWorkerCacheError(
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerCacheStorage::CacheStorageError err) {
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (err) {
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NO_ERROR:
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      NOTREACHED();
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return blink::WebServiceWorkerCacheErrorNotImplemented;
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NOT_IMPLEMENTED:
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return blink::WebServiceWorkerCacheErrorNotImplemented;
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NOT_FOUND:
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return blink::WebServiceWorkerCacheErrorNotFound;
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_EXISTS:
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return blink::WebServiceWorkerCacheErrorExists;
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_STORAGE:
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      // TODO(jkarlin): Changethis to CACHE_STORAGE_ERROR_STORAGE once that's
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      // added.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return blink::WebServiceWorkerCacheErrorNotFound;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_CLOSING:
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // TODO(jkarlin): Update this to CACHE_STORAGE_ERROR_CLOSING once that's
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      // added.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return blink::WebServiceWorkerCacheErrorNotFound;
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTREACHED();
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return blink::WebServiceWorkerCacheErrorNotImplemented;
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ServiceWorkerCacheListener::ServiceWorkerCacheListener(
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerVersion* version,
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::WeakPtr<ServiceWorkerContextCore> context)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : version_(version),
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      context_(context),
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      next_cache_id_(0),
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_factory_(this) {
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ServiceWorkerCacheListener::~ServiceWorkerCacheListener() {
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ServiceWorkerCacheListener::OnMessageReceived(
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const IPC::Message& message) {
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool handled = true;
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ServiceWorkerCacheListener, message)
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheStorageGet,
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        OnCacheStorageGet)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheStorageHas,
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        OnCacheStorageHas)
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheStorageCreate,
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        OnCacheStorageCreate)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheStorageDelete,
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        OnCacheStorageDelete)
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheStorageKeys,
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        OnCacheStorageKeys)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheMatch,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnCacheMatch)
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheMatchAll,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnCacheMatchAll)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheKeys,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnCacheKeys)
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheBatch,
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnCacheBatch)
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CacheClosed,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnCacheClosed)
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return handled;
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageGet(
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& cache_name) {
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("ServiceWorker",
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "ServiceWorkerCacheListener::OnCacheStorageGet");
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->cache_manager()->GetCache(
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      version_->scope().GetOrigin(),
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::UTF16ToUTF8(cache_name),
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&ServiceWorkerCacheListener::OnCacheStorageGetCallback,
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 request_id));
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageHas(
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& cache_name) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("ServiceWorker",
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "ServiceWorkerCacheListener::OnCacheStorageHas");
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->cache_manager()->HasCache(
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      version_->scope().GetOrigin(),
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::UTF16ToUTF8(cache_name),
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&ServiceWorkerCacheListener::OnCacheStorageHasCallback,
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 request_id));
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageCreate(
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& cache_name) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("ServiceWorker",
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "ServiceWorkerCacheListener::OnCacheStorageCreate");
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->cache_manager()->CreateCache(
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      version_->scope().GetOrigin(),
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::UTF16ToUTF8(cache_name),
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&ServiceWorkerCacheListener::OnCacheStorageCreateCallback,
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 request_id));
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageDelete(
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& cache_name) {
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("ServiceWorker",
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "ServiceWorkerCacheListener::OnCacheStorageDelete");
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->cache_manager()->DeleteCache(
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      version_->scope().GetOrigin(),
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::UTF16ToUTF8(cache_name),
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&ServiceWorkerCacheListener::OnCacheStorageDeleteCallback,
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 request_id));
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageKeys(int request_id) {
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT0("ServiceWorker",
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "ServiceWorkerCacheListener::OnCacheStorageKeys");
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  context_->cache_manager()->EnumerateCaches(
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      version_->scope().GetOrigin(),
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&ServiceWorkerCacheListener::OnCacheStorageKeysCallback,
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 request_id));
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerCacheListener::OnCacheMatch(
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int request_id,
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int cache_id,
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerFetchRequest& request,
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerCacheQueryParams& match_params) {
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(gavinp,jkarlin): Implement this method.
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(ServiceWorkerMsg_CacheMatchError(
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      request_id, blink::WebServiceWorkerCacheErrorNotImplemented));
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerCacheListener::OnCacheMatchAll(
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int request_id,
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int cache_id,
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerFetchRequest& request,
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerCacheQueryParams& match_params) {
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(gavinp,jkarlin): Implement this method.
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(ServiceWorkerMsg_CacheMatchAllError(
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      request_id, blink::WebServiceWorkerCacheErrorNotImplemented));
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerCacheListener::OnCacheKeys(
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int request_id,
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int cache_id,
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerFetchRequest& request,
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ServiceWorkerCacheQueryParams& match_params) {
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(gavinp,jkarlin): Implement this method.
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(ServiceWorkerMsg_CacheKeysError(
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      request_id, blink::WebServiceWorkerCacheErrorNotImplemented));
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerCacheListener::OnCacheBatch(
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int request_id,
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int cache_id,
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<ServiceWorkerBatchOperation>& operations) {
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(gavinp,jkarlin): Implement this method.
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(ServiceWorkerMsg_CacheBatchError(
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      request_id, blink::WebServiceWorkerCacheErrorNotImplemented));
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerCacheListener::OnCacheClosed(int cache_id) {
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(gavinp,jkarlin): Implement this method.
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::Send(const IPC::Message& message) {
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  version_->embedded_worker()->SendMessage(message);
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageGetCallback(
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<ServiceWorkerCache>& cache,
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerCacheStorage::CacheStorageError error) {
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (error != ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NO_ERROR) {
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Send(ServiceWorkerMsg_CacheStorageGetError(
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        request_id, ToWebServiceWorkerCacheError(error)));
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CacheID cache_id = StoreCacheReference(cache);
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Send(ServiceWorkerMsg_CacheStorageGetSuccess(request_id, cache_id));
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageHasCallback(
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool has_cache,
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerCacheStorage::CacheStorageError error) {
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (error != ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NO_ERROR) {
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Send(ServiceWorkerMsg_CacheStorageHasError(
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        request_id, ToWebServiceWorkerCacheError(error)));
2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!has_cache) {
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Send(ServiceWorkerMsg_CacheStorageHasError(
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        request_id,
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        blink::WebServiceWorkerCacheErrorNotFound));
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Send(ServiceWorkerMsg_CacheStorageHasSuccess(request_id));
2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageCreateCallback(
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<ServiceWorkerCache>& cache,
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerCacheStorage::CacheStorageError error) {
2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (error != ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NO_ERROR) {
2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Send(ServiceWorkerMsg_CacheStorageCreateError(
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        request_id, ToWebServiceWorkerCacheError(error)));
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CacheID cache_id = StoreCacheReference(cache);
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Send(ServiceWorkerMsg_CacheStorageCreateSuccess(request_id, cache_id));
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageDeleteCallback(
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool deleted,
2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerCacheStorage::CacheStorageError error) {
2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!deleted ||
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      error != ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NO_ERROR) {
2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Send(ServiceWorkerMsg_CacheStorageDeleteError(
2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        request_id, ToWebServiceWorkerCacheError(error)));
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Send(ServiceWorkerMsg_CacheStorageDeleteSuccess(request_id));
2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerCacheListener::OnCacheStorageKeysCallback(
2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int request_id,
2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::vector<std::string>& strings,
2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerCacheStorage::CacheStorageError error) {
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (error != ServiceWorkerCacheStorage::CACHE_STORAGE_ERROR_NO_ERROR) {
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Send(ServiceWorkerMsg_CacheStorageKeysError(
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        request_id, ToWebServiceWorkerCacheError(error)));
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::vector<base::string16> string16s;
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0, max = strings.size(); i < max; ++i) {
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    string16s.push_back(base::UTF8ToUTF16(strings[i]));
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Send(ServiceWorkerMsg_CacheStorageKeysSuccess(request_id, string16s));
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciServiceWorkerCacheListener::CacheID
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciServiceWorkerCacheListener::StoreCacheReference(
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<ServiceWorkerCache>& cache) {
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int cache_id = next_cache_id_++;
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  id_to_cache_map_[cache_id] = cache;
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return cache_id;
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceWorkerCacheListener::DropCacheReference(CacheID cache_id) {
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  id_to_cache_map_.erase(cache_id);
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace content
288