| Index: storage/browser/quota/quota_manager.h
|
| diff --git a/storage/browser/quota/quota_manager.h b/storage/browser/quota/quota_manager.h
|
| index a1ef11d2a55fbdeb64aa37463f469d6fa92ef775..ecf8a2666e0755827fee4ab3ba5b9174bda7c46a 100644
|
| --- a/storage/browser/quota/quota_manager.h
|
| +++ b/storage/browser/quota/quota_manager.h
|
| @@ -60,19 +60,43 @@ class UsageTracker;
|
|
|
| struct QuotaManagerDeleter;
|
|
|
| -struct STORAGE_EXPORT UsageAndQuota {
|
| - int64_t usage;
|
| - int64_t global_limited_usage;
|
| - int64_t quota;
|
| - int64_t available_disk_space;
|
| -
|
| - UsageAndQuota();
|
| - UsageAndQuota(int64_t usage,
|
| - int64_t global_limited_usage,
|
| - int64_t quota,
|
| - int64_t available_disk_space);
|
| +// todo: new file temporary_storage_configuration.h
|
| +// Configuration parameters the storage lib embedder must provide
|
| +// to the QuotaManager.
|
| +struct TemporaryStorageConfiguration {
|
| + TemporaryStorageConfiguration() = default;
|
| +
|
| + // The target size in bytes of the shared pool of disk space the quota
|
| + // system allows for use by by websites using HTML5 storage apis, for
|
| + // example an embedder may use 50% of the total volume size.
|
| + int64_t pool_size = 0;
|
| +
|
| + // The amount in bytes of the pool an individual site may consume. The
|
| + // value must be less than or equal to the pool_size.
|
| + int64_t per_host_quota = 0;
|
| +
|
| + // The amount of space that must remain available on the storage
|
| + // volume. As the volume approaches this limit, the quota system gets
|
| + // more aggressive about evicting data and disallowing new data.
|
| + int64_t must_remain_available = 0;
|
| +
|
| + // The quota system querries the embedder for the TemporaryPoolConfiguration,
|
| + // but will rate limit the frequency of the querries to no more than once
|
| + // per refresh interval.
|
| + base::TimeDelta refresh_interval = base::TimeDelta::Max();
|
| };
|
|
|
| +// Function type used to return the temp storage config in response to a
|
| +// GetTemporaryStorageConfigurationFunc invocation.
|
| +using TemporaryStorageConfigurationCallback =
|
| + base::Callback<void(const TemporaryStorageConfiguration&)>;
|
| +
|
| +// Function type used to query the embedder about the temporary pool
|
| +// configuration. This function is invoked on the UI thread.
|
| +using GetTemporaryStorageConfigurationFunc = base::Callback<
|
| + void(const base::FilePath& partition_path, bool is_incognito,
|
| + const TemporaryStorageConfigurationCallback& callback)>;
|
| +
|
| // TODO(calamity): Use this in the temporary storage eviction path.
|
| // An interface for deciding which origin's storage should be evicted when the
|
| // quota is exceeded.
|
| @@ -93,11 +117,16 @@ class STORAGE_EXPORT QuotaEvictionPolicy {
|
| // An interface called by QuotaTemporaryStorageEvictor.
|
| class STORAGE_EXPORT QuotaEvictionHandler {
|
| public:
|
| - using EvictOriginDataCallback = StatusCallback;
|
| - using UsageAndQuotaCallback = base::Callback<
|
| - void(QuotaStatusCode status, const UsageAndQuota& usage_and_quota)>;
|
| - using VolumeInfoCallback = base::Callback<
|
| - void(bool success, uint64_t available_space, uint64_t total_space)>;
|
| + using EvictionRoundInfoCallback = base::Callback<
|
| + void(QuotaStatusCode status, const TemporaryStorageConfiguration& config,
|
| + int64_t available_space, int64_t total_space,
|
| + int64_t global_usage, bool global_usage_is_complete)>;
|
| +
|
| + // Called at the beginning of an eviction round to gather the info about
|
| + // the current configuration and usage.
|
| + virtual void GetEvictionRoundInfo(
|
| + const EvictionRoundInfoCallback& callback) = 0;
|
| +
|
|
|
| // Returns next origin to evict. It might return an empty GURL when there are
|
| // no evictable origins.
|
| @@ -106,14 +135,11 @@ class STORAGE_EXPORT QuotaEvictionHandler {
|
| int64_t global_quota,
|
| const GetOriginCallback& callback) = 0;
|
|
|
| + // Called to evict an origin.
|
| virtual void EvictOriginData(
|
| const GURL& origin,
|
| StorageType type,
|
| - const EvictOriginDataCallback& callback) = 0;
|
| -
|
| - virtual void AsyncGetVolumeInfo(const VolumeInfoCallback& callback) = 0;
|
| - virtual void GetUsageAndQuotaForEviction(
|
| - const UsageAndQuotaCallback& callback) = 0;
|
| + const StatusCallback& callback) = 0;
|
|
|
| protected:
|
| virtual ~QuotaEvictionHandler() {}
|
| @@ -137,9 +163,8 @@ class STORAGE_EXPORT QuotaManager
|
| public:
|
| typedef base::Callback<void(QuotaStatusCode,
|
| int64_t /* usage */,
|
| - int64_t /* quota */)> GetUsageAndQuotaCallback;
|
| + int64_t /* quota */)> UsageAndQuotaCallback;
|
|
|
| - static const int64_t kIncognitoDefaultQuotaLimit;
|
| static const int64_t kNoLimit;
|
|
|
| QuotaManager(
|
| @@ -147,7 +172,14 @@ class STORAGE_EXPORT QuotaManager
|
| 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);
|
| + const scoped_refptr<SpecialStoragePolicy>& special_storage_policy,
|
| + const GetTemporaryStorageConfigurationFunc& get_config_function);
|
| +
|
| + const TemporaryStorageConfiguration& storage_config() const {
|
| + return storage_config_;
|
| + }
|
| + void SetTemporaryStorageConfiguration(
|
| + const TemporaryStorageConfiguration& storage_config);
|
|
|
| // Returns a proxy object that can be used on any thread.
|
| QuotaManagerProxy* proxy() { return proxy_.get(); }
|
| @@ -160,7 +192,7 @@ class STORAGE_EXPORT QuotaManager
|
| virtual void GetUsageAndQuotaForWebApps(
|
| const GURL& origin,
|
| StorageType type,
|
| - const GetUsageAndQuotaCallback& callback);
|
| + const UsageAndQuotaCallback& callback);
|
|
|
| // Called by StorageClients.
|
| // This method is declared as virtual to allow test code to override it.
|
| @@ -171,7 +203,7 @@ class STORAGE_EXPORT QuotaManager
|
| virtual void GetUsageAndQuota(
|
| const GURL& origin,
|
| StorageType type,
|
| - const GetUsageAndQuotaCallback& callback);
|
| + const UsageAndQuotaCallback& callback);
|
|
|
| // Called by clients via proxy.
|
| // Client storage should call this method when storage is accessed.
|
| @@ -223,13 +255,6 @@ class STORAGE_EXPORT QuotaManager
|
| 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_t new_quota,
|
| - const QuotaCallback& callback);
|
| -
|
| void GetPersistentHostQuota(const std::string& host,
|
| const QuotaCallback& callback);
|
| void SetPersistentHostQuota(const std::string& host,
|
| @@ -249,6 +274,7 @@ class STORAGE_EXPORT QuotaManager
|
| bool IsStorageUnlimited(const GURL& origin, StorageType type) const;
|
|
|
| bool CanQueryDiskSize(const GURL& origin) const {
|
| + // TODO: not currently used?
|
| return special_storage_policy_.get() &&
|
| special_storage_policy_->CanQueryDiskSize(origin);
|
| }
|
| @@ -266,26 +292,17 @@ class STORAGE_EXPORT QuotaManager
|
| 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_t kPerHostPersistentQuotaLimit;
|
| -
|
| static const char kDatabaseName[];
|
| -
|
| static const int kThresholdOfErrorsToBeBlacklisted;
|
| -
|
| static const int kEvictionIntervalInMilliSeconds;
|
| -
|
| static const char kTimeBetweenRepeatedOriginEvictionsHistogram[];
|
| static const char kEvictedOriginAccessedCountHistogram[];
|
| static const char kEvictedOriginTimeSinceAccessHistogram[];
|
|
|
| - // These are kept non-const so that test code can change the value.
|
| + // 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_t kMinimumPreserveForSystem;
|
| static int64_t kSyncableStorageDefaultHostQuota;
|
|
|
| protected:
|
| @@ -304,11 +321,11 @@ class STORAGE_EXPORT QuotaManager
|
| friend struct QuotaManagerDeleter;
|
| friend class ::SiteEngagementEvictionPolicyWithQuotaManagerTest;
|
|
|
| + class EvictionRoundInfoHelper;
|
| + class UsageAndQuotaHelper;
|
| class GetUsageInfoTask;
|
| -
|
| class OriginDataDeleter;
|
| class HostDataDeleter;
|
| -
|
| class GetModifiedSinceHelper;
|
| class DumpQuotaTableHelper;
|
| class DumpOriginInfoTableHelper;
|
| @@ -320,8 +337,8 @@ class STORAGE_EXPORT QuotaManager
|
|
|
| // Function pointer type used to store the function which returns
|
| // information about the volume containing the given FilePath.
|
| - using GetVolumeInfoFn = bool(*)(const base::FilePath&,
|
| - uint64_t* available, uint64_t* total);
|
| + // The value returned is std::pair<total_space, available_space>.
|
| + using GetVolumeInfoFn = std::pair<int64_t,int64_t>(*)(const base::FilePath&);
|
|
|
| typedef base::Callback<void(const QuotaTableEntries&)>
|
| DumpQuotaTableCallback;
|
| @@ -329,23 +346,25 @@ class STORAGE_EXPORT QuotaManager
|
| DumpOriginInfoTableCallback;
|
|
|
| typedef CallbackQueue<base::Closure> ClosureQueue;
|
| - typedef CallbackQueue<AvailableSpaceCallback, QuotaStatusCode, int64_t>
|
| - AvailableSpaceCallbackQueue;
|
| typedef CallbackQueueMap<QuotaCallback, std::string, QuotaStatusCode, int64_t>
|
| HostQuotaCallbackMap;
|
| + using TemporaryConfigCallbackQueue =
|
| + CallbackQueue<TemporaryStorageConfigurationCallback,
|
| + const TemporaryStorageConfiguration&>;
|
| +
|
| + // The values returned total_space, available_space.
|
| + using StorageCapacityCallback = base::Callback<void(int64_t, int64_t)>;
|
| + using StorageCapacityCallbackQueue =
|
| + CallbackQueue<StorageCapacityCallback, int64_t, int64_t>;
|
|
|
| struct EvictionContext {
|
| EvictionContext();
|
| - virtual ~EvictionContext();
|
| + ~EvictionContext();
|
| GURL evicted_origin;
|
| StorageType evicted_type;
|
| -
|
| - EvictOriginDataCallback evict_origin_data_callback;
|
| + StatusCallback 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
|
| @@ -412,20 +431,13 @@ class STORAGE_EXPORT QuotaManager
|
| const GetOriginCallback& callback) override;
|
| void EvictOriginData(const GURL& origin,
|
| StorageType type,
|
| - const EvictOriginDataCallback& callback) override;
|
| - void GetUsageAndQuotaForEviction(
|
| - const UsageAndQuotaCallback& callback) override;
|
| - void AsyncGetVolumeInfo(const VolumeInfoCallback& callback) override;
|
| + const StatusCallback& callback) override;
|
| + void GetEvictionRoundInfo(
|
| + const EvictionRoundInfoCallback& callback) override;
|
|
|
| - void DidGetVolumeInfo(
|
| - const VolumeInfoCallback& callback,
|
| - uint64_t* available_space, uint64_t* total_space, bool success);
|
|
|
| void GetLRUOrigin(StorageType type, const GetOriginCallback& callback);
|
|
|
| - void DidSetTemporaryGlobalOverrideQuota(const QuotaCallback& callback,
|
| - const int64_t* new_quota,
|
| - bool success);
|
| void DidGetPersistentHostQuota(const std::string& host,
|
| const int64_t* quota,
|
| bool success);
|
| @@ -433,16 +445,20 @@ class STORAGE_EXPORT QuotaManager
|
| const QuotaCallback& callback,
|
| const int64_t* new_quota,
|
| bool success);
|
| - void DidInitialize(int64_t* temporary_quota_override,
|
| - int64_t* desired_available_space,
|
| - bool success);
|
| void DidGetLRUOrigin(const GURL* origin,
|
| bool success);
|
| - void DidGetInitialTemporaryGlobalQuota(base::TimeTicks start_ticks,
|
| - QuotaStatusCode status,
|
| - int64_t quota_unused);
|
| void DidInitializeTemporaryOriginsInfo(bool success);
|
| - void DidGetAvailableSpace(int64_t space);
|
| + void GetTemporaryStorageConfig(
|
| + const TemporaryStorageConfigurationCallback& callback);
|
| + void DidGetTemporaryStorageConfig(
|
| + const TemporaryStorageConfiguration& storage_config);
|
| + void GetDeviceStorageCapacity(
|
| + const StorageCapacityCallback& callback);
|
| + void ContinueIncognitoGetStorageCapacity(
|
| + const TemporaryStorageConfiguration& config);
|
| + void DidGetDeviceStorageCapacity(
|
| + const std::pair<int64_t, int64_t>& total_and_available);
|
| +
|
| void DidDatabaseWork(bool success);
|
|
|
| void DeleteOnCorrectThread() const;
|
| @@ -452,12 +468,10 @@ class STORAGE_EXPORT QuotaManager
|
| const base::Callback<bool(QuotaDatabase*)>& task,
|
| const base::Callback<void(bool)>& reply);
|
|
|
| - static int64_t CallGetAmountOfFreeDiskSpace(
|
| - GetVolumeInfoFn get_vol_info_fn,
|
| - const base::FilePath& profile_path);
|
| - static bool GetVolumeInfo(const base::FilePath& path,
|
| - uint64_t* available_space,
|
| - uint64_t* total_size);
|
| + static std::pair<int64_t, int64_t> CallGetVolumeInfo(
|
| + GetVolumeInfoFn get_volume_info_fn,
|
| + const base::FilePath& path);
|
| + static std::pair<int64_t,int64_t> GetVolumeInfo(const base::FilePath& path);
|
|
|
| const bool is_incognito_;
|
| const base::FilePath profile_path_;
|
| @@ -469,6 +483,13 @@ class STORAGE_EXPORT QuotaManager
|
| scoped_refptr<base::SequencedTaskRunner> db_thread_;
|
| mutable std::unique_ptr<QuotaDatabase> database_;
|
|
|
| + GetTemporaryStorageConfigurationFunc get_config_function_;
|
| + scoped_refptr<base::TaskRunner> get_config_task_runner_;
|
| + TemporaryStorageConfiguration storage_config_;
|
| + base::TimeTicks storage_config_timestamp_;
|
| + TemporaryConfigCallbackQueue storage_config_callbacks_;
|
| + StorageCapacityCallbackQueue storage_capacity_callbacks_;
|
| +
|
| GetOriginCallback lru_origin_callback_;
|
| std::set<GURL> access_notified_origins_;
|
|
|
| @@ -485,14 +506,8 @@ class STORAGE_EXPORT QuotaManager
|
| std::unique_ptr<QuotaEvictionPolicy> temporary_storage_eviction_policy_;
|
| bool is_getting_eviction_origin_;
|
|
|
| - ClosureQueue db_initialization_callbacks_;
|
| - AvailableSpaceCallbackQueue available_space_callbacks_;
|
| HostQuotaCallbackMap persistent_host_quota_callbacks_;
|
|
|
| - bool temporary_quota_initialized_;
|
| - int64_t temporary_quota_override_;
|
| - int64_t desired_available_space_;
|
| -
|
| // Map from origin to count.
|
| std::map<GURL, int> origins_in_use_;
|
| // Map from origin to error count.
|
|
|