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_QUOTA_MANAGER_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_callbacks.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_client.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_database.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_task.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/special_storage_policy.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/storage_observer.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/storage_browser_export.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SequencedTaskRunner;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace quota_internals {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaInternalsProxy;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace content {
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockQuotaManager;
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass MockStorageClient;
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass QuotaManagerTest;
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass StorageMonitorTest;
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaDatabase;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaManagerProxy;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaTemporaryStorageEvictor;
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass StorageMonitor;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UsageTracker;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QuotaManagerDeleter;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct STORAGE_EXPORT UsageAndQuota {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage;
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int64 global_limited_usage;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 available_disk_space;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UsageAndQuota();
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UsageAndQuota(int64 usage,
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                int64 global_limited_usage,
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                int64 quota,
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                int64 available_disk_space);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface called by QuotaTemporaryStorageEvictor.
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass STORAGE_EXPORT QuotaEvictionHandler {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const GURL&)> GetLRUOriginCallback;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef StatusCallback EvictOriginDataCallback;
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(QuotaStatusCode status,
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              const UsageAndQuota& usage_and_quota)>
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      UsageAndQuotaCallback;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the least recently used origin.  It might return empty
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GURL when there are no evictable origins.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetLRUOrigin(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetLRUOriginCallback& callback) = 0;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EvictOriginData(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EvictOriginDataCallback& callback) = 0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetUsageAndQuotaForEviction(
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const UsageAndQuotaCallback& callback) = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuotaEvictionHandler() {}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct UsageInfo {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UsageInfo(const std::string& host, StorageType type, int64 usage)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : host(host),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type(type),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        usage(usage) {}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StorageType type;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The quota manager class.  This class is instantiated per profile and
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// held by the profile.  With the exception of the constructor and the
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// proxy() method, all methods should only be called on the IO thread.
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass STORAGE_EXPORT QuotaManager
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public QuotaTaskObserver,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public QuotaEvictionHandler,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::RefCountedThreadSafe<QuotaManager, QuotaManagerDeleter> {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(QuotaStatusCode,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64 /* usage */,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64 /* quota */)>
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetUsageAndQuotaCallback;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const int64 kIncognitoDefaultQuotaLimit;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kNoLimit;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuotaManager(
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool is_incognito,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::FilePath& profile_path,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<base::SingleThreadTaskRunner>& io_thread,
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<base::SequencedTaskRunner>& db_thread,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<SpecialStoragePolicy>& special_storage_policy);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a proxy object that can be used on any thread.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaManagerProxy* proxy() { return proxy_.get(); }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by clients or webapps. Returns usage per host.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetUsageInfo(const GetUsageInfoCallback& callback);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called by Web Apps.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method is declared as virtual to allow test code to override it.
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void GetUsageAndQuotaForWebApps(
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& origin,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      StorageType type,
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GetUsageAndQuotaCallback& callback);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called by StorageClients.
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This method is declared as virtual to allow test code to override it.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For UnlimitedStorage origins, this version skips usage and quota handling
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to avoid extra query cost.
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Do not call this method for apps/user-facing code.
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void GetUsageAndQuota(
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& origin,
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      StorageType type,
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GetUsageAndQuotaCallback& callback);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by clients via proxy.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Client storage should call this method when storage is accessed.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to maintain LRU ordering.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyStorageAccessed(QuotaClient::ID client_id,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GURL& origin,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             StorageType type);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by clients via proxy.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Client storage must call this method whenever they have made any
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modifications that change the amount of data stored in their storage.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyStorageModified(QuotaClient::ID client_id,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GURL& origin,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             StorageType type,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int64 delta);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to avoid evicting origins with open pages.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A call to NotifyOriginInUse must be balanced by a later call
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to NotifyOriginNoLongerInUse.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyOriginInUse(const GURL& origin);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyOriginNoLongerInUse(const GURL& origin);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOriginInUse(const GURL& origin) const {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return origins_in_use_.find(origin) != origins_in_use_.end();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUsageCacheEnabled(QuotaClient::ID client_id,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const GURL& origin,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            StorageType type,
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bool enabled);
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DeleteOriginData and DeleteHostData (surprisingly enough) delete data of a
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // particular StorageType associated with either a specific origin or set of
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origins. Each method additionally requires a |quota_client_mask| which
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specifies the types of QuotaClients to delete from the origin. This is
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified by the caller as a bitmask built from QuotaClient::IDs. Setting
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the mask to QuotaClient::kAllClientsMask will remove all clients from the
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin, regardless of type.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteOriginData(const GURL& origin,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                StorageType type,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int quota_client_mask,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const StatusCallback& callback);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteHostData(const std::string& host,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      StorageType type,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int quota_client_mask,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const StatusCallback& callback);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by UI and internal modules.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAvailableSpace(const AvailableSpaceCallback& callback);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetTemporaryGlobalQuota(const QuotaCallback& callback);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ok to call with NULL callback.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTemporaryGlobalOverrideQuota(int64 new_quota,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const QuotaCallback& callback);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPersistentHostQuota(const std::string& host,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const QuotaCallback& callback);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPersistentHostQuota(const std::string& host,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64 new_quota,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const QuotaCallback& callback);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetGlobalUsage(StorageType type, const GlobalUsageCallback& callback);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetHostUsage(const std::string& host, StorageType type,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const UsageCallback& callback);
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void GetHostUsage(const std::string& host, StorageType type,
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    QuotaClient::ID client_id,
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    const UsageCallback& callback);
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool IsTrackingHostUsage(StorageType type, QuotaClient::ID client_id) const;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetStatistics(std::map<std::string, std::string>* statistics);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsStorageUnlimited(const GURL& origin, StorageType type) const;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool CanQueryDiskSize(const GURL& origin) const {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return special_storage_policy_.get() &&
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           special_storage_policy_->CanQueryDiskSize(origin);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetOriginsModifiedSince(StorageType type,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       base::Time modified_since,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const GetOriginsCallback& callback);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ResetUsageTracker(StorageType type);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Used to register/deregister observers that wish to monitor storage events.
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void AddStorageObserver(StorageObserver* observer,
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          const StorageObserver::MonitorParams& params);
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void RemoveStorageObserver(StorageObserver* observer);
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void RemoveStorageObserverForFilter(StorageObserver* observer,
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      const StorageObserver::Filter& filter);
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determines the portion of the temp pool that can be
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // utilized by a single host (ie. 5 for 20%).
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kPerHostTemporaryPortion;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const int64 kPerHostPersistentQuotaLimit;
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kDatabaseName[];
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kThresholdOfErrorsToBeBlacklisted;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kEvictionIntervalInMilliSeconds;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // These are kept non-const so that test code can change the value.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kinuko): Make this a real const value and add a proper way to set
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the quota for syncable storage. (http://crbug.com/155488)
260e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  static int64 kMinimumPreserveForSystem;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int64 kSyncableStorageDefaultHostQuota;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuotaManager();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<QuotaManager>;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<QuotaManager, QuotaManagerDeleter>;
2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  friend class content::QuotaManagerTest;
2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  friend class content::StorageMonitorTest;
2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  friend class content::MockQuotaManager;
2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  friend class content::MockStorageClient;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class quota_internals::QuotaInternalsProxy;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class QuotaManagerProxy;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class QuotaTemporaryStorageEvictor;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct QuotaManagerDeleter;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class GetUsageInfoTask;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class OriginDataDeleter;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class HostDataDeleter;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class GetModifiedSinceHelper;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class DumpQuotaTableHelper;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class DumpOriginInfoTableHelper;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<QuotaTableEntry> QuotaTableEntries;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<OriginInfoTableEntry> OriginInfoTableEntries;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Function pointer type used to store the function which returns the
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // available disk space for the disk containing the given FilePath.
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef int64 (*GetAvailableDiskSpaceFn)(const base::FilePath&);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const QuotaTableEntries&)>
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DumpQuotaTableCallback;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const OriginInfoTableEntries&)>
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DumpOriginInfoTableCallback;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct EvictionContext {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EvictionContext();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~EvictionContext();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL evicted_origin;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StorageType evicted_type;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EvictOriginDataCallback evict_origin_data_callback;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef QuotaEvictionHandler::UsageAndQuotaCallback
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UsageAndQuotaDispatcherCallback;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This initialization method is lazily called on the IO thread
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the first quota manager API is called.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize must be called after all quota clients are added to the
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manager by RegisterStorage.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LazyInitialize();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by clients via proxy.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers a quota client to the manager.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The client must remain valid until OnQuotaManagerDestored is called.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterClient(QuotaClient* client);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UsageTracker* GetUsageTracker(StorageType type) const;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extract cached origins list from the usage tracker.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Might return empty list if no origin is tracked by the tracker.)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetCachedOrigins(StorageType type, std::set<GURL>* origins);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These internal methods are separately defined mainly for testing.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyStorageAccessedInternal(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::ID client_id,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time accessed_time);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyStorageModifiedInternal(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::ID client_id,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 delta,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time modified_time);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DumpQuotaTable(const DumpQuotaTableCallback& callback);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DumpOriginInfoTable(const DumpOriginInfoTableCallback& callback);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods for eviction logic.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartEviction();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteOriginFromDatabase(const GURL& origin, StorageType type);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidOriginDataEvicted(QuotaStatusCode status);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportHistogram();
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetTemporaryGlobalUsageForHistogram(int64 usage,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int64 unlimited_usage);
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetPersistentGlobalUsageForHistogram(int64 usage,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int64 unlimited_usage);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // QuotaEvictionHandler.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetLRUOrigin(
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetLRUOriginCallback& callback) OVERRIDE;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EvictOriginData(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EvictOriginDataCallback& callback) OVERRIDE;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetUsageAndQuotaForEviction(
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const UsageAndQuotaCallback& callback) OVERRIDE;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidSetTemporaryGlobalOverrideQuota(const QuotaCallback& callback,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const int64* new_quota,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          bool success);
37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetPersistentHostQuota(const std::string& host,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const int64* quota,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool success);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidSetPersistentHostQuota(const std::string& host,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const QuotaCallback& callback,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const int64* new_quota,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool success);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidInitialize(int64* temporary_quota_override,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int64* desired_available_space,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool success);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetLRUOrigin(const GURL* origin,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       bool success);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetInitialTemporaryGlobalQuota(QuotaStatusCode status,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int64 quota_unused);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidInitializeTemporaryOriginsInfo(bool success);
38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetAvailableSpace(int64 space);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidDatabaseWork(bool success);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteOnCorrectThread() const;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostTaskAndReplyWithResultForDBThread(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const tracked_objects::Location& from_here,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Callback<bool(QuotaDatabase*)>& task,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Callback<void(bool)>& reply);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool is_incognito_;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath profile_path_;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<QuotaManagerProxy> proxy_;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool db_disabled_;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool eviction_disabled_;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> io_thread_;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> db_thread_;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable scoped_ptr<QuotaDatabase> database_;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOriginCallback lru_origin_callback_;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> access_notified_origins_;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaClientList clients_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UsageTracker> temporary_usage_tracker_;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UsageTracker> persistent_usage_tracker_;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UsageTracker> syncable_usage_tracker_;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(michaeln): Need a way to clear the cache, drop and
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reinstantiate the trackers when they're not handling requests.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EvictionContext eviction_context_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ClosureQueue db_initialization_callbacks_;
42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AvailableSpaceCallbackQueue available_space_callbacks_;
42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GlobalQuotaCallbackQueue temporary_global_quota_callbacks_;
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HostQuotaCallbackMap persistent_host_quota_callbacks_;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool temporary_quota_initialized_;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 temporary_quota_override_;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 desired_available_space_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map from origin to count.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<GURL, int> origins_in_use_;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map from origin to error count.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<GURL, int> origins_in_error_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SpecialStoragePolicy> special_storage_policy_;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RepeatingTimer<QuotaManager> histogram_timer_;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the function used to get the available disk space. This is
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overwritten by QuotaManagerTest in order to attain a deterministic reported
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value. The default value points to base::SysInfo::AmountOfFreeDiskSpace.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAvailableDiskSpaceFn get_disk_space_fn_;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<StorageMonitor> storage_monitor_;
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WeakPtrFactory<QuotaManager> weak_factory_;
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuotaManager);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QuotaManagerDeleter {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Destruct(const QuotaManager* manager) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->DeleteOnCorrectThread();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace storage
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_H_
461