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 |