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