1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef STORAGE_BROWSER_QUOTA_USAGE_TRACKER_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define STORAGE_BROWSER_QUOTA_USAGE_TRACKER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_callbacks.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_client.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_task.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/special_storage_policy.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/storage_browser_export.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/quota/quota_types.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientUsageTracker;
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass StorageMonitor;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A helper class that gathers and tracks the amount of data stored in
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all quota clients.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An instance of this class is created per storage type.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass STORAGE_EXPORT UsageTracker : public QuotaTaskObserver {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UsageTracker(const QuotaClientList& clients, StorageType type,
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch               SpecialStoragePolicy* special_storage_policy,
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch               StorageMonitor* storage_monitor);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UsageTracker();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StorageType type() const { return type_; }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientUsageTracker* GetClientTracker(QuotaClient::ID client_id);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void GetGlobalLimitedUsage(const UsageCallback& callback);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetGlobalUsage(const GlobalUsageCallback& callback);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetHostUsage(const std::string& host, const UsageCallback& callback);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateUsageCache(QuotaClient::ID client_id,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const GURL& origin,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int64 delta);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetCachedHostsUsage(std::map<std::string, int64>* host_usage) const;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetCachedOrigins(std::set<GURL>* origins) const;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsWorking() const {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return global_usage_callbacks_.HasCallbacks() ||
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host_usage_callbacks_.HasAnyCallbacks();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUsageCacheEnabled(QuotaClient::ID client_id,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const GURL& origin,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bool enabled);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct AccumulateInfo {
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AccumulateInfo() : pending_clients(0), usage(0), unlimited_usage(0) {}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int pending_clients;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 usage;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 unlimited_usage;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<QuotaClient::ID, ClientUsageTracker*> ClientTrackerMap;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ClientUsageTracker;
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AccumulateClientGlobalLimitedUsage(AccumulateInfo* info,
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          int64 limited_usage);
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AccumulateClientGlobalUsage(AccumulateInfo* info,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   int64 usage,
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   int64 unlimited_usage);
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AccumulateClientHostUsage(AccumulateInfo* info,
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 const std::string& host,
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 int64 usage);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const StorageType type_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientTrackerMap client_tracker_map_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UsageCallbackQueue global_limited_usage_callbacks_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalUsageCallbackQueue global_usage_callbacks_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostUsageCallbackMap host_usage_callbacks_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  StorageMonitor* storage_monitor_;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<UsageTracker> weak_factory_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UsageTracker);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class holds per-client usage tracking information and caches per-host
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// usage data.  An instance of this class is created per client.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientUsageTracker : public SpecialStoragePolicy::Observer,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public base::NonThreadSafe,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public base::SupportsWeakPtr<ClientUsageTracker> {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef base::Callback<void(int64 limited_usage,
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              int64 unlimited_usage)> HostUsageAccumulator;
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(const GURL& origin,
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              int64 usage)> OriginUsageAccumulator;
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef std::map<std::string, std::set<GURL> > OriginSetByHost;
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientUsageTracker(UsageTracker* tracker,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     QuotaClient* client,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     StorageType type,
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     SpecialStoragePolicy* special_storage_policy,
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     StorageMonitor* storage_monitor);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClientUsageTracker();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void GetGlobalLimitedUsage(const UsageCallback& callback);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetGlobalUsage(const GlobalUsageCallback& callback);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetHostUsage(const std::string& host, const UsageCallback& callback);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateUsageCache(const GURL& origin, int64 delta);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetCachedHostsUsage(std::map<std::string, int64>* host_usage) const;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetCachedOrigins(std::set<GURL>* origins) const;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 GetCachedOriginsUsage(const std::set<GURL>& origins,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              std::vector<GURL>* origins_not_in_cache);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsUsageCacheEnabledForOrigin(const GURL& origin) const;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUsageCacheEnabled(const GURL& origin, bool enabled);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef CallbackQueueMap<HostUsageAccumulator, std::string,
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           Tuple2<int64, int64> > HostUsageAccumulatorMap;
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<std::string> HostSet;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<GURL, int64> UsageMap;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, UsageMap> HostUsageMap;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct AccumulateInfo {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int pending_jobs;
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int64 limited_usage;
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int64 unlimited_usage;
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AccumulateInfo()
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        : pending_jobs(0), limited_usage(0), unlimited_usage(0) {}
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AccumulateLimitedOriginUsage(AccumulateInfo* info,
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    const UsageCallback& callback,
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    int64 usage);
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetOriginsForGlobalUsage(const GlobalUsageCallback& callback,
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   const std::set<GURL>& origins);
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AccumulateHostUsage(AccumulateInfo* info,
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           const GlobalUsageCallback& callback,
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           int64 limited_usage,
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           int64 unlimited_usage);
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetOriginsForHostUsage(const std::string& host,
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 const std::set<GURL>& origins);
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void GetUsageForOrigins(const std::string& host,
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          const std::set<GURL>& origins);
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AccumulateOriginUsage(AccumulateInfo* info,
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const std::string& host,
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const GURL& origin,
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             int64 usage);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void DidGetHostUsageAfterUpdate(const GURL& origin, int64 usage);
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods used by our GatherUsage tasks, as a task makes progress
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origins and hosts are added incrementally to the cache.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCachedOrigin(const GURL& origin, int64 usage);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCachedHost(const std::string& host);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 GetCachedHostUsage(const std::string& host) const;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 GetCachedGlobalUnlimitedUsage();
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool GetCachedOriginUsage(const GURL& origin, int64* usage) const;
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // SpecialStoragePolicy::Observer overrides
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGranted(const GURL& origin, int change_flags) OVERRIDE;
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnRevoked(const GURL& origin, int change_flags) OVERRIDE;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnCleared() OVERRIDE;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsStorageUnlimited(const GURL& origin) const;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UsageTracker* tracker_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaClient* client_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const StorageType type_;
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  StorageMonitor* storage_monitor_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int64 global_limited_usage_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 global_unlimited_usage_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool global_usage_retrieved_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostSet cached_hosts_;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HostUsageMap cached_usage_by_host_;
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  OriginSetByHost non_cached_limited_origins_by_host_;
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  OriginSetByHost non_cached_unlimited_origins_by_host_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalUsageCallbackQueue global_usage_callback_;
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HostUsageAccumulatorMap host_usage_accumulators_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SpecialStoragePolicy> special_storage_policy_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClientUsageTracker);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace storage
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // STORAGE_BROWSER_QUOTA_USAGE_TRACKER_H_
203