| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "webkit/quota/quota_manager.h" | 5 #include "webkit/quota/quota_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 NOTREACHED(); | 372 NOTREACHED(); |
| 373 } | 373 } |
| 374 return NULL; | 374 return NULL; |
| 375 } | 375 } |
| 376 | 376 |
| 377 class QuotaManager::OriginDataDeleter : public QuotaTask { | 377 class QuotaManager::OriginDataDeleter : public QuotaTask { |
| 378 public: | 378 public: |
| 379 OriginDataDeleter(QuotaManager* manager, | 379 OriginDataDeleter(QuotaManager* manager, |
| 380 const GURL& origin, | 380 const GURL& origin, |
| 381 StorageType type, | 381 StorageType type, |
| 382 int quota_client_mask, |
| 382 StatusCallback* callback) | 383 StatusCallback* callback) |
| 383 : QuotaTask(manager), | 384 : QuotaTask(manager), |
| 384 origin_(origin), | 385 origin_(origin), |
| 385 type_(type), | 386 type_(type), |
| 387 quota_client_mask_(quota_client_mask), |
| 386 error_count_(0), | 388 error_count_(0), |
| 387 remaining_clients_(-1), | 389 remaining_clients_(-1), |
| 390 skipped_clients_(0), |
| 388 callback_(callback), | 391 callback_(callback), |
| 389 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} | 392 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
| 390 | 393 |
| 391 protected: | 394 protected: |
| 392 virtual void Run() OVERRIDE { | 395 virtual void Run() OVERRIDE { |
| 393 error_count_ = 0; | 396 error_count_ = 0; |
| 394 remaining_clients_ = manager()->clients_.size(); | 397 remaining_clients_ = manager()->clients_.size(); |
| 395 for (QuotaClientList::iterator iter = manager()->clients_.begin(); | 398 for (QuotaClientList::iterator iter = manager()->clients_.begin(); |
| 396 iter != manager()->clients_.end(); ++iter) { | 399 iter != manager()->clients_.end(); ++iter) { |
| 397 (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback( | 400 if (quota_client_mask_ & (*iter)->id()) { |
| 398 &OriginDataDeleter::DidDeleteOriginData)); | 401 (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback( |
| 402 &OriginDataDeleter::DidDeleteOriginData)); |
| 403 } else { |
| 404 ++skipped_clients_; |
| 405 if (--remaining_clients_ == 0) |
| 406 CallCompleted(); |
| 407 } |
| 399 } | 408 } |
| 400 } | 409 } |
| 401 | 410 |
| 402 virtual void Completed() OVERRIDE { | 411 virtual void Completed() OVERRIDE { |
| 403 if (error_count_ == 0) { | 412 if (error_count_ == 0) { |
| 404 manager()->DeleteOriginFromDatabase(origin_, type_); | 413 if (remaining_clients_ == 0) |
| 414 manager()->DeleteOriginFromDatabase(origin_, type_); |
| 405 callback_->Run(kQuotaStatusOk); | 415 callback_->Run(kQuotaStatusOk); |
| 406 } else { | 416 } else { |
| 407 callback_->Run(kQuotaErrorInvalidModification); | 417 callback_->Run(kQuotaErrorInvalidModification); |
| 408 } | 418 } |
| 409 DeleteSoon(); | 419 DeleteSoon(); |
| 410 } | 420 } |
| 411 | 421 |
| 412 virtual void Aborted() OVERRIDE { | 422 virtual void Aborted() OVERRIDE { |
| 413 callback_->Run(kQuotaErrorAbort); | 423 callback_->Run(kQuotaErrorAbort); |
| 414 DeleteSoon(); | 424 DeleteSoon(); |
| 415 } | 425 } |
| 416 | 426 |
| 417 void DidDeleteOriginData(QuotaStatusCode status) { | 427 void DidDeleteOriginData(QuotaStatusCode status) { |
| 418 DCHECK_GT(remaining_clients_, 0); | 428 DCHECK_GT(remaining_clients_, 0); |
| 419 | 429 |
| 420 if (status != kQuotaStatusOk) | 430 if (status != kQuotaStatusOk) |
| 421 ++error_count_; | 431 ++error_count_; |
| 422 | 432 |
| 423 if (--remaining_clients_ == 0) | 433 if (--remaining_clients_ == 0) |
| 424 CallCompleted(); | 434 CallCompleted(); |
| 425 } | 435 } |
| 426 | 436 |
| 427 QuotaManager* manager() const { | 437 QuotaManager* manager() const { |
| 428 return static_cast<QuotaManager*>(observer()); | 438 return static_cast<QuotaManager*>(observer()); |
| 429 } | 439 } |
| 430 | 440 |
| 431 GURL origin_; | 441 GURL origin_; |
| 432 StorageType type_; | 442 StorageType type_; |
| 443 int quota_client_mask_; |
| 433 int error_count_; | 444 int error_count_; |
| 434 int remaining_clients_; | 445 int remaining_clients_; |
| 446 int skipped_clients_; |
| 435 scoped_ptr<StatusCallback> callback_; | 447 scoped_ptr<StatusCallback> callback_; |
| 436 | 448 |
| 437 ScopedCallbackFactory<OriginDataDeleter> callback_factory_; | 449 ScopedCallbackFactory<OriginDataDeleter> callback_factory_; |
| 438 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter); | 450 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter); |
| 439 }; | 451 }; |
| 440 | 452 |
| 441 class QuotaManager::DatabaseTaskBase : public QuotaThreadTask { | 453 class QuotaManager::DatabaseTaskBase : public QuotaThreadTask { |
| 442 public: | 454 public: |
| 443 explicit DatabaseTaskBase(QuotaManager* manager) | 455 explicit DatabaseTaskBase(QuotaManager* manager) |
| 444 : QuotaThreadTask(manager, manager->db_thread_), | 456 : QuotaThreadTask(manager, manager->db_thread_), |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1159 } | 1171 } |
| 1160 | 1172 |
| 1161 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) { | 1173 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) { |
| 1162 DCHECK(io_thread_->BelongsToCurrentThread()); | 1174 DCHECK(io_thread_->BelongsToCurrentThread()); |
| 1163 DCHECK(IsOriginInUse(origin)); | 1175 DCHECK(IsOriginInUse(origin)); |
| 1164 int& count = origins_in_use_[origin]; | 1176 int& count = origins_in_use_[origin]; |
| 1165 if (--count == 0) | 1177 if (--count == 0) |
| 1166 origins_in_use_.erase(origin); | 1178 origins_in_use_.erase(origin); |
| 1167 } | 1179 } |
| 1168 | 1180 |
| 1169 void QuotaManager::DeleteOriginData( | 1181 void QuotaManager::DeleteOriginData(const GURL& origin, StorageType type, |
| 1170 const GURL& origin, StorageType type, StatusCallback* callback) { | 1182 int quota_client_mask, StatusCallback* callback) { |
| 1171 LazyInitialize(); | 1183 LazyInitialize(); |
| 1172 | 1184 |
| 1173 if (origin.is_empty() || clients_.empty()) { | 1185 if (origin.is_empty() || clients_.empty() || |
| 1186 quota_client_mask == QuotaClient::kUnknown) { |
| 1174 callback->Run(kQuotaStatusOk); | 1187 callback->Run(kQuotaStatusOk); |
| 1175 delete callback; | 1188 delete callback; |
| 1176 return; | 1189 return; |
| 1177 } | 1190 } |
| 1178 | 1191 |
| 1179 OriginDataDeleter* deleter = | 1192 OriginDataDeleter* deleter = |
| 1180 new OriginDataDeleter(this, origin, type, callback); | 1193 new OriginDataDeleter(this, origin, type, quota_client_mask, callback); |
| 1181 deleter->Start(); | 1194 deleter->Start(); |
| 1182 } | 1195 } |
| 1183 | 1196 |
| 1184 bool QuotaManager::ResetUsageTracker(StorageType type) { | 1197 bool QuotaManager::ResetUsageTracker(StorageType type) { |
| 1185 switch (type) { | 1198 switch (type) { |
| 1186 case kStorageTypeTemporary: | 1199 case kStorageTypeTemporary: |
| 1187 if (temporary_usage_tracker_->IsWorking()) | 1200 if (temporary_usage_tracker_->IsWorking()) |
| 1188 return false; | 1201 return false; |
| 1189 temporary_usage_tracker_.reset( | 1202 temporary_usage_tracker_.reset( |
| 1190 new UsageTracker(clients_, kStorageTypeTemporary, | 1203 new UsageTracker(clients_, kStorageTypeTemporary, |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1320 const GURL& origin, | 1333 const GURL& origin, |
| 1321 StorageType type, | 1334 StorageType type, |
| 1322 EvictOriginDataCallback* callback) { | 1335 EvictOriginDataCallback* callback) { |
| 1323 DCHECK(io_thread_->BelongsToCurrentThread()); | 1336 DCHECK(io_thread_->BelongsToCurrentThread()); |
| 1324 DCHECK_EQ(type, kStorageTypeTemporary); | 1337 DCHECK_EQ(type, kStorageTypeTemporary); |
| 1325 | 1338 |
| 1326 eviction_context_.evicted_origin = origin; | 1339 eviction_context_.evicted_origin = origin; |
| 1327 eviction_context_.evicted_type = type; | 1340 eviction_context_.evicted_type = type; |
| 1328 eviction_context_.evict_origin_data_callback.reset(callback); | 1341 eviction_context_.evict_origin_data_callback.reset(callback); |
| 1329 | 1342 |
| 1330 DeleteOriginData(origin, type, callback_factory_.NewCallback( | 1343 DeleteOriginData(origin, type, QuotaClient::kAllClientsMask, |
| 1331 &QuotaManager::DidOriginDataEvicted)); | 1344 callback_factory_.NewCallback(&QuotaManager::DidOriginDataEvicted)); |
| 1332 } | 1345 } |
| 1333 | 1346 |
| 1334 void QuotaManager::DidGetAvailableSpaceForEviction( | 1347 void QuotaManager::DidGetAvailableSpaceForEviction( |
| 1335 QuotaStatusCode status, | 1348 QuotaStatusCode status, |
| 1336 int64 available_space) { | 1349 int64 available_space) { |
| 1337 eviction_context_.get_usage_and_quota_callback->Run(status, | 1350 eviction_context_.get_usage_and_quota_callback->Run(status, |
| 1338 eviction_context_.usage, | 1351 eviction_context_.usage, |
| 1339 eviction_context_.unlimited_usage, | 1352 eviction_context_.unlimited_usage, |
| 1340 eviction_context_.quota, available_space); | 1353 eviction_context_.quota, available_space); |
| 1341 eviction_context_.get_usage_and_quota_callback.reset(); | 1354 eviction_context_.get_usage_and_quota_callback.reset(); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 | 1580 |
| 1568 QuotaManagerProxy::QuotaManagerProxy( | 1581 QuotaManagerProxy::QuotaManagerProxy( |
| 1569 QuotaManager* manager, base::MessageLoopProxy* io_thread) | 1582 QuotaManager* manager, base::MessageLoopProxy* io_thread) |
| 1570 : manager_(manager), io_thread_(io_thread) { | 1583 : manager_(manager), io_thread_(io_thread) { |
| 1571 } | 1584 } |
| 1572 | 1585 |
| 1573 QuotaManagerProxy::~QuotaManagerProxy() { | 1586 QuotaManagerProxy::~QuotaManagerProxy() { |
| 1574 } | 1587 } |
| 1575 | 1588 |
| 1576 } // namespace quota | 1589 } // namespace quota |
| OLD | NEW |