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 CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_SERVICE_WORKER_HELPER_H_
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_SERVICE_WORKER_HELPER_H_
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <list>
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <set>
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <string>
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector>
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/callback.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/compiler_specific.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_path.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/memory/ref_counted.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/synchronization/lock.h"
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/time/time.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/service_worker_context.h"
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/service_worker_usage_info.h"
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "url/gurl.h"
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class Profile;
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// BrowsingDataServiceWorkerHelper is an interface for classes dealing with
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// aggregating and deleting browsing data stored for Service Workers -
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// registrations, scripts, and caches.
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// A client of this class need to call StartFetching from the UI thread to
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// initiate the flow, and it'll be notified by the callback in its UI thread at
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// some later point.
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class BrowsingDataServiceWorkerHelper
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : public base::RefCountedThreadSafe<BrowsingDataServiceWorkerHelper> {
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Create a BrowsingDataServiceWorkerHelper instance for the Service Workers
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // stored in |context|'s associated profile's user data directory.
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  explicit BrowsingDataServiceWorkerHelper(
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      content::ServiceWorkerContext* context);
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Starts the fetching process, which will notify its completion via
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // |callback|. This must be called only in the UI thread.
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void StartFetching(const base::Callback<
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      void(const std::list<content::ServiceWorkerUsageInfo>&)>& callback);
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Requests the Service Worker data for an origin be deleted.
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DeleteServiceWorkers(const GURL& origin);
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected:
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~BrowsingDataServiceWorkerHelper();
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Owned by the profile.
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  content::ServiceWorkerContext* service_worker_context_;
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Access to |service_worker_info_| is triggered indirectly via the UI
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // thread and guarded by |is_fetching_|. This means |service_worker_info_|
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // is only accessed while |is_fetching_| is true. The flag |is_fetching_| is
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // only accessed on the UI thread.
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // In the context of this class |service_worker_info_| is only accessed on the
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // context's ServiceWorker thread.
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::list<content::ServiceWorkerUsageInfo> service_worker_info_;
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // This member is only mutated on the UI thread.
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::Callback<void(const std::list<content::ServiceWorkerUsageInfo>&)>
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      completion_callback_;
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Indicates whether or not we're currently fetching information:
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // it's true when StartFetching() is called in the UI thread, and it's reset
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // after we notified the callback in the UI thread.
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // This member is only mutated on the UI thread.
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool is_fetching_;
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  friend class base::RefCountedThreadSafe<BrowsingDataServiceWorkerHelper>;
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Enumerates all Service Worker instances on the IO thread.
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void FetchServiceWorkerUsageInfoOnIOThread();
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Notifies the completion callback in the UI thread.
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void NotifyOnUIThread();
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Deletes Service Workers for an origin the IO thread.
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void DeleteServiceWorkersOnIOThread(const GURL& origin);
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Callback from ServiceWorkerContext::GetAllOriginsInfo()
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void GetAllOriginsInfoCallback(
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const std::vector<content::ServiceWorkerUsageInfo>& origins);
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowsingDataServiceWorkerHelper);
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This class is an implementation of BrowsingDataServiceWorkerHelper that does
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// not fetch its information from the Service Worker context, but is passed the
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// info as a parameter.
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class CannedBrowsingDataServiceWorkerHelper
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : public BrowsingDataServiceWorkerHelper {
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Contains information about a Service Worker.
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  struct PendingServiceWorkerUsageInfo {
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    PendingServiceWorkerUsageInfo(const GURL& origin,
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  const std::vector<GURL>& scopes);
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ~PendingServiceWorkerUsageInfo();
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool operator<(const PendingServiceWorkerUsageInfo& other) const;
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    GURL origin;
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::vector<GURL> scopes;
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  explicit CannedBrowsingDataServiceWorkerHelper(
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      content::ServiceWorkerContext* context);
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Add a Service Worker to the set of canned Service Workers that is
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // returned by this helper.
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void AddServiceWorker(const GURL& origin, const std::vector<GURL>& scopes);
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Clear the list of canned Service Workers.
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Reset();
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // True if no Service Workers are currently stored.
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool empty() const;
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Returns the number of currently stored Service Workers.
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  size_t GetServiceWorkerCount() const;
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Returns the current list of Service Workers.
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const std::set<
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo>&
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetServiceWorkerUsageInfo() const;
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // BrowsingDataServiceWorkerHelper methods.
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void StartFetching(const base::Callback<void(
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const std::list<content::ServiceWorkerUsageInfo>&)>& callback) OVERRIDE;
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DeleteServiceWorkers(const GURL& origin) OVERRIDE;
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~CannedBrowsingDataServiceWorkerHelper();
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::set<PendingServiceWorkerUsageInfo> pending_service_worker_info_;
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CannedBrowsingDataServiceWorkerHelper);
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif  // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_SERVICE_WORKER_HELPER_H_
142