Index: webkit/browser/quota/quota_manager.h |
diff --git a/webkit/browser/quota/quota_manager.h b/webkit/browser/quota/quota_manager.h |
index 19c26f22f0905bd91708e4979083bb36e7b345ac..86c55a81a0a651da2e94c8c35255216902a4d13d 100644 |
--- a/webkit/browser/quota/quota_manager.h |
+++ b/webkit/browser/quota/quota_manager.h |
@@ -1,460 +1,5 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef WEBKIT_BROWSER_QUOTA_QUOTA_MANAGER_H_ |
-#define WEBKIT_BROWSER_QUOTA_QUOTA_MANAGER_H_ |
- |
-#include <deque> |
-#include <list> |
-#include <map> |
-#include <set> |
-#include <string> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/callback.h" |
-#include "base/files/file_path.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/sequenced_task_runner_helpers.h" |
-#include "webkit/browser/quota/quota_callbacks.h" |
-#include "webkit/browser/quota/quota_client.h" |
-#include "webkit/browser/quota/quota_database.h" |
-#include "webkit/browser/quota/quota_task.h" |
-#include "webkit/browser/quota/special_storage_policy.h" |
-#include "webkit/browser/quota/storage_observer.h" |
-#include "webkit/browser/storage_browser_export.h" |
- |
-namespace base { |
-class FilePath; |
-class SequencedTaskRunner; |
-class SingleThreadTaskRunner; |
-} |
- |
-namespace quota_internals { |
-class QuotaInternalsProxy; |
-} |
- |
-namespace content { |
-class MockQuotaManager; |
-class MockStorageClient; |
-class QuotaManagerTest; |
-class StorageMonitorTest; |
- |
-} |
- |
-namespace storage { |
- |
-class QuotaDatabase; |
-class QuotaManagerProxy; |
-class QuotaTemporaryStorageEvictor; |
-class StorageMonitor; |
-class UsageTracker; |
- |
-struct QuotaManagerDeleter; |
- |
-struct STORAGE_EXPORT UsageAndQuota { |
- int64 usage; |
- int64 global_limited_usage; |
- int64 quota; |
- int64 available_disk_space; |
- |
- UsageAndQuota(); |
- UsageAndQuota(int64 usage, |
- int64 global_limited_usage, |
- int64 quota, |
- int64 available_disk_space); |
-}; |
- |
-// An interface called by QuotaTemporaryStorageEvictor. |
-class STORAGE_EXPORT QuotaEvictionHandler { |
- public: |
- typedef base::Callback<void(const GURL&)> GetLRUOriginCallback; |
- typedef StatusCallback EvictOriginDataCallback; |
- typedef base::Callback<void(QuotaStatusCode status, |
- const UsageAndQuota& usage_and_quota)> |
- UsageAndQuotaCallback; |
- |
- // Returns the least recently used origin. It might return empty |
- // GURL when there are no evictable origins. |
- virtual void GetLRUOrigin( |
- StorageType type, |
- const GetLRUOriginCallback& callback) = 0; |
- |
- virtual void EvictOriginData( |
- const GURL& origin, |
- StorageType type, |
- const EvictOriginDataCallback& callback) = 0; |
- |
- virtual void GetUsageAndQuotaForEviction( |
- const UsageAndQuotaCallback& callback) = 0; |
- |
- protected: |
- virtual ~QuotaEvictionHandler() {} |
-}; |
- |
-struct UsageInfo { |
- UsageInfo(const std::string& host, StorageType type, int64 usage) |
- : host(host), |
- type(type), |
- usage(usage) {} |
- std::string host; |
- StorageType type; |
- int64 usage; |
-}; |
- |
-// The quota manager class. This class is instantiated per profile and |
-// held by the profile. With the exception of the constructor and the |
-// proxy() method, all methods should only be called on the IO thread. |
-class STORAGE_EXPORT QuotaManager |
- : public QuotaTaskObserver, |
- public QuotaEvictionHandler, |
- public base::RefCountedThreadSafe<QuotaManager, QuotaManagerDeleter> { |
- public: |
- typedef base::Callback<void(QuotaStatusCode, |
- int64 /* usage */, |
- int64 /* quota */)> |
- GetUsageAndQuotaCallback; |
- |
- static const int64 kIncognitoDefaultQuotaLimit; |
- static const int64 kNoLimit; |
- |
- QuotaManager( |
- bool is_incognito, |
- const base::FilePath& profile_path, |
- const scoped_refptr<base::SingleThreadTaskRunner>& io_thread, |
- const scoped_refptr<base::SequencedTaskRunner>& db_thread, |
- const scoped_refptr<SpecialStoragePolicy>& special_storage_policy); |
- |
- // Returns a proxy object that can be used on any thread. |
- QuotaManagerProxy* proxy() { return proxy_.get(); } |
- |
- // Called by clients or webapps. Returns usage per host. |
- void GetUsageInfo(const GetUsageInfoCallback& callback); |
- |
- // Called by Web Apps. |
- // This method is declared as virtual to allow test code to override it. |
- virtual void GetUsageAndQuotaForWebApps( |
- const GURL& origin, |
- StorageType type, |
- const GetUsageAndQuotaCallback& callback); |
- |
- // Called by StorageClients. |
- // This method is declared as virtual to allow test code to override it. |
- // |
- // For UnlimitedStorage origins, this version skips usage and quota handling |
- // to avoid extra query cost. |
- // Do not call this method for apps/user-facing code. |
- virtual void GetUsageAndQuota( |
- const GURL& origin, |
- StorageType type, |
- const GetUsageAndQuotaCallback& callback); |
- |
- // Called by clients via proxy. |
- // Client storage should call this method when storage is accessed. |
- // Used to maintain LRU ordering. |
- void NotifyStorageAccessed(QuotaClient::ID client_id, |
- const GURL& origin, |
- StorageType type); |
- |
- // Called by clients via proxy. |
- // Client storage must call this method whenever they have made any |
- // modifications that change the amount of data stored in their storage. |
- void NotifyStorageModified(QuotaClient::ID client_id, |
- const GURL& origin, |
- StorageType type, |
- int64 delta); |
- |
- // Used to avoid evicting origins with open pages. |
- // A call to NotifyOriginInUse must be balanced by a later call |
- // to NotifyOriginNoLongerInUse. |
- void NotifyOriginInUse(const GURL& origin); |
- void NotifyOriginNoLongerInUse(const GURL& origin); |
- bool IsOriginInUse(const GURL& origin) const { |
- return origins_in_use_.find(origin) != origins_in_use_.end(); |
- } |
- |
- void SetUsageCacheEnabled(QuotaClient::ID client_id, |
- const GURL& origin, |
- StorageType type, |
- bool enabled); |
- |
- // DeleteOriginData and DeleteHostData (surprisingly enough) delete data of a |
- // particular StorageType associated with either a specific origin or set of |
- // origins. Each method additionally requires a |quota_client_mask| which |
- // specifies the types of QuotaClients to delete from the origin. This is |
- // specified by the caller as a bitmask built from QuotaClient::IDs. Setting |
- // the mask to QuotaClient::kAllClientsMask will remove all clients from the |
- // origin, regardless of type. |
- virtual void DeleteOriginData(const GURL& origin, |
- StorageType type, |
- int quota_client_mask, |
- const StatusCallback& callback); |
- void DeleteHostData(const std::string& host, |
- StorageType type, |
- int quota_client_mask, |
- const StatusCallback& callback); |
- |
- // Called by UI and internal modules. |
- void GetAvailableSpace(const AvailableSpaceCallback& callback); |
- void GetTemporaryGlobalQuota(const QuotaCallback& callback); |
- |
- // Ok to call with NULL callback. |
- void SetTemporaryGlobalOverrideQuota(int64 new_quota, |
- const QuotaCallback& callback); |
- |
- void GetPersistentHostQuota(const std::string& host, |
- const QuotaCallback& callback); |
- void SetPersistentHostQuota(const std::string& host, |
- int64 new_quota, |
- const QuotaCallback& callback); |
- void GetGlobalUsage(StorageType type, const GlobalUsageCallback& callback); |
- void GetHostUsage(const std::string& host, StorageType type, |
- const UsageCallback& callback); |
- void GetHostUsage(const std::string& host, StorageType type, |
- QuotaClient::ID client_id, |
- const UsageCallback& callback); |
- |
- bool IsTrackingHostUsage(StorageType type, QuotaClient::ID client_id) const; |
- |
- void GetStatistics(std::map<std::string, std::string>* statistics); |
- |
- bool IsStorageUnlimited(const GURL& origin, StorageType type) const; |
- |
- bool CanQueryDiskSize(const GURL& origin) const { |
- return special_storage_policy_.get() && |
- special_storage_policy_->CanQueryDiskSize(origin); |
- } |
- |
- virtual void GetOriginsModifiedSince(StorageType type, |
- base::Time modified_since, |
- const GetOriginsCallback& callback); |
- |
- bool ResetUsageTracker(StorageType type); |
- |
- // Used to register/deregister observers that wish to monitor storage events. |
- void AddStorageObserver(StorageObserver* observer, |
- const StorageObserver::MonitorParams& params); |
- void RemoveStorageObserver(StorageObserver* observer); |
- void RemoveStorageObserverForFilter(StorageObserver* observer, |
- const StorageObserver::Filter& filter); |
- |
- // Determines the portion of the temp pool that can be |
- // utilized by a single host (ie. 5 for 20%). |
- static const int kPerHostTemporaryPortion; |
- |
- static const int64 kPerHostPersistentQuotaLimit; |
- |
- static const char kDatabaseName[]; |
- |
- static const int kThresholdOfErrorsToBeBlacklisted; |
- |
- static const int kEvictionIntervalInMilliSeconds; |
- |
- // These are kept non-const so that test code can change the value. |
- // TODO(kinuko): Make this a real const value and add a proper way to set |
- // the quota for syncable storage. (http://crbug.com/155488) |
- static int64 kMinimumPreserveForSystem; |
- static int64 kSyncableStorageDefaultHostQuota; |
- |
- protected: |
- virtual ~QuotaManager(); |
- |
- private: |
- friend class base::DeleteHelper<QuotaManager>; |
- friend class base::RefCountedThreadSafe<QuotaManager, QuotaManagerDeleter>; |
- friend class content::QuotaManagerTest; |
- friend class content::StorageMonitorTest; |
- friend class content::MockQuotaManager; |
- friend class content::MockStorageClient; |
- friend class quota_internals::QuotaInternalsProxy; |
- friend class QuotaManagerProxy; |
- friend class QuotaTemporaryStorageEvictor; |
- friend struct QuotaManagerDeleter; |
- |
- class GetUsageInfoTask; |
- |
- class OriginDataDeleter; |
- class HostDataDeleter; |
- |
- class GetModifiedSinceHelper; |
- class DumpQuotaTableHelper; |
- class DumpOriginInfoTableHelper; |
- |
- typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; |
- typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry; |
- typedef std::vector<QuotaTableEntry> QuotaTableEntries; |
- typedef std::vector<OriginInfoTableEntry> OriginInfoTableEntries; |
- |
- // Function pointer type used to store the function which returns the |
- // available disk space for the disk containing the given FilePath. |
- typedef int64 (*GetAvailableDiskSpaceFn)(const base::FilePath&); |
- |
- typedef base::Callback<void(const QuotaTableEntries&)> |
- DumpQuotaTableCallback; |
- typedef base::Callback<void(const OriginInfoTableEntries&)> |
- DumpOriginInfoTableCallback; |
- |
- struct EvictionContext { |
- EvictionContext(); |
- virtual ~EvictionContext(); |
- GURL evicted_origin; |
- StorageType evicted_type; |
- |
- EvictOriginDataCallback evict_origin_data_callback; |
- }; |
- |
- typedef QuotaEvictionHandler::UsageAndQuotaCallback |
- UsageAndQuotaDispatcherCallback; |
- |
- // This initialization method is lazily called on the IO thread |
- // when the first quota manager API is called. |
- // Initialize must be called after all quota clients are added to the |
- // manager by RegisterStorage. |
- void LazyInitialize(); |
- |
- // Called by clients via proxy. |
- // Registers a quota client to the manager. |
- // The client must remain valid until OnQuotaManagerDestored is called. |
- void RegisterClient(QuotaClient* client); |
- |
- UsageTracker* GetUsageTracker(StorageType type) const; |
- |
- // Extract cached origins list from the usage tracker. |
- // (Might return empty list if no origin is tracked by the tracker.) |
- void GetCachedOrigins(StorageType type, std::set<GURL>* origins); |
- |
- // These internal methods are separately defined mainly for testing. |
- void NotifyStorageAccessedInternal( |
- QuotaClient::ID client_id, |
- const GURL& origin, |
- StorageType type, |
- base::Time accessed_time); |
- void NotifyStorageModifiedInternal( |
- QuotaClient::ID client_id, |
- const GURL& origin, |
- StorageType type, |
- int64 delta, |
- base::Time modified_time); |
- |
- void DumpQuotaTable(const DumpQuotaTableCallback& callback); |
- void DumpOriginInfoTable(const DumpOriginInfoTableCallback& callback); |
- |
- // Methods for eviction logic. |
- void StartEviction(); |
- void DeleteOriginFromDatabase(const GURL& origin, StorageType type); |
- |
- void DidOriginDataEvicted(QuotaStatusCode status); |
- |
- void ReportHistogram(); |
- void DidGetTemporaryGlobalUsageForHistogram(int64 usage, |
- int64 unlimited_usage); |
- void DidGetPersistentGlobalUsageForHistogram(int64 usage, |
- int64 unlimited_usage); |
- |
- // QuotaEvictionHandler. |
- virtual void GetLRUOrigin( |
- StorageType type, |
- const GetLRUOriginCallback& callback) OVERRIDE; |
- virtual void EvictOriginData( |
- const GURL& origin, |
- StorageType type, |
- const EvictOriginDataCallback& callback) OVERRIDE; |
- virtual void GetUsageAndQuotaForEviction( |
- const UsageAndQuotaCallback& callback) OVERRIDE; |
- |
- void DidSetTemporaryGlobalOverrideQuota(const QuotaCallback& callback, |
- const int64* new_quota, |
- bool success); |
- void DidGetPersistentHostQuota(const std::string& host, |
- const int64* quota, |
- bool success); |
- void DidSetPersistentHostQuota(const std::string& host, |
- const QuotaCallback& callback, |
- const int64* new_quota, |
- bool success); |
- void DidInitialize(int64* temporary_quota_override, |
- int64* desired_available_space, |
- bool success); |
- void DidGetLRUOrigin(const GURL* origin, |
- bool success); |
- void DidGetInitialTemporaryGlobalQuota(QuotaStatusCode status, |
- int64 quota_unused); |
- void DidInitializeTemporaryOriginsInfo(bool success); |
- void DidGetAvailableSpace(int64 space); |
- void DidDatabaseWork(bool success); |
- |
- void DeleteOnCorrectThread() const; |
- |
- void PostTaskAndReplyWithResultForDBThread( |
- const tracked_objects::Location& from_here, |
- const base::Callback<bool(QuotaDatabase*)>& task, |
- const base::Callback<void(bool)>& reply); |
- |
- const bool is_incognito_; |
- const base::FilePath profile_path_; |
- |
- scoped_refptr<QuotaManagerProxy> proxy_; |
- bool db_disabled_; |
- bool eviction_disabled_; |
- scoped_refptr<base::SingleThreadTaskRunner> io_thread_; |
- scoped_refptr<base::SequencedTaskRunner> db_thread_; |
- mutable scoped_ptr<QuotaDatabase> database_; |
- |
- GetLRUOriginCallback lru_origin_callback_; |
- std::set<GURL> access_notified_origins_; |
- |
- QuotaClientList clients_; |
- |
- scoped_ptr<UsageTracker> temporary_usage_tracker_; |
- scoped_ptr<UsageTracker> persistent_usage_tracker_; |
- scoped_ptr<UsageTracker> syncable_usage_tracker_; |
- // TODO(michaeln): Need a way to clear the cache, drop and |
- // reinstantiate the trackers when they're not handling requests. |
- |
- scoped_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_; |
- EvictionContext eviction_context_; |
- |
- ClosureQueue db_initialization_callbacks_; |
- AvailableSpaceCallbackQueue available_space_callbacks_; |
- GlobalQuotaCallbackQueue temporary_global_quota_callbacks_; |
- HostQuotaCallbackMap persistent_host_quota_callbacks_; |
- |
- bool temporary_quota_initialized_; |
- int64 temporary_quota_override_; |
- |
- int64 desired_available_space_; |
- |
- // Map from origin to count. |
- std::map<GURL, int> origins_in_use_; |
- // Map from origin to error count. |
- std::map<GURL, int> origins_in_error_; |
- |
- scoped_refptr<SpecialStoragePolicy> special_storage_policy_; |
- |
- base::RepeatingTimer<QuotaManager> histogram_timer_; |
- |
- // Pointer to the function used to get the available disk space. This is |
- // overwritten by QuotaManagerTest in order to attain a deterministic reported |
- // value. The default value points to base::SysInfo::AmountOfFreeDiskSpace. |
- GetAvailableDiskSpaceFn get_disk_space_fn_; |
- |
- scoped_ptr<StorageMonitor> storage_monitor_; |
- |
- base::WeakPtrFactory<QuotaManager> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(QuotaManager); |
-}; |
- |
-struct QuotaManagerDeleter { |
- static void Destruct(const QuotaManager* manager) { |
- manager->DeleteOnCorrectThread(); |
- } |
-}; |
- |
-} // namespace storage |
- |
-#endif // WEBKIT_BROWSER_QUOTA_QUOTA_MANAGER_H_ |
+#include "storage/browser/quota/quota_manager.h" |