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)#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CACHE_LISTENER_H_
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CACHE_LISTENER_H_
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/memory/weak_ptr.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string16.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_instance.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_cache_storage.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace content {
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct ServiceWorkerBatchOperation;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct ServiceWorkerCacheQueryParams;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct ServiceWorkerFetchRequest;
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ServiceWorkerVersion;
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This class listens for requests on the Cache APIs, and sends response
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// messages to the renderer process. There is one instance per
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// ServiceWorkerVersion instance.
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ServiceWorkerCacheListener : public EmbeddedWorkerInstance::Listener {
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ServiceWorkerCacheListener(ServiceWorkerVersion* version,
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                             base::WeakPtr<ServiceWorkerContextCore> context);
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~ServiceWorkerCacheListener();
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // From EmbeddedWorkerInstance::Listener:
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The message receiver functions for the CacheStorage API:
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageGet(int request_id, const base::string16& cache_name);
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageHas(int request_id, const base::string16& cache_name);
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageCreate(int request_id,
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          const base::string16& cache_name);
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageDelete(int request_id,
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           const base::string16& cache_name);
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageKeys(int request_id);
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The message receiver functions for the Cache API:
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCacheMatch(int request_id,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    int cache_id,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const ServiceWorkerFetchRequest& request,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const ServiceWorkerCacheQueryParams& match_params);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCacheMatchAll(int request_id,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       int cache_id,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const ServiceWorkerFetchRequest& request,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const ServiceWorkerCacheQueryParams& match_params);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCacheKeys(int request_id,
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   int cache_id,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const ServiceWorkerFetchRequest& request,
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const ServiceWorkerCacheQueryParams& match_params);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCacheBatch(int request_id,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    int cache_id,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const std::vector<ServiceWorkerBatchOperation>& operations);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCacheClosed(int cache_id);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef int32_t CacheID;  // TODO(jkarlin): Bump to 64 bit.
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef std::map<CacheID, scoped_refptr<ServiceWorkerCache> > IDToCacheMap;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Send(const IPC::Message& message);
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageGetCallback(
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      int request_id,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<ServiceWorkerCache>& cache,
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ServiceWorkerCacheStorage::CacheStorageError error);
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageHasCallback(
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      int request_id,
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      bool has_cache,
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ServiceWorkerCacheStorage::CacheStorageError error);
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageCreateCallback(
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      int request_id,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<ServiceWorkerCache>& cache,
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ServiceWorkerCacheStorage::CacheStorageError error);
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageDeleteCallback(
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      int request_id,
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      bool deleted,
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ServiceWorkerCacheStorage::CacheStorageError error);
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnCacheStorageKeysCallback(
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      int request_id,
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const std::vector<std::string>& strings,
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ServiceWorkerCacheStorage::CacheStorageError error);
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Hangs onto a scoped_refptr for the cache if it isn't already doing so.
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns a unique cache_id. Call DropCacheReference when the client is done
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // with this cache.
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CacheID StoreCacheReference(const scoped_refptr<ServiceWorkerCache>& cache);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DropCacheReference(CacheID cache_id);
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // The ServiceWorkerVersion to use for messaging back to the renderer thread.
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ServiceWorkerVersion* version_;
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // The ServiceWorkerContextCore should always outlive this.
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::WeakPtr<ServiceWorkerContextCore> context_;
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IDToCacheMap id_to_cache_map_;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CacheID next_cache_id_;
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::WeakPtrFactory<ServiceWorkerCacheListener> weak_factory_;
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerCacheListener);
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace content
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif  // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CACHE_LISTENER_H_
110