| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "storage/browser/quota/quota_manager.h" | 5 #include "storage/browser/quota/quota_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <limits> |
| 9 | 10 |
| 10 #include "base/bind.h" | 11 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" |
| 12 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 13 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 14 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
| 15 #include "base/profiler/scoped_tracker.h" | 16 #include "base/profiler/scoped_tracker.h" |
| 16 #include "base/sequenced_task_runner.h" | 17 #include "base/sequenced_task_runner.h" |
| 17 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
| 18 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 30 | 31 |
| 31 #define UMA_HISTOGRAM_MBYTES(name, sample) \ | 32 #define UMA_HISTOGRAM_MBYTES(name, sample) \ |
| 32 UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 33 UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 33 (name), static_cast<int>((sample) / kMBytes), \ | 34 (name), static_cast<int>((sample) / kMBytes), \ |
| 34 1, 10 * 1024 * 1024 /* 10TB */, 100) | 35 1, 10 * 1024 * 1024 /* 10TB */, 100) |
| 35 | 36 |
| 36 namespace storage { | 37 namespace storage { |
| 37 | 38 |
| 38 namespace { | 39 namespace { |
| 39 | 40 |
| 40 const int64 kMBytes = 1024 * 1024; | 41 const int64_t kMBytes = 1024 * 1024; |
| 41 const int kMinutesInMilliSeconds = 60 * 1000; | 42 const int kMinutesInMilliSeconds = 60 * 1000; |
| 42 | 43 |
| 43 const int64 kReportHistogramInterval = 60 * 60 * 1000; // 1 hour | 44 const int64_t kReportHistogramInterval = 60 * 60 * 1000; // 1 hour |
| 44 const double kTemporaryQuotaRatioToAvail = 1.0 / 3.0; // 33% | 45 const double kTemporaryQuotaRatioToAvail = 1.0 / 3.0; // 33% |
| 45 | 46 |
| 46 } // namespace | 47 } // namespace |
| 47 | 48 |
| 48 // Arbitrary for now, but must be reasonably small so that | 49 // Arbitrary for now, but must be reasonably small so that |
| 49 // in-memory databases can fit. | 50 // in-memory databases can fit. |
| 50 // TODO(kinuko): Refer SysInfo::AmountOfPhysicalMemory() to determine this. | 51 // TODO(kinuko): Refer SysInfo::AmountOfPhysicalMemory() to determine this. |
| 51 const int64 QuotaManager::kIncognitoDefaultQuotaLimit = 100 * kMBytes; | 52 const int64_t QuotaManager::kIncognitoDefaultQuotaLimit = 100 * kMBytes; |
| 52 | 53 |
| 53 const int64 QuotaManager::kNoLimit = kint64max; | 54 const int64_t QuotaManager::kNoLimit = INT64_MAX; |
| 54 | 55 |
| 55 const int QuotaManager::kPerHostTemporaryPortion = 5; // 20% | 56 const int QuotaManager::kPerHostTemporaryPortion = 5; // 20% |
| 56 | 57 |
| 57 // Cap size for per-host persistent quota determined by the histogram. | 58 // Cap size for per-host persistent quota determined by the histogram. |
| 58 // This is a bit lax value because the histogram says nothing about per-host | 59 // This is a bit lax value because the histogram says nothing about per-host |
| 59 // persistent storage usage and we determined by global persistent storage | 60 // persistent storage usage and we determined by global persistent storage |
| 60 // usage that is less than 10GB for almost all users. | 61 // usage that is less than 10GB for almost all users. |
| 61 const int64 QuotaManager::kPerHostPersistentQuotaLimit = 10 * 1024 * kMBytes; | 62 const int64_t QuotaManager::kPerHostPersistentQuotaLimit = 10 * 1024 * kMBytes; |
| 62 | 63 |
| 63 const char QuotaManager::kDatabaseName[] = "QuotaManager"; | 64 const char QuotaManager::kDatabaseName[] = "QuotaManager"; |
| 64 | 65 |
| 65 const int QuotaManager::kThresholdOfErrorsToBeBlacklisted = 3; | 66 const int QuotaManager::kThresholdOfErrorsToBeBlacklisted = 3; |
| 66 | 67 |
| 67 // Preserve kMinimumPreserveForSystem disk space for system book-keeping | 68 // Preserve kMinimumPreserveForSystem disk space for system book-keeping |
| 68 // when returning the quota to unlimited apps/extensions. | 69 // when returning the quota to unlimited apps/extensions. |
| 69 // TODO(kinuko): This should be like 10% of the actual disk space. | 70 // TODO(kinuko): This should be like 10% of the actual disk space. |
| 70 // For now we simply use a constant as getting the disk size needs | 71 // For now we simply use a constant as getting the disk size needs |
| 71 // platform-dependent code. (http://crbug.com/178976) | 72 // platform-dependent code. (http://crbug.com/178976) |
| 72 int64 QuotaManager::kMinimumPreserveForSystem = 1024 * kMBytes; | 73 int64_t QuotaManager::kMinimumPreserveForSystem = 1024 * kMBytes; |
| 73 | 74 |
| 74 const int QuotaManager::kEvictionIntervalInMilliSeconds = | 75 const int QuotaManager::kEvictionIntervalInMilliSeconds = |
| 75 30 * kMinutesInMilliSeconds; | 76 30 * kMinutesInMilliSeconds; |
| 76 | 77 |
| 77 const char QuotaManager::kTimeBetweenRepeatedOriginEvictionsHistogram[] = | 78 const char QuotaManager::kTimeBetweenRepeatedOriginEvictionsHistogram[] = |
| 78 "Quota.TimeBetweenRepeatedOriginEvictions"; | 79 "Quota.TimeBetweenRepeatedOriginEvictions"; |
| 79 const char QuotaManager::kEvictedOriginAccessedCountHistogram[] = | 80 const char QuotaManager::kEvictedOriginAccessedCountHistogram[] = |
| 80 "Quota.EvictedOriginAccessCount"; | 81 "Quota.EvictedOriginAccessCount"; |
| 81 const char QuotaManager::kEvictedOriginTimeSinceAccessHistogram[] = | 82 const char QuotaManager::kEvictedOriginTimeSinceAccessHistogram[] = |
| 82 "Quota.EvictedOriginTimeSinceAccess"; | 83 "Quota.EvictedOriginTimeSinceAccess"; |
| 83 | 84 |
| 84 // Heuristics: assuming average cloud server allows a few Gigs storage | 85 // Heuristics: assuming average cloud server allows a few Gigs storage |
| 85 // on the server side and the storage needs to be shared for user data | 86 // on the server side and the storage needs to be shared for user data |
| 86 // and by multiple apps. | 87 // and by multiple apps. |
| 87 int64 QuotaManager::kSyncableStorageDefaultHostQuota = 500 * kMBytes; | 88 int64_t QuotaManager::kSyncableStorageDefaultHostQuota = 500 * kMBytes; |
| 88 | 89 |
| 89 namespace { | 90 namespace { |
| 90 | 91 |
| 91 void CountOriginType(const std::set<GURL>& origins, | 92 void CountOriginType(const std::set<GURL>& origins, |
| 92 SpecialStoragePolicy* policy, | 93 SpecialStoragePolicy* policy, |
| 93 size_t* protected_origins, | 94 size_t* protected_origins, |
| 94 size_t* unlimited_origins) { | 95 size_t* unlimited_origins) { |
| 95 DCHECK(protected_origins); | 96 DCHECK(protected_origins); |
| 96 DCHECK(unlimited_origins); | 97 DCHECK(unlimited_origins); |
| 97 *protected_origins = 0; | 98 *protected_origins = 0; |
| 98 *unlimited_origins = 0; | 99 *unlimited_origins = 0; |
| 99 if (!policy) | 100 if (!policy) |
| 100 return; | 101 return; |
| 101 for (std::set<GURL>::const_iterator itr = origins.begin(); | 102 for (std::set<GURL>::const_iterator itr = origins.begin(); |
| 102 itr != origins.end(); | 103 itr != origins.end(); |
| 103 ++itr) { | 104 ++itr) { |
| 104 if (policy->IsStorageProtected(*itr)) | 105 if (policy->IsStorageProtected(*itr)) |
| 105 ++*protected_origins; | 106 ++*protected_origins; |
| 106 if (policy->IsStorageUnlimited(*itr)) | 107 if (policy->IsStorageUnlimited(*itr)) |
| 107 ++*unlimited_origins; | 108 ++*unlimited_origins; |
| 108 } | 109 } |
| 109 } | 110 } |
| 110 | 111 |
| 111 bool SetTemporaryGlobalOverrideQuotaOnDBThread(int64* new_quota, | 112 bool SetTemporaryGlobalOverrideQuotaOnDBThread(int64_t* new_quota, |
| 112 QuotaDatabase* database) { | 113 QuotaDatabase* database) { |
| 113 DCHECK(database); | 114 DCHECK(database); |
| 114 if (!database->SetQuotaConfigValue( | 115 if (!database->SetQuotaConfigValue( |
| 115 QuotaDatabase::kTemporaryQuotaOverrideKey, *new_quota)) { | 116 QuotaDatabase::kTemporaryQuotaOverrideKey, *new_quota)) { |
| 116 *new_quota = -1; | 117 *new_quota = -1; |
| 117 return false; | 118 return false; |
| 118 } | 119 } |
| 119 return true; | 120 return true; |
| 120 } | 121 } |
| 121 | 122 |
| 122 bool GetPersistentHostQuotaOnDBThread(const std::string& host, | 123 bool GetPersistentHostQuotaOnDBThread(const std::string& host, |
| 123 int64* quota, | 124 int64_t* quota, |
| 124 QuotaDatabase* database) { | 125 QuotaDatabase* database) { |
| 125 DCHECK(database); | 126 DCHECK(database); |
| 126 database->GetHostQuota(host, kStorageTypePersistent, quota); | 127 database->GetHostQuota(host, kStorageTypePersistent, quota); |
| 127 return true; | 128 return true; |
| 128 } | 129 } |
| 129 | 130 |
| 130 bool SetPersistentHostQuotaOnDBThread(const std::string& host, | 131 bool SetPersistentHostQuotaOnDBThread(const std::string& host, |
| 131 int64* new_quota, | 132 int64_t* new_quota, |
| 132 QuotaDatabase* database) { | 133 QuotaDatabase* database) { |
| 133 DCHECK(database); | 134 DCHECK(database); |
| 134 if (database->SetHostQuota(host, kStorageTypePersistent, *new_quota)) | 135 if (database->SetHostQuota(host, kStorageTypePersistent, *new_quota)) |
| 135 return true; | 136 return true; |
| 136 *new_quota = 0; | 137 *new_quota = 0; |
| 137 return false; | 138 return false; |
| 138 } | 139 } |
| 139 | 140 |
| 140 bool InitializeOnDBThread(int64* temporary_quota_override, | 141 bool InitializeOnDBThread(int64_t* temporary_quota_override, |
| 141 int64* desired_available_space, | 142 int64_t* desired_available_space, |
| 142 QuotaDatabase* database) { | 143 QuotaDatabase* database) { |
| 143 DCHECK(database); | 144 DCHECK(database); |
| 144 database->GetQuotaConfigValue(QuotaDatabase::kTemporaryQuotaOverrideKey, | 145 database->GetQuotaConfigValue(QuotaDatabase::kTemporaryQuotaOverrideKey, |
| 145 temporary_quota_override); | 146 temporary_quota_override); |
| 146 database->GetQuotaConfigValue(QuotaDatabase::kDesiredAvailableSpaceKey, | 147 database->GetQuotaConfigValue(QuotaDatabase::kDesiredAvailableSpaceKey, |
| 147 desired_available_space); | 148 desired_available_space); |
| 148 return true; | 149 return true; |
| 149 } | 150 } |
| 150 | 151 |
| 151 bool GetLRUOriginOnDBThread(StorageType type, | 152 bool GetLRUOriginOnDBThread(StorageType type, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 } | 220 } |
| 220 | 221 |
| 221 bool UpdateModifiedTimeOnDBThread(const GURL& origin, | 222 bool UpdateModifiedTimeOnDBThread(const GURL& origin, |
| 222 StorageType type, | 223 StorageType type, |
| 223 base::Time modified_time, | 224 base::Time modified_time, |
| 224 QuotaDatabase* database) { | 225 QuotaDatabase* database) { |
| 225 DCHECK(database); | 226 DCHECK(database); |
| 226 return database->SetOriginLastModifiedTime(origin, type, modified_time); | 227 return database->SetOriginLastModifiedTime(origin, type, modified_time); |
| 227 } | 228 } |
| 228 | 229 |
| 229 int64 CallSystemGetAmountOfFreeDiskSpace(const base::FilePath& profile_path) { | 230 int64_t CallSystemGetAmountOfFreeDiskSpace(const base::FilePath& profile_path) { |
| 230 // crbug.com/349708 | 231 // crbug.com/349708 |
| 231 TRACE_EVENT0("io", "CallSystemGetAmountOfFreeDiskSpace"); | 232 TRACE_EVENT0("io", "CallSystemGetAmountOfFreeDiskSpace"); |
| 232 | 233 |
| 233 // Ensure the profile path exists. | 234 // Ensure the profile path exists. |
| 234 if (!base::CreateDirectory(profile_path)) { | 235 if (!base::CreateDirectory(profile_path)) { |
| 235 LOG(WARNING) << "Create directory failed for path" << profile_path.value(); | 236 LOG(WARNING) << "Create directory failed for path" << profile_path.value(); |
| 236 return 0; | 237 return 0; |
| 237 } | 238 } |
| 238 return base::SysInfo::AmountOfFreeDiskSpace(profile_path); | 239 return base::SysInfo::AmountOfFreeDiskSpace(profile_path); |
| 239 } | 240 } |
| 240 | 241 |
| 241 int64 CalculateTemporaryGlobalQuota(int64 global_limited_usage, | 242 int64_t CalculateTemporaryGlobalQuota(int64_t global_limited_usage, |
| 242 int64 available_space) { | 243 int64_t available_space) { |
| 243 DCHECK_GE(global_limited_usage, 0); | 244 DCHECK_GE(global_limited_usage, 0); |
| 244 int64 avail_space = available_space; | 245 int64_t avail_space = available_space; |
| 245 if (avail_space < kint64max - global_limited_usage) { | 246 if (avail_space < |
| 247 std::numeric_limits<int64_t>::max() - global_limited_usage) { |
| 246 // We basically calculate the temporary quota by | 248 // We basically calculate the temporary quota by |
| 247 // [available_space + space_used_for_temp] * kTempQuotaRatio, | 249 // [available_space + space_used_for_temp] * kTempQuotaRatio, |
| 248 // but make sure we'll have no overflow. | 250 // but make sure we'll have no overflow. |
| 249 avail_space += global_limited_usage; | 251 avail_space += global_limited_usage; |
| 250 } | 252 } |
| 251 return avail_space * kTemporaryQuotaRatioToAvail; | 253 return avail_space * kTemporaryQuotaRatioToAvail; |
| 252 } | 254 } |
| 253 | 255 |
| 254 void DispatchTemporaryGlobalQuotaCallback( | 256 void DispatchTemporaryGlobalQuotaCallback( |
| 255 const QuotaCallback& callback, | 257 const QuotaCallback& callback, |
| 256 QuotaStatusCode status, | 258 QuotaStatusCode status, |
| 257 const UsageAndQuota& usage_and_quota) { | 259 const UsageAndQuota& usage_and_quota) { |
| 258 if (status != kQuotaStatusOk) { | 260 if (status != kQuotaStatusOk) { |
| 259 callback.Run(status, 0); | 261 callback.Run(status, 0); |
| 260 return; | 262 return; |
| 261 } | 263 } |
| 262 | 264 |
| 263 callback.Run(status, CalculateTemporaryGlobalQuota( | 265 callback.Run(status, CalculateTemporaryGlobalQuota( |
| 264 usage_and_quota.global_limited_usage, | 266 usage_and_quota.global_limited_usage, |
| 265 usage_and_quota.available_disk_space)); | 267 usage_and_quota.available_disk_space)); |
| 266 } | 268 } |
| 267 | 269 |
| 268 int64 CalculateQuotaWithDiskSpace( | 270 int64_t CalculateQuotaWithDiskSpace(int64_t available_disk_space, |
| 269 int64 available_disk_space, int64 usage, int64 quota) { | 271 int64_t usage, |
| 272 int64_t quota) { |
| 270 if (available_disk_space < QuotaManager::kMinimumPreserveForSystem) { | 273 if (available_disk_space < QuotaManager::kMinimumPreserveForSystem) { |
| 271 LOG(WARNING) | 274 LOG(WARNING) |
| 272 << "Running out of disk space for profile." | 275 << "Running out of disk space for profile." |
| 273 << " QuotaManager starts forbidding further quota consumption."; | 276 << " QuotaManager starts forbidding further quota consumption."; |
| 274 return usage; | 277 return usage; |
| 275 } | 278 } |
| 276 | 279 |
| 277 if (quota < usage) { | 280 if (quota < usage) { |
| 278 // No more space; cap the quota to the current usage. | 281 // No more space; cap the quota to the current usage. |
| 279 return usage; | 282 return usage; |
| 280 } | 283 } |
| 281 | 284 |
| 282 available_disk_space -= QuotaManager::kMinimumPreserveForSystem; | 285 available_disk_space -= QuotaManager::kMinimumPreserveForSystem; |
| 283 if (available_disk_space < quota - usage) | 286 if (available_disk_space < quota - usage) |
| 284 return available_disk_space + usage; | 287 return available_disk_space + usage; |
| 285 | 288 |
| 286 return quota; | 289 return quota; |
| 287 } | 290 } |
| 288 | 291 |
| 289 int64 CalculateTemporaryHostQuota(int64 host_usage, | 292 int64_t CalculateTemporaryHostQuota(int64_t host_usage, |
| 290 int64 global_quota, | 293 int64_t global_quota, |
| 291 int64 global_limited_usage) { | 294 int64_t global_limited_usage) { |
| 292 DCHECK_GE(global_limited_usage, 0); | 295 DCHECK_GE(global_limited_usage, 0); |
| 293 int64 host_quota = global_quota / QuotaManager::kPerHostTemporaryPortion; | 296 int64_t host_quota = global_quota / QuotaManager::kPerHostTemporaryPortion; |
| 294 if (global_limited_usage > global_quota) | 297 if (global_limited_usage > global_quota) |
| 295 host_quota = std::min(host_quota, host_usage); | 298 host_quota = std::min(host_quota, host_usage); |
| 296 return host_quota; | 299 return host_quota; |
| 297 } | 300 } |
| 298 | 301 |
| 299 void DispatchUsageAndQuotaForWebApps( | 302 void DispatchUsageAndQuotaForWebApps( |
| 300 StorageType type, | 303 StorageType type, |
| 301 bool is_incognito, | 304 bool is_incognito, |
| 302 bool is_unlimited, | 305 bool is_unlimited, |
| 303 bool can_query_disk_size, | 306 bool can_query_disk_size, |
| 304 const QuotaManager::GetUsageAndQuotaCallback& callback, | 307 const QuotaManager::GetUsageAndQuotaCallback& callback, |
| 305 QuotaStatusCode status, | 308 QuotaStatusCode status, |
| 306 const UsageAndQuota& usage_and_quota) { | 309 const UsageAndQuota& usage_and_quota) { |
| 307 if (status != kQuotaStatusOk) { | 310 if (status != kQuotaStatusOk) { |
| 308 callback.Run(status, 0, 0); | 311 callback.Run(status, 0, 0); |
| 309 return; | 312 return; |
| 310 } | 313 } |
| 311 | 314 |
| 312 int64 usage = usage_and_quota.usage; | 315 int64_t usage = usage_and_quota.usage; |
| 313 int64 quota = usage_and_quota.quota; | 316 int64_t quota = usage_and_quota.quota; |
| 314 | 317 |
| 315 if (type == kStorageTypeTemporary && !is_unlimited) { | 318 if (type == kStorageTypeTemporary && !is_unlimited) { |
| 316 quota = CalculateTemporaryHostQuota( | 319 quota = CalculateTemporaryHostQuota( |
| 317 usage, quota, usage_and_quota.global_limited_usage); | 320 usage, quota, usage_and_quota.global_limited_usage); |
| 318 } | 321 } |
| 319 | 322 |
| 320 if (is_incognito) { | 323 if (is_incognito) { |
| 321 quota = std::min(quota, QuotaManager::kIncognitoDefaultQuotaLimit); | 324 quota = std::min(quota, QuotaManager::kIncognitoDefaultQuotaLimit); |
| 322 callback.Run(status, usage, quota); | 325 callback.Run(status, usage, quota); |
| 323 return; | 326 return; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 341 | 344 |
| 342 } // namespace | 345 } // namespace |
| 343 | 346 |
| 344 UsageAndQuota::UsageAndQuota() | 347 UsageAndQuota::UsageAndQuota() |
| 345 : usage(0), | 348 : usage(0), |
| 346 global_limited_usage(0), | 349 global_limited_usage(0), |
| 347 quota(0), | 350 quota(0), |
| 348 available_disk_space(0) { | 351 available_disk_space(0) { |
| 349 } | 352 } |
| 350 | 353 |
| 351 UsageAndQuota::UsageAndQuota( | 354 UsageAndQuota::UsageAndQuota(int64_t usage, |
| 352 int64 usage, | 355 int64_t global_limited_usage, |
| 353 int64 global_limited_usage, | 356 int64_t quota, |
| 354 int64 quota, | 357 int64_t available_disk_space) |
| 355 int64 available_disk_space) | |
| 356 : usage(usage), | 358 : usage(usage), |
| 357 global_limited_usage(global_limited_usage), | 359 global_limited_usage(global_limited_usage), |
| 358 quota(quota), | 360 quota(quota), |
| 359 available_disk_space(available_disk_space) { | 361 available_disk_space(available_disk_space) {} |
| 360 } | |
| 361 | 362 |
| 362 class UsageAndQuotaCallbackDispatcher | 363 class UsageAndQuotaCallbackDispatcher |
| 363 : public QuotaTask, | 364 : public QuotaTask, |
| 364 public base::SupportsWeakPtr<UsageAndQuotaCallbackDispatcher> { | 365 public base::SupportsWeakPtr<UsageAndQuotaCallbackDispatcher> { |
| 365 public: | 366 public: |
| 366 explicit UsageAndQuotaCallbackDispatcher(QuotaManager* manager) | 367 explicit UsageAndQuotaCallbackDispatcher(QuotaManager* manager) |
| 367 : QuotaTask(manager), | 368 : QuotaTask(manager), |
| 368 has_usage_(false), | 369 has_usage_(false), |
| 369 has_global_limited_usage_(false), | 370 has_global_limited_usage_(false), |
| 370 has_quota_(false), | 371 has_quota_(false), |
| 371 has_available_disk_space_(false), | 372 has_available_disk_space_(false), |
| 372 status_(kQuotaStatusUnknown), | 373 status_(kQuotaStatusUnknown), |
| 373 usage_and_quota_(-1, -1, -1, -1), | 374 usage_and_quota_(-1, -1, -1, -1), |
| 374 waiting_callbacks_(1) {} | 375 waiting_callbacks_(1) {} |
| 375 | 376 |
| 376 ~UsageAndQuotaCallbackDispatcher() override {} | 377 ~UsageAndQuotaCallbackDispatcher() override {} |
| 377 | 378 |
| 378 void WaitForResults(const QuotaManager::UsageAndQuotaCallback& callback) { | 379 void WaitForResults(const QuotaManager::UsageAndQuotaCallback& callback) { |
| 379 callback_ = callback; | 380 callback_ = callback; |
| 380 Start(); | 381 Start(); |
| 381 } | 382 } |
| 382 | 383 |
| 383 void set_usage(int64 usage) { | 384 void set_usage(int64_t usage) { |
| 384 usage_and_quota_.usage = usage; | 385 usage_and_quota_.usage = usage; |
| 385 has_usage_ = true; | 386 has_usage_ = true; |
| 386 } | 387 } |
| 387 | 388 |
| 388 void set_global_limited_usage(int64 global_limited_usage) { | 389 void set_global_limited_usage(int64_t global_limited_usage) { |
| 389 usage_and_quota_.global_limited_usage = global_limited_usage; | 390 usage_and_quota_.global_limited_usage = global_limited_usage; |
| 390 has_global_limited_usage_ = true; | 391 has_global_limited_usage_ = true; |
| 391 } | 392 } |
| 392 | 393 |
| 393 void set_quota(int64 quota) { | 394 void set_quota(int64_t quota) { |
| 394 usage_and_quota_.quota = quota; | 395 usage_and_quota_.quota = quota; |
| 395 has_quota_ = true; | 396 has_quota_ = true; |
| 396 } | 397 } |
| 397 | 398 |
| 398 void set_available_disk_space(int64 available_disk_space) { | 399 void set_available_disk_space(int64_t available_disk_space) { |
| 399 usage_and_quota_.available_disk_space = available_disk_space; | 400 usage_and_quota_.available_disk_space = available_disk_space; |
| 400 has_available_disk_space_ = true; | 401 has_available_disk_space_ = true; |
| 401 } | 402 } |
| 402 | 403 |
| 403 UsageCallback GetHostUsageCallback() { | 404 UsageCallback GetHostUsageCallback() { |
| 404 ++waiting_callbacks_; | 405 ++waiting_callbacks_; |
| 405 has_usage_ = true; | 406 has_usage_ = true; |
| 406 return base::Bind(&UsageAndQuotaCallbackDispatcher::DidGetHostUsage, | 407 return base::Bind(&UsageAndQuotaCallbackDispatcher::DidGetHostUsage, |
| 407 AsWeakPtr()); | 408 AsWeakPtr()); |
| 408 } | 409 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 423 } | 424 } |
| 424 | 425 |
| 425 QuotaCallback GetAvailableSpaceCallback() { | 426 QuotaCallback GetAvailableSpaceCallback() { |
| 426 ++waiting_callbacks_; | 427 ++waiting_callbacks_; |
| 427 has_available_disk_space_ = true; | 428 has_available_disk_space_ = true; |
| 428 return base::Bind(&UsageAndQuotaCallbackDispatcher::DidGetAvailableSpace, | 429 return base::Bind(&UsageAndQuotaCallbackDispatcher::DidGetAvailableSpace, |
| 429 AsWeakPtr()); | 430 AsWeakPtr()); |
| 430 } | 431 } |
| 431 | 432 |
| 432 private: | 433 private: |
| 433 void DidGetHostUsage(int64 usage) { | 434 void DidGetHostUsage(int64_t usage) { |
| 434 if (status_ == kQuotaStatusUnknown) | 435 if (status_ == kQuotaStatusUnknown) |
| 435 status_ = kQuotaStatusOk; | 436 status_ = kQuotaStatusOk; |
| 436 usage_and_quota_.usage = usage; | 437 usage_and_quota_.usage = usage; |
| 437 CheckCompleted(); | 438 CheckCompleted(); |
| 438 } | 439 } |
| 439 | 440 |
| 440 void DidGetGlobalLimitedUsage(int64 limited_usage) { | 441 void DidGetGlobalLimitedUsage(int64_t limited_usage) { |
| 441 if (status_ == kQuotaStatusUnknown) | 442 if (status_ == kQuotaStatusUnknown) |
| 442 status_ = kQuotaStatusOk; | 443 status_ = kQuotaStatusOk; |
| 443 usage_and_quota_.global_limited_usage = limited_usage; | 444 usage_and_quota_.global_limited_usage = limited_usage; |
| 444 CheckCompleted(); | 445 CheckCompleted(); |
| 445 } | 446 } |
| 446 | 447 |
| 447 void DidGetQuota(QuotaStatusCode status, int64 quota) { | 448 void DidGetQuota(QuotaStatusCode status, int64_t quota) { |
| 448 if (status_ == kQuotaStatusUnknown || status_ == kQuotaStatusOk) | 449 if (status_ == kQuotaStatusUnknown || status_ == kQuotaStatusOk) |
| 449 status_ = status; | 450 status_ = status; |
| 450 usage_and_quota_.quota = quota; | 451 usage_and_quota_.quota = quota; |
| 451 CheckCompleted(); | 452 CheckCompleted(); |
| 452 } | 453 } |
| 453 | 454 |
| 454 void DidGetAvailableSpace(QuotaStatusCode status, int64 space) { | 455 void DidGetAvailableSpace(QuotaStatusCode status, int64_t space) { |
| 455 // crbug.com/349708 | 456 // crbug.com/349708 |
| 456 TRACE_EVENT0( | 457 TRACE_EVENT0( |
| 457 "io", "UsageAndQuotaCallbackDispatcher::DidGetAvailableSpace"); | 458 "io", "UsageAndQuotaCallbackDispatcher::DidGetAvailableSpace"); |
| 458 | 459 |
| 459 DCHECK_GE(space, 0); | 460 DCHECK_GE(space, 0); |
| 460 if (status_ == kQuotaStatusUnknown || status_ == kQuotaStatusOk) | 461 if (status_ == kQuotaStatusUnknown || status_ == kQuotaStatusOk) |
| 461 status_ = status; | 462 status_ = status; |
| 462 usage_and_quota_.available_disk_space = space; | 463 usage_and_quota_.available_disk_space = space; |
| 463 CheckCompleted(); | 464 CheckCompleted(); |
| 464 } | 465 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 DeleteSoon(); | 549 DeleteSoon(); |
| 549 } | 550 } |
| 550 | 551 |
| 551 void Aborted() override { | 552 void Aborted() override { |
| 552 callback_.Run(UsageInfoEntries()); | 553 callback_.Run(UsageInfoEntries()); |
| 553 DeleteSoon(); | 554 DeleteSoon(); |
| 554 } | 555 } |
| 555 | 556 |
| 556 private: | 557 private: |
| 557 void AddEntries(StorageType type, UsageTracker* tracker) { | 558 void AddEntries(StorageType type, UsageTracker* tracker) { |
| 558 std::map<std::string, int64> host_usage; | 559 std::map<std::string, int64_t> host_usage; |
| 559 tracker->GetCachedHostsUsage(&host_usage); | 560 tracker->GetCachedHostsUsage(&host_usage); |
| 560 for (std::map<std::string, int64>::const_iterator iter = host_usage.begin(); | 561 for (std::map<std::string, int64_t>::const_iterator iter = |
| 561 iter != host_usage.end(); | 562 host_usage.begin(); |
| 562 ++iter) { | 563 iter != host_usage.end(); ++iter) { |
| 563 entries_.push_back(UsageInfo(iter->first, type, iter->second)); | 564 entries_.push_back(UsageInfo(iter->first, type, iter->second)); |
| 564 } | 565 } |
| 565 if (--remaining_trackers_ == 0) | 566 if (--remaining_trackers_ == 0) |
| 566 CallCompleted(); | 567 CallCompleted(); |
| 567 } | 568 } |
| 568 | 569 |
| 569 void DidGetGlobalUsage(StorageType type, int64, int64) { | 570 void DidGetGlobalUsage(StorageType type, int64_t, int64_t) { |
| 570 DCHECK(manager()->GetUsageTracker(type)); | 571 DCHECK(manager()->GetUsageTracker(type)); |
| 571 AddEntries(type, manager()->GetUsageTracker(type)); | 572 AddEntries(type, manager()->GetUsageTracker(type)); |
| 572 } | 573 } |
| 573 | 574 |
| 574 QuotaManager* manager() const { | 575 QuotaManager* manager() const { |
| 575 return static_cast<QuotaManager*>(observer()); | 576 return static_cast<QuotaManager*>(observer()); |
| 576 } | 577 } |
| 577 | 578 |
| 578 GetUsageInfoCallback callback_; | 579 GetUsageInfoCallback callback_; |
| 579 UsageInfoEntries entries_; | 580 UsageInfoEntries entries_; |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 GetUsageAndQuotaForWebApps(origin, type, callback); | 958 GetUsageAndQuotaForWebApps(origin, type, callback); |
| 958 } | 959 } |
| 959 | 960 |
| 960 void QuotaManager::NotifyStorageAccessed( | 961 void QuotaManager::NotifyStorageAccessed( |
| 961 QuotaClient::ID client_id, | 962 QuotaClient::ID client_id, |
| 962 const GURL& origin, StorageType type) { | 963 const GURL& origin, StorageType type) { |
| 963 DCHECK(origin == origin.GetOrigin()); | 964 DCHECK(origin == origin.GetOrigin()); |
| 964 NotifyStorageAccessedInternal(client_id, origin, type, base::Time::Now()); | 965 NotifyStorageAccessedInternal(client_id, origin, type, base::Time::Now()); |
| 965 } | 966 } |
| 966 | 967 |
| 967 void QuotaManager::NotifyStorageModified( | 968 void QuotaManager::NotifyStorageModified(QuotaClient::ID client_id, |
| 968 QuotaClient::ID client_id, | 969 const GURL& origin, |
| 969 const GURL& origin, StorageType type, int64 delta) { | 970 StorageType type, |
| 971 int64_t delta) { |
| 970 DCHECK(origin == origin.GetOrigin()); | 972 DCHECK(origin == origin.GetOrigin()); |
| 971 NotifyStorageModifiedInternal(client_id, origin, type, delta, | 973 NotifyStorageModifiedInternal(client_id, origin, type, delta, |
| 972 base::Time::Now()); | 974 base::Time::Now()); |
| 973 } | 975 } |
| 974 | 976 |
| 975 void QuotaManager::NotifyOriginInUse(const GURL& origin) { | 977 void QuotaManager::NotifyOriginInUse(const GURL& origin) { |
| 976 DCHECK(io_thread_->BelongsToCurrentThread()); | 978 DCHECK(io_thread_->BelongsToCurrentThread()); |
| 977 origins_in_use_[origin]++; | 979 origins_in_use_[origin]++; |
| 978 } | 980 } |
| 979 | 981 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1052 UsageAndQuotaCallbackDispatcher* dispatcher = | 1054 UsageAndQuotaCallbackDispatcher* dispatcher = |
| 1053 new UsageAndQuotaCallbackDispatcher(this); | 1055 new UsageAndQuotaCallbackDispatcher(this); |
| 1054 GetUsageTracker(kStorageTypeTemporary)-> | 1056 GetUsageTracker(kStorageTypeTemporary)-> |
| 1055 GetGlobalLimitedUsage(dispatcher->GetGlobalLimitedUsageCallback()); | 1057 GetGlobalLimitedUsage(dispatcher->GetGlobalLimitedUsageCallback()); |
| 1056 GetAvailableSpace(dispatcher->GetAvailableSpaceCallback()); | 1058 GetAvailableSpace(dispatcher->GetAvailableSpaceCallback()); |
| 1057 dispatcher->WaitForResults( | 1059 dispatcher->WaitForResults( |
| 1058 base::Bind(&DispatchTemporaryGlobalQuotaCallback, callback)); | 1060 base::Bind(&DispatchTemporaryGlobalQuotaCallback, callback)); |
| 1059 } | 1061 } |
| 1060 | 1062 |
| 1061 void QuotaManager::SetTemporaryGlobalOverrideQuota( | 1063 void QuotaManager::SetTemporaryGlobalOverrideQuota( |
| 1062 int64 new_quota, const QuotaCallback& callback) { | 1064 int64_t new_quota, |
| 1065 const QuotaCallback& callback) { |
| 1063 LazyInitialize(); | 1066 LazyInitialize(); |
| 1064 | 1067 |
| 1065 if (new_quota < 0) { | 1068 if (new_quota < 0) { |
| 1066 if (!callback.is_null()) | 1069 if (!callback.is_null()) |
| 1067 callback.Run(kQuotaErrorInvalidModification, -1); | 1070 callback.Run(kQuotaErrorInvalidModification, -1); |
| 1068 return; | 1071 return; |
| 1069 } | 1072 } |
| 1070 | 1073 |
| 1071 if (db_disabled_) { | 1074 if (db_disabled_) { |
| 1072 if (!callback.is_null()) | 1075 if (!callback.is_null()) |
| 1073 callback.Run(kQuotaErrorInvalidAccess, -1); | 1076 callback.Run(kQuotaErrorInvalidAccess, -1); |
| 1074 return; | 1077 return; |
| 1075 } | 1078 } |
| 1076 | 1079 |
| 1077 int64* new_quota_ptr = new int64(new_quota); | 1080 int64_t* new_quota_ptr = new int64_t(new_quota); |
| 1078 PostTaskAndReplyWithResultForDBThread( | 1081 PostTaskAndReplyWithResultForDBThread( |
| 1079 FROM_HERE, | 1082 FROM_HERE, |
| 1080 base::Bind(&SetTemporaryGlobalOverrideQuotaOnDBThread, | 1083 base::Bind(&SetTemporaryGlobalOverrideQuotaOnDBThread, |
| 1081 base::Unretained(new_quota_ptr)), | 1084 base::Unretained(new_quota_ptr)), |
| 1082 base::Bind(&QuotaManager::DidSetTemporaryGlobalOverrideQuota, | 1085 base::Bind(&QuotaManager::DidSetTemporaryGlobalOverrideQuota, |
| 1083 weak_factory_.GetWeakPtr(), | 1086 weak_factory_.GetWeakPtr(), |
| 1084 callback, | 1087 callback, |
| 1085 base::Owned(new_quota_ptr))); | 1088 base::Owned(new_quota_ptr))); |
| 1086 } | 1089 } |
| 1087 | 1090 |
| 1088 void QuotaManager::GetPersistentHostQuota(const std::string& host, | 1091 void QuotaManager::GetPersistentHostQuota(const std::string& host, |
| 1089 const QuotaCallback& callback) { | 1092 const QuotaCallback& callback) { |
| 1090 LazyInitialize(); | 1093 LazyInitialize(); |
| 1091 if (host.empty()) { | 1094 if (host.empty()) { |
| 1092 // This could happen if we are called on file:///. | 1095 // This could happen if we are called on file:///. |
| 1093 // TODO(kinuko) We may want to respect --allow-file-access-from-files | 1096 // TODO(kinuko) We may want to respect --allow-file-access-from-files |
| 1094 // command line switch. | 1097 // command line switch. |
| 1095 callback.Run(kQuotaStatusOk, 0); | 1098 callback.Run(kQuotaStatusOk, 0); |
| 1096 return; | 1099 return; |
| 1097 } | 1100 } |
| 1098 | 1101 |
| 1099 if (!persistent_host_quota_callbacks_.Add(host, callback)) | 1102 if (!persistent_host_quota_callbacks_.Add(host, callback)) |
| 1100 return; | 1103 return; |
| 1101 | 1104 |
| 1102 int64* quota_ptr = new int64(0); | 1105 int64_t* quota_ptr = new int64_t(0); |
| 1103 PostTaskAndReplyWithResultForDBThread( | 1106 PostTaskAndReplyWithResultForDBThread( |
| 1104 FROM_HERE, | 1107 FROM_HERE, |
| 1105 base::Bind(&GetPersistentHostQuotaOnDBThread, | 1108 base::Bind(&GetPersistentHostQuotaOnDBThread, |
| 1106 host, | 1109 host, |
| 1107 base::Unretained(quota_ptr)), | 1110 base::Unretained(quota_ptr)), |
| 1108 base::Bind(&QuotaManager::DidGetPersistentHostQuota, | 1111 base::Bind(&QuotaManager::DidGetPersistentHostQuota, |
| 1109 weak_factory_.GetWeakPtr(), | 1112 weak_factory_.GetWeakPtr(), |
| 1110 host, | 1113 host, |
| 1111 base::Owned(quota_ptr))); | 1114 base::Owned(quota_ptr))); |
| 1112 } | 1115 } |
| 1113 | 1116 |
| 1114 void QuotaManager::SetPersistentHostQuota(const std::string& host, | 1117 void QuotaManager::SetPersistentHostQuota(const std::string& host, |
| 1115 int64 new_quota, | 1118 int64_t new_quota, |
| 1116 const QuotaCallback& callback) { | 1119 const QuotaCallback& callback) { |
| 1117 LazyInitialize(); | 1120 LazyInitialize(); |
| 1118 if (host.empty()) { | 1121 if (host.empty()) { |
| 1119 // This could happen if we are called on file:///. | 1122 // This could happen if we are called on file:///. |
| 1120 callback.Run(kQuotaErrorNotSupported, 0); | 1123 callback.Run(kQuotaErrorNotSupported, 0); |
| 1121 return; | 1124 return; |
| 1122 } | 1125 } |
| 1123 | 1126 |
| 1124 if (new_quota < 0) { | 1127 if (new_quota < 0) { |
| 1125 callback.Run(kQuotaErrorInvalidModification, -1); | 1128 callback.Run(kQuotaErrorInvalidModification, -1); |
| 1126 return; | 1129 return; |
| 1127 } | 1130 } |
| 1128 | 1131 |
| 1129 if (kPerHostPersistentQuotaLimit < new_quota) { | 1132 if (kPerHostPersistentQuotaLimit < new_quota) { |
| 1130 // Cap the requested size at the per-host quota limit. | 1133 // Cap the requested size at the per-host quota limit. |
| 1131 new_quota = kPerHostPersistentQuotaLimit; | 1134 new_quota = kPerHostPersistentQuotaLimit; |
| 1132 } | 1135 } |
| 1133 | 1136 |
| 1134 if (db_disabled_) { | 1137 if (db_disabled_) { |
| 1135 callback.Run(kQuotaErrorInvalidAccess, -1); | 1138 callback.Run(kQuotaErrorInvalidAccess, -1); |
| 1136 return; | 1139 return; |
| 1137 } | 1140 } |
| 1138 | 1141 |
| 1139 int64* new_quota_ptr = new int64(new_quota); | 1142 int64_t* new_quota_ptr = new int64_t(new_quota); |
| 1140 PostTaskAndReplyWithResultForDBThread( | 1143 PostTaskAndReplyWithResultForDBThread( |
| 1141 FROM_HERE, | 1144 FROM_HERE, |
| 1142 base::Bind(&SetPersistentHostQuotaOnDBThread, | 1145 base::Bind(&SetPersistentHostQuotaOnDBThread, |
| 1143 host, | 1146 host, |
| 1144 base::Unretained(new_quota_ptr)), | 1147 base::Unretained(new_quota_ptr)), |
| 1145 base::Bind(&QuotaManager::DidSetPersistentHostQuota, | 1148 base::Bind(&QuotaManager::DidSetPersistentHostQuota, |
| 1146 weak_factory_.GetWeakPtr(), | 1149 weak_factory_.GetWeakPtr(), |
| 1147 host, | 1150 host, |
| 1148 callback, | 1151 callback, |
| 1149 base::Owned(new_quota_ptr))); | 1152 base::Owned(new_quota_ptr))); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1182 bool QuotaManager::IsTrackingHostUsage(StorageType type, | 1185 bool QuotaManager::IsTrackingHostUsage(StorageType type, |
| 1183 QuotaClient::ID client_id) const { | 1186 QuotaClient::ID client_id) const { |
| 1184 UsageTracker* tracker = GetUsageTracker(type); | 1187 UsageTracker* tracker = GetUsageTracker(type); |
| 1185 return tracker && tracker->GetClientTracker(client_id); | 1188 return tracker && tracker->GetClientTracker(client_id); |
| 1186 } | 1189 } |
| 1187 | 1190 |
| 1188 void QuotaManager::GetStatistics( | 1191 void QuotaManager::GetStatistics( |
| 1189 std::map<std::string, std::string>* statistics) { | 1192 std::map<std::string, std::string>* statistics) { |
| 1190 DCHECK(statistics); | 1193 DCHECK(statistics); |
| 1191 if (temporary_storage_evictor_) { | 1194 if (temporary_storage_evictor_) { |
| 1192 std::map<std::string, int64> stats; | 1195 std::map<std::string, int64_t> stats; |
| 1193 temporary_storage_evictor_->GetStatistics(&stats); | 1196 temporary_storage_evictor_->GetStatistics(&stats); |
| 1194 for (std::map<std::string, int64>::iterator p = stats.begin(); | 1197 for (std::map<std::string, int64_t>::iterator p = stats.begin(); |
| 1195 p != stats.end(); | 1198 p != stats.end(); ++p) { |
| 1196 ++p) | |
| 1197 (*statistics)[p->first] = base::Int64ToString(p->second); | 1199 (*statistics)[p->first] = base::Int64ToString(p->second); |
| 1200 } |
| 1198 } | 1201 } |
| 1199 } | 1202 } |
| 1200 | 1203 |
| 1201 bool QuotaManager::IsStorageUnlimited(const GURL& origin, | 1204 bool QuotaManager::IsStorageUnlimited(const GURL& origin, |
| 1202 StorageType type) const { | 1205 StorageType type) const { |
| 1203 // For syncable storage we should always enforce quota (since the | 1206 // For syncable storage we should always enforce quota (since the |
| 1204 // quota must be capped by the server limit). | 1207 // quota must be capped by the server limit). |
| 1205 if (type == kStorageTypeSyncable) | 1208 if (type == kStorageTypeSyncable) |
| 1206 return false; | 1209 return false; |
| 1207 if (type == kStorageTypeQuotaNotManaged) | 1210 if (type == kStorageTypeQuotaNotManaged) |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 temporary_usage_tracker_.reset(new UsageTracker( | 1303 temporary_usage_tracker_.reset(new UsageTracker( |
| 1301 clients_, kStorageTypeTemporary, special_storage_policy_.get(), | 1304 clients_, kStorageTypeTemporary, special_storage_policy_.get(), |
| 1302 storage_monitor_.get())); | 1305 storage_monitor_.get())); |
| 1303 persistent_usage_tracker_.reset(new UsageTracker( | 1306 persistent_usage_tracker_.reset(new UsageTracker( |
| 1304 clients_, kStorageTypePersistent, special_storage_policy_.get(), | 1307 clients_, kStorageTypePersistent, special_storage_policy_.get(), |
| 1305 storage_monitor_.get())); | 1308 storage_monitor_.get())); |
| 1306 syncable_usage_tracker_.reset(new UsageTracker( | 1309 syncable_usage_tracker_.reset(new UsageTracker( |
| 1307 clients_, kStorageTypeSyncable, special_storage_policy_.get(), | 1310 clients_, kStorageTypeSyncable, special_storage_policy_.get(), |
| 1308 storage_monitor_.get())); | 1311 storage_monitor_.get())); |
| 1309 | 1312 |
| 1310 int64* temporary_quota_override = new int64(-1); | 1313 int64_t* temporary_quota_override = new int64_t(-1); |
| 1311 int64* desired_available_space = new int64(-1); | 1314 int64_t* desired_available_space = new int64_t(-1); |
| 1312 PostTaskAndReplyWithResultForDBThread( | 1315 PostTaskAndReplyWithResultForDBThread( |
| 1313 FROM_HERE, | 1316 FROM_HERE, |
| 1314 base::Bind(&InitializeOnDBThread, | 1317 base::Bind(&InitializeOnDBThread, |
| 1315 base::Unretained(temporary_quota_override), | 1318 base::Unretained(temporary_quota_override), |
| 1316 base::Unretained(desired_available_space)), | 1319 base::Unretained(desired_available_space)), |
| 1317 base::Bind(&QuotaManager::DidInitialize, | 1320 base::Bind(&QuotaManager::DidInitialize, |
| 1318 weak_factory_.GetWeakPtr(), | 1321 weak_factory_.GetWeakPtr(), |
| 1319 base::Owned(temporary_quota_override), | 1322 base::Owned(temporary_quota_override), |
| 1320 base::Owned(desired_available_space))); | 1323 base::Owned(desired_available_space))); |
| 1321 } | 1324 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1362 | 1365 |
| 1363 if (db_disabled_) | 1366 if (db_disabled_) |
| 1364 return; | 1367 return; |
| 1365 PostTaskAndReplyWithResultForDBThread( | 1368 PostTaskAndReplyWithResultForDBThread( |
| 1366 FROM_HERE, | 1369 FROM_HERE, |
| 1367 base::Bind(&UpdateAccessTimeOnDBThread, origin, type, accessed_time), | 1370 base::Bind(&UpdateAccessTimeOnDBThread, origin, type, accessed_time), |
| 1368 base::Bind(&QuotaManager::DidDatabaseWork, | 1371 base::Bind(&QuotaManager::DidDatabaseWork, |
| 1369 weak_factory_.GetWeakPtr())); | 1372 weak_factory_.GetWeakPtr())); |
| 1370 } | 1373 } |
| 1371 | 1374 |
| 1372 void QuotaManager::NotifyStorageModifiedInternal( | 1375 void QuotaManager::NotifyStorageModifiedInternal(QuotaClient::ID client_id, |
| 1373 QuotaClient::ID client_id, | 1376 const GURL& origin, |
| 1374 const GURL& origin, | 1377 StorageType type, |
| 1375 StorageType type, | 1378 int64_t delta, |
| 1376 int64 delta, | 1379 base::Time modified_time) { |
| 1377 base::Time modified_time) { | |
| 1378 LazyInitialize(); | 1380 LazyInitialize(); |
| 1379 DCHECK(GetUsageTracker(type)); | 1381 DCHECK(GetUsageTracker(type)); |
| 1380 GetUsageTracker(type)->UpdateUsageCache(client_id, origin, delta); | 1382 GetUsageTracker(type)->UpdateUsageCache(client_id, origin, delta); |
| 1381 | 1383 |
| 1382 PostTaskAndReplyWithResultForDBThread( | 1384 PostTaskAndReplyWithResultForDBThread( |
| 1383 FROM_HERE, | 1385 FROM_HERE, |
| 1384 base::Bind(&UpdateModifiedTimeOnDBThread, origin, type, modified_time), | 1386 base::Bind(&UpdateModifiedTimeOnDBThread, origin, type, modified_time), |
| 1385 base::Bind(&QuotaManager::DidDatabaseWork, | 1387 base::Bind(&QuotaManager::DidDatabaseWork, |
| 1386 weak_factory_.GetWeakPtr())); | 1388 weak_factory_.GetWeakPtr())); |
| 1387 } | 1389 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1471 base::Bind( | 1473 base::Bind( |
| 1472 &QuotaManager::DidGetTemporaryGlobalUsageForHistogram, | 1474 &QuotaManager::DidGetTemporaryGlobalUsageForHistogram, |
| 1473 weak_factory_.GetWeakPtr())); | 1475 weak_factory_.GetWeakPtr())); |
| 1474 GetGlobalUsage(kStorageTypePersistent, | 1476 GetGlobalUsage(kStorageTypePersistent, |
| 1475 base::Bind( | 1477 base::Bind( |
| 1476 &QuotaManager::DidGetPersistentGlobalUsageForHistogram, | 1478 &QuotaManager::DidGetPersistentGlobalUsageForHistogram, |
| 1477 weak_factory_.GetWeakPtr())); | 1479 weak_factory_.GetWeakPtr())); |
| 1478 } | 1480 } |
| 1479 | 1481 |
| 1480 void QuotaManager::DidGetTemporaryGlobalUsageForHistogram( | 1482 void QuotaManager::DidGetTemporaryGlobalUsageForHistogram( |
| 1481 int64 usage, | 1483 int64_t usage, |
| 1482 int64 unlimited_usage) { | 1484 int64_t unlimited_usage) { |
| 1483 UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage); | 1485 UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage); |
| 1484 | 1486 |
| 1485 std::set<GURL> origins; | 1487 std::set<GURL> origins; |
| 1486 GetCachedOrigins(kStorageTypeTemporary, &origins); | 1488 GetCachedOrigins(kStorageTypeTemporary, &origins); |
| 1487 | 1489 |
| 1488 size_t num_origins = origins.size(); | 1490 size_t num_origins = origins.size(); |
| 1489 size_t protected_origins = 0; | 1491 size_t protected_origins = 0; |
| 1490 size_t unlimited_origins = 0; | 1492 size_t unlimited_origins = 0; |
| 1491 CountOriginType(origins, | 1493 CountOriginType(origins, |
| 1492 special_storage_policy_.get(), | 1494 special_storage_policy_.get(), |
| 1493 &protected_origins, | 1495 &protected_origins, |
| 1494 &unlimited_origins); | 1496 &unlimited_origins); |
| 1495 | 1497 |
| 1496 UMA_HISTOGRAM_COUNTS("Quota.NumberOfTemporaryStorageOrigins", | 1498 UMA_HISTOGRAM_COUNTS("Quota.NumberOfTemporaryStorageOrigins", |
| 1497 num_origins); | 1499 num_origins); |
| 1498 UMA_HISTOGRAM_COUNTS("Quota.NumberOfProtectedTemporaryStorageOrigins", | 1500 UMA_HISTOGRAM_COUNTS("Quota.NumberOfProtectedTemporaryStorageOrigins", |
| 1499 protected_origins); | 1501 protected_origins); |
| 1500 UMA_HISTOGRAM_COUNTS("Quota.NumberOfUnlimitedTemporaryStorageOrigins", | 1502 UMA_HISTOGRAM_COUNTS("Quota.NumberOfUnlimitedTemporaryStorageOrigins", |
| 1501 unlimited_origins); | 1503 unlimited_origins); |
| 1502 } | 1504 } |
| 1503 | 1505 |
| 1504 void QuotaManager::DidGetPersistentGlobalUsageForHistogram( | 1506 void QuotaManager::DidGetPersistentGlobalUsageForHistogram( |
| 1505 int64 usage, | 1507 int64_t usage, |
| 1506 int64 unlimited_usage) { | 1508 int64_t unlimited_usage) { |
| 1507 UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfPersistentStorage", usage); | 1509 UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfPersistentStorage", usage); |
| 1508 | 1510 |
| 1509 std::set<GURL> origins; | 1511 std::set<GURL> origins; |
| 1510 GetCachedOrigins(kStorageTypePersistent, &origins); | 1512 GetCachedOrigins(kStorageTypePersistent, &origins); |
| 1511 | 1513 |
| 1512 size_t num_origins = origins.size(); | 1514 size_t num_origins = origins.size(); |
| 1513 size_t protected_origins = 0; | 1515 size_t protected_origins = 0; |
| 1514 size_t unlimited_origins = 0; | 1516 size_t unlimited_origins = 0; |
| 1515 CountOriginType(origins, | 1517 CountOriginType(origins, |
| 1516 special_storage_policy_.get(), | 1518 special_storage_policy_.get(), |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1551 } else { | 1553 } else { |
| 1552 callback.Run(origin); | 1554 callback.Run(origin); |
| 1553 } | 1555 } |
| 1554 access_notified_origins_.clear(); | 1556 access_notified_origins_.clear(); |
| 1555 | 1557 |
| 1556 is_getting_eviction_origin_ = false; | 1558 is_getting_eviction_origin_ = false; |
| 1557 } | 1559 } |
| 1558 | 1560 |
| 1559 void QuotaManager::GetEvictionOrigin(StorageType type, | 1561 void QuotaManager::GetEvictionOrigin(StorageType type, |
| 1560 const std::set<GURL>& extra_exceptions, | 1562 const std::set<GURL>& extra_exceptions, |
| 1561 int64 global_quota, | 1563 int64_t global_quota, |
| 1562 const GetOriginCallback& callback) { | 1564 const GetOriginCallback& callback) { |
| 1563 LazyInitialize(); | 1565 LazyInitialize(); |
| 1564 // This must not be called while there's an in-flight task. | 1566 // This must not be called while there's an in-flight task. |
| 1565 DCHECK(!is_getting_eviction_origin_); | 1567 DCHECK(!is_getting_eviction_origin_); |
| 1566 is_getting_eviction_origin_ = true; | 1568 is_getting_eviction_origin_ = true; |
| 1567 | 1569 |
| 1568 GetOriginCallback did_get_origin_callback = | 1570 GetOriginCallback did_get_origin_callback = |
| 1569 base::Bind(&QuotaManager::DidGetEvictionOrigin, | 1571 base::Bind(&QuotaManager::DidGetEvictionOrigin, |
| 1570 weak_factory_.GetWeakPtr(), callback); | 1572 weak_factory_.GetWeakPtr(), callback); |
| 1571 | 1573 |
| 1572 if (type == kStorageTypeTemporary && temporary_storage_eviction_policy_) { | 1574 if (type == kStorageTypeTemporary && temporary_storage_eviction_policy_) { |
| 1573 std::map<GURL, int64> usage_map; | 1575 std::map<GURL, int64_t> usage_map; |
| 1574 // The cached origins are populated by the prior call to | 1576 // The cached origins are populated by the prior call to |
| 1575 // GetUsageAndQuotaForEviction(). | 1577 // GetUsageAndQuotaForEviction(). |
| 1576 GetUsageTracker(kStorageTypeTemporary)->GetCachedOriginsUsage(&usage_map); | 1578 GetUsageTracker(kStorageTypeTemporary)->GetCachedOriginsUsage(&usage_map); |
| 1577 | 1579 |
| 1578 temporary_storage_eviction_policy_->GetEvictionOrigin( | 1580 temporary_storage_eviction_policy_->GetEvictionOrigin( |
| 1579 special_storage_policy_, GetEvictionOriginExceptions(extra_exceptions), | 1581 special_storage_policy_, GetEvictionOriginExceptions(extra_exceptions), |
| 1580 usage_map, global_quota, did_get_origin_callback); | 1582 usage_map, global_quota, did_get_origin_callback); |
| 1581 | 1583 |
| 1582 return; | 1584 return; |
| 1583 } | 1585 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1634 PostTaskAndReplyWithResultForDBThread( | 1636 PostTaskAndReplyWithResultForDBThread( |
| 1635 FROM_HERE, base::Bind(&GetLRUOriginOnDBThread, type, | 1637 FROM_HERE, base::Bind(&GetLRUOriginOnDBThread, type, |
| 1636 GetEvictionOriginExceptions(std::set<GURL>()), | 1638 GetEvictionOriginExceptions(std::set<GURL>()), |
| 1637 special_storage_policy_, base::Unretained(url)), | 1639 special_storage_policy_, base::Unretained(url)), |
| 1638 base::Bind(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(), | 1640 base::Bind(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(), |
| 1639 base::Owned(url))); | 1641 base::Owned(url))); |
| 1640 } | 1642 } |
| 1641 | 1643 |
| 1642 void QuotaManager::DidSetTemporaryGlobalOverrideQuota( | 1644 void QuotaManager::DidSetTemporaryGlobalOverrideQuota( |
| 1643 const QuotaCallback& callback, | 1645 const QuotaCallback& callback, |
| 1644 const int64* new_quota, | 1646 const int64_t* new_quota, |
| 1645 bool success) { | 1647 bool success) { |
| 1646 QuotaStatusCode status = kQuotaErrorInvalidAccess; | 1648 QuotaStatusCode status = kQuotaErrorInvalidAccess; |
| 1647 DidDatabaseWork(success); | 1649 DidDatabaseWork(success); |
| 1648 if (success) { | 1650 if (success) { |
| 1649 temporary_quota_override_ = *new_quota; | 1651 temporary_quota_override_ = *new_quota; |
| 1650 status = kQuotaStatusOk; | 1652 status = kQuotaStatusOk; |
| 1651 } | 1653 } |
| 1652 | 1654 |
| 1653 if (callback.is_null()) | 1655 if (callback.is_null()) |
| 1654 return; | 1656 return; |
| 1655 | 1657 |
| 1656 callback.Run(status, *new_quota); | 1658 callback.Run(status, *new_quota); |
| 1657 } | 1659 } |
| 1658 | 1660 |
| 1659 void QuotaManager::DidGetPersistentHostQuota(const std::string& host, | 1661 void QuotaManager::DidGetPersistentHostQuota(const std::string& host, |
| 1660 const int64* quota, | 1662 const int64_t* quota, |
| 1661 bool success) { | 1663 bool success) { |
| 1662 DidDatabaseWork(success); | 1664 DidDatabaseWork(success); |
| 1663 persistent_host_quota_callbacks_.Run(host, kQuotaStatusOk, *quota); | 1665 persistent_host_quota_callbacks_.Run(host, kQuotaStatusOk, *quota); |
| 1664 } | 1666 } |
| 1665 | 1667 |
| 1666 void QuotaManager::DidSetPersistentHostQuota(const std::string& host, | 1668 void QuotaManager::DidSetPersistentHostQuota(const std::string& host, |
| 1667 const QuotaCallback& callback, | 1669 const QuotaCallback& callback, |
| 1668 const int64* new_quota, | 1670 const int64_t* new_quota, |
| 1669 bool success) { | 1671 bool success) { |
| 1670 DidDatabaseWork(success); | 1672 DidDatabaseWork(success); |
| 1671 callback.Run(success ? kQuotaStatusOk : kQuotaErrorInvalidAccess, *new_quota); | 1673 callback.Run(success ? kQuotaStatusOk : kQuotaErrorInvalidAccess, *new_quota); |
| 1672 } | 1674 } |
| 1673 | 1675 |
| 1674 void QuotaManager::DidInitialize(int64* temporary_quota_override, | 1676 void QuotaManager::DidInitialize(int64_t* temporary_quota_override, |
| 1675 int64* desired_available_space, | 1677 int64_t* desired_available_space, |
| 1676 bool success) { | 1678 bool success) { |
| 1677 temporary_quota_override_ = *temporary_quota_override; | 1679 temporary_quota_override_ = *temporary_quota_override; |
| 1678 desired_available_space_ = *desired_available_space; | 1680 desired_available_space_ = *desired_available_space; |
| 1679 temporary_quota_initialized_ = true; | 1681 temporary_quota_initialized_ = true; |
| 1680 DidDatabaseWork(success); | 1682 DidDatabaseWork(success); |
| 1681 | 1683 |
| 1682 histogram_timer_.Start(FROM_HERE, | 1684 histogram_timer_.Start(FROM_HERE, |
| 1683 base::TimeDelta::FromMilliseconds( | 1685 base::TimeDelta::FromMilliseconds( |
| 1684 kReportHistogramInterval), | 1686 kReportHistogramInterval), |
| 1685 this, &QuotaManager::ReportHistogram); | 1687 this, &QuotaManager::ReportHistogram); |
| 1686 | 1688 |
| 1687 db_initialization_callbacks_.Run(); | 1689 db_initialization_callbacks_.Run(); |
| 1688 GetTemporaryGlobalQuota( | 1690 GetTemporaryGlobalQuota( |
| 1689 base::Bind(&QuotaManager::DidGetInitialTemporaryGlobalQuota, | 1691 base::Bind(&QuotaManager::DidGetInitialTemporaryGlobalQuota, |
| 1690 weak_factory_.GetWeakPtr())); | 1692 weak_factory_.GetWeakPtr())); |
| 1691 } | 1693 } |
| 1692 | 1694 |
| 1693 void QuotaManager::DidGetLRUOrigin(const GURL* origin, | 1695 void QuotaManager::DidGetLRUOrigin(const GURL* origin, |
| 1694 bool success) { | 1696 bool success) { |
| 1695 DidDatabaseWork(success); | 1697 DidDatabaseWork(success); |
| 1696 | 1698 |
| 1697 lru_origin_callback_.Run(*origin); | 1699 lru_origin_callback_.Run(*origin); |
| 1698 lru_origin_callback_.Reset(); | 1700 lru_origin_callback_.Reset(); |
| 1699 } | 1701 } |
| 1700 | 1702 |
| 1701 void QuotaManager::DidGetInitialTemporaryGlobalQuota( | 1703 void QuotaManager::DidGetInitialTemporaryGlobalQuota(QuotaStatusCode status, |
| 1702 QuotaStatusCode status, int64 quota_unused) { | 1704 int64_t quota_unused) { |
| 1703 if (eviction_disabled_) | 1705 if (eviction_disabled_) |
| 1704 return; | 1706 return; |
| 1705 | 1707 |
| 1706 std::set<GURL>* origins = new std::set<GURL>; | 1708 std::set<GURL>* origins = new std::set<GURL>; |
| 1707 temporary_usage_tracker_->GetCachedOrigins(origins); | 1709 temporary_usage_tracker_->GetCachedOrigins(origins); |
| 1708 // This will call the StartEviction() when initial origin registration | 1710 // This will call the StartEviction() when initial origin registration |
| 1709 // is completed. | 1711 // is completed. |
| 1710 PostTaskAndReplyWithResultForDBThread( | 1712 PostTaskAndReplyWithResultForDBThread( |
| 1711 FROM_HERE, | 1713 FROM_HERE, |
| 1712 base::Bind(&InitializeTemporaryOriginsInfoOnDBThread, | 1714 base::Bind(&InitializeTemporaryOriginsInfoOnDBThread, |
| 1713 base::Owned(origins)), | 1715 base::Owned(origins)), |
| 1714 base::Bind(&QuotaManager::DidInitializeTemporaryOriginsInfo, | 1716 base::Bind(&QuotaManager::DidInitializeTemporaryOriginsInfo, |
| 1715 weak_factory_.GetWeakPtr())); | 1717 weak_factory_.GetWeakPtr())); |
| 1716 } | 1718 } |
| 1717 | 1719 |
| 1718 void QuotaManager::DidInitializeTemporaryOriginsInfo(bool success) { | 1720 void QuotaManager::DidInitializeTemporaryOriginsInfo(bool success) { |
| 1719 DidDatabaseWork(success); | 1721 DidDatabaseWork(success); |
| 1720 if (success) | 1722 if (success) |
| 1721 StartEviction(); | 1723 StartEviction(); |
| 1722 } | 1724 } |
| 1723 | 1725 |
| 1724 void QuotaManager::DidGetAvailableSpace(int64 space) { | 1726 void QuotaManager::DidGetAvailableSpace(int64_t space) { |
| 1725 // crbug.com/349708 | 1727 // crbug.com/349708 |
| 1726 TRACE_EVENT1("io", "QuotaManager::DidGetAvailableSpace", | 1728 TRACE_EVENT1("io", "QuotaManager::DidGetAvailableSpace", |
| 1727 "n_callbacks", available_space_callbacks_.size()); | 1729 "n_callbacks", available_space_callbacks_.size()); |
| 1728 | 1730 |
| 1729 available_space_callbacks_.Run(kQuotaStatusOk, space); | 1731 available_space_callbacks_.Run(kQuotaStatusOk, space); |
| 1730 } | 1732 } |
| 1731 | 1733 |
| 1732 void QuotaManager::DidDatabaseWork(bool success) { | 1734 void QuotaManager::DidDatabaseWork(bool success) { |
| 1733 db_disabled_ = !success; | 1735 db_disabled_ = !success; |
| 1734 } | 1736 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1749 // |database_|, therefore we can be sure that database_ is alive when this | 1751 // |database_|, therefore we can be sure that database_ is alive when this |
| 1750 // task runs. | 1752 // task runs. |
| 1751 base::PostTaskAndReplyWithResult( | 1753 base::PostTaskAndReplyWithResult( |
| 1752 db_thread_.get(), | 1754 db_thread_.get(), |
| 1753 from_here, | 1755 from_here, |
| 1754 base::Bind(task, base::Unretained(database_.get())), | 1756 base::Bind(task, base::Unretained(database_.get())), |
| 1755 reply); | 1757 reply); |
| 1756 } | 1758 } |
| 1757 | 1759 |
| 1758 } // namespace storage | 1760 } // namespace storage |
| OLD | NEW |