| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/appcache/appcache_storage_impl.h" | 5 #include "content/browser/appcache/appcache_storage_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <limits> |
| 9 #include <set> | 10 #include <set> |
| 10 #include <vector> | 11 #include <vector> |
| 11 | 12 |
| 12 #include "base/bind.h" | 13 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" | 14 #include "base/bind_helpers.h" |
| 14 #include "base/files/file_util.h" | 15 #include "base/files/file_util.h" |
| 15 #include "base/location.h" | 16 #include "base/location.h" |
| 16 #include "base/logging.h" | 17 #include "base/logging.h" |
| 17 #include "base/profiler/scoped_tracker.h" | 18 #include "base/profiler/scoped_tracker.h" |
| 18 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 43 static const int kDefaultQuota = 5 * 1024 * 1024; | 44 static const int kDefaultQuota = 5 * 1024 * 1024; |
| 44 | 45 |
| 45 static const int kMaxDiskCacheSize = 250 * 1024 * 1024; | 46 static const int kMaxDiskCacheSize = 250 * 1024 * 1024; |
| 46 static const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; | 47 static const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; |
| 47 static const base::FilePath::CharType kDiskCacheDirectoryName[] = | 48 static const base::FilePath::CharType kDiskCacheDirectoryName[] = |
| 48 FILE_PATH_LITERAL("Cache"); | 49 FILE_PATH_LITERAL("Cache"); |
| 49 | 50 |
| 50 namespace { | 51 namespace { |
| 51 | 52 |
| 52 // Helpers for clearing data from the AppCacheDatabase. | 53 // Helpers for clearing data from the AppCacheDatabase. |
| 53 bool DeleteGroupAndRelatedRecords(AppCacheDatabase* database, | 54 bool DeleteGroupAndRelatedRecords( |
| 54 int64 group_id, | 55 AppCacheDatabase* database, |
| 55 std::vector<int64>* deletable_response_ids) { | 56 int64_t group_id, |
| 57 std::vector<int64_t>* deletable_response_ids) { |
| 56 AppCacheDatabase::CacheRecord cache_record; | 58 AppCacheDatabase::CacheRecord cache_record; |
| 57 bool success = false; | 59 bool success = false; |
| 58 if (database->FindCacheForGroup(group_id, &cache_record)) { | 60 if (database->FindCacheForGroup(group_id, &cache_record)) { |
| 59 database->FindResponseIdsForCacheAsVector(cache_record.cache_id, | 61 database->FindResponseIdsForCacheAsVector(cache_record.cache_id, |
| 60 deletable_response_ids); | 62 deletable_response_ids); |
| 61 success = | 63 success = |
| 62 database->DeleteGroup(group_id) && | 64 database->DeleteGroup(group_id) && |
| 63 database->DeleteCache(cache_record.cache_id) && | 65 database->DeleteCache(cache_record.cache_id) && |
| 64 database->DeleteEntriesForCache(cache_record.cache_id) && | 66 database->DeleteEntriesForCache(cache_record.cache_id) && |
| 65 database->DeleteNamespacesForCache(cache_record.cache_id) && | 67 database->DeleteNamespacesForCache(cache_record.cache_id) && |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 | 115 |
| 114 std::vector<AppCacheDatabase::GroupRecord> groups; | 116 std::vector<AppCacheDatabase::GroupRecord> groups; |
| 115 database->FindGroupsForOrigin(*origin, &groups); | 117 database->FindGroupsForOrigin(*origin, &groups); |
| 116 std::vector<AppCacheDatabase::GroupRecord>::const_iterator group; | 118 std::vector<AppCacheDatabase::GroupRecord>::const_iterator group; |
| 117 for (group = groups.begin(); group != groups.end(); ++group) { | 119 for (group = groups.begin(); group != groups.end(); ++group) { |
| 118 sql::Transaction transaction(connection); | 120 sql::Transaction transaction(connection); |
| 119 if (!transaction.Begin()) { | 121 if (!transaction.Begin()) { |
| 120 NOTREACHED() << "Failed to start transaction"; | 122 NOTREACHED() << "Failed to start transaction"; |
| 121 return; | 123 return; |
| 122 } | 124 } |
| 123 std::vector<int64> deletable_response_ids; | 125 std::vector<int64_t> deletable_response_ids; |
| 124 bool success = DeleteGroupAndRelatedRecords(database, | 126 bool success = DeleteGroupAndRelatedRecords(database, |
| 125 group->group_id, | 127 group->group_id, |
| 126 &deletable_response_ids); | 128 &deletable_response_ids); |
| 127 success = success && transaction.Commit(); | 129 success = success && transaction.Commit(); |
| 128 DCHECK(success); | 130 DCHECK(success); |
| 129 } // for each group | 131 } // for each group |
| 130 } // for each origin | 132 } // for each origin |
| 131 } | 133 } |
| 132 | 134 |
| 133 } // namespace | 135 } // namespace |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 // DatabaseTask: | 276 // DatabaseTask: |
| 275 void Run() override; | 277 void Run() override; |
| 276 void RunCompleted() override; | 278 void RunCompleted() override; |
| 277 | 279 |
| 278 protected: | 280 protected: |
| 279 ~InitTask() override {} | 281 ~InitTask() override {} |
| 280 | 282 |
| 281 private: | 283 private: |
| 282 base::FilePath db_file_path_; | 284 base::FilePath db_file_path_; |
| 283 base::FilePath disk_cache_directory_; | 285 base::FilePath disk_cache_directory_; |
| 284 int64 last_group_id_; | 286 int64_t last_group_id_; |
| 285 int64 last_cache_id_; | 287 int64_t last_cache_id_; |
| 286 int64 last_response_id_; | 288 int64_t last_response_id_; |
| 287 int64 last_deletable_response_rowid_; | 289 int64_t last_deletable_response_rowid_; |
| 288 std::map<GURL, int64> usage_map_; | 290 std::map<GURL, int64_t> usage_map_; |
| 289 }; | 291 }; |
| 290 | 292 |
| 291 void AppCacheStorageImpl::InitTask::Run() { | 293 void AppCacheStorageImpl::InitTask::Run() { |
| 292 tracked_objects::ScopedTracker tracking_profile( | 294 tracked_objects::ScopedTracker tracking_profile( |
| 293 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::InitTask")); | 295 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::InitTask")); |
| 294 // If there is no sql database, ensure there is no disk cache either. | 296 // If there is no sql database, ensure there is no disk cache either. |
| 295 if (!db_file_path_.empty() && | 297 if (!db_file_path_.empty() && |
| 296 !base::PathExists(db_file_path_) && | 298 !base::PathExists(db_file_path_) && |
| 297 base::DirectoryExists(disk_cache_directory_)) { | 299 base::DirectoryExists(disk_cache_directory_)) { |
| 298 base::DeleteFile(disk_cache_directory_, true); | 300 base::DeleteFile(disk_cache_directory_, true); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 } | 398 } |
| 397 | 399 |
| 398 // StoreOrLoadTask ------- | 400 // StoreOrLoadTask ------- |
| 399 | 401 |
| 400 class AppCacheStorageImpl::StoreOrLoadTask : public DatabaseTask { | 402 class AppCacheStorageImpl::StoreOrLoadTask : public DatabaseTask { |
| 401 protected: | 403 protected: |
| 402 explicit StoreOrLoadTask(AppCacheStorageImpl* storage) | 404 explicit StoreOrLoadTask(AppCacheStorageImpl* storage) |
| 403 : DatabaseTask(storage) {} | 405 : DatabaseTask(storage) {} |
| 404 ~StoreOrLoadTask() override {} | 406 ~StoreOrLoadTask() override {} |
| 405 | 407 |
| 406 bool FindRelatedCacheRecords(int64 cache_id); | 408 bool FindRelatedCacheRecords(int64_t cache_id); |
| 407 void CreateCacheAndGroupFromRecords( | 409 void CreateCacheAndGroupFromRecords( |
| 408 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group); | 410 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group); |
| 409 | 411 |
| 410 AppCacheDatabase::GroupRecord group_record_; | 412 AppCacheDatabase::GroupRecord group_record_; |
| 411 AppCacheDatabase::CacheRecord cache_record_; | 413 AppCacheDatabase::CacheRecord cache_record_; |
| 412 std::vector<AppCacheDatabase::EntryRecord> entry_records_; | 414 std::vector<AppCacheDatabase::EntryRecord> entry_records_; |
| 413 std::vector<AppCacheDatabase::NamespaceRecord> | 415 std::vector<AppCacheDatabase::NamespaceRecord> |
| 414 intercept_namespace_records_; | 416 intercept_namespace_records_; |
| 415 std::vector<AppCacheDatabase::NamespaceRecord> | 417 std::vector<AppCacheDatabase::NamespaceRecord> |
| 416 fallback_namespace_records_; | 418 fallback_namespace_records_; |
| 417 std::vector<AppCacheDatabase::OnlineWhiteListRecord> | 419 std::vector<AppCacheDatabase::OnlineWhiteListRecord> |
| 418 online_whitelist_records_; | 420 online_whitelist_records_; |
| 419 }; | 421 }; |
| 420 | 422 |
| 421 bool AppCacheStorageImpl::StoreOrLoadTask::FindRelatedCacheRecords( | 423 bool AppCacheStorageImpl::StoreOrLoadTask::FindRelatedCacheRecords( |
| 422 int64 cache_id) { | 424 int64_t cache_id) { |
| 423 return database_->FindEntriesForCache(cache_id, &entry_records_) && | 425 return database_->FindEntriesForCache(cache_id, &entry_records_) && |
| 424 database_->FindNamespacesForCache( | 426 database_->FindNamespacesForCache( |
| 425 cache_id, &intercept_namespace_records_, | 427 cache_id, &intercept_namespace_records_, |
| 426 &fallback_namespace_records_) && | 428 &fallback_namespace_records_) && |
| 427 database_->FindOnlineWhiteListForCache( | 429 database_->FindOnlineWhiteListForCache( |
| 428 cache_id, &online_whitelist_records_); | 430 cache_id, &online_whitelist_records_); |
| 429 } | 431 } |
| 430 | 432 |
| 431 void AppCacheStorageImpl::StoreOrLoadTask::CreateCacheAndGroupFromRecords( | 433 void AppCacheStorageImpl::StoreOrLoadTask::CreateCacheAndGroupFromRecords( |
| 432 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group) { | 434 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 storage_->NotifyStorageAccessed(group_record_.origin); | 500 storage_->NotifyStorageAccessed(group_record_.origin); |
| 499 | 501 |
| 500 // TODO(michaeln): Maybe verify that the responses we expect to exist | 502 // TODO(michaeln): Maybe verify that the responses we expect to exist |
| 501 // do actually exist in the disk_cache (and if not then what?) | 503 // do actually exist in the disk_cache (and if not then what?) |
| 502 } | 504 } |
| 503 | 505 |
| 504 // CacheLoadTask ------- | 506 // CacheLoadTask ------- |
| 505 | 507 |
| 506 class AppCacheStorageImpl::CacheLoadTask : public StoreOrLoadTask { | 508 class AppCacheStorageImpl::CacheLoadTask : public StoreOrLoadTask { |
| 507 public: | 509 public: |
| 508 CacheLoadTask(int64 cache_id, AppCacheStorageImpl* storage) | 510 CacheLoadTask(int64_t cache_id, AppCacheStorageImpl* storage) |
| 509 : StoreOrLoadTask(storage), cache_id_(cache_id), | 511 : StoreOrLoadTask(storage), cache_id_(cache_id), success_(false) {} |
| 510 success_(false) {} | |
| 511 | 512 |
| 512 // DatabaseTask: | 513 // DatabaseTask: |
| 513 void Run() override; | 514 void Run() override; |
| 514 void RunCompleted() override; | 515 void RunCompleted() override; |
| 515 | 516 |
| 516 protected: | 517 protected: |
| 517 ~CacheLoadTask() override {} | 518 ~CacheLoadTask() override {} |
| 518 | 519 |
| 519 private: | 520 private: |
| 520 int64 cache_id_; | 521 int64_t cache_id_; |
| 521 bool success_; | 522 bool success_; |
| 522 }; | 523 }; |
| 523 | 524 |
| 524 void AppCacheStorageImpl::CacheLoadTask::Run() { | 525 void AppCacheStorageImpl::CacheLoadTask::Run() { |
| 525 tracked_objects::ScopedTracker tracking_profile( | 526 tracked_objects::ScopedTracker tracking_profile( |
| 526 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::CacheLoadTask")); | 527 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::CacheLoadTask")); |
| 527 success_ = | 528 success_ = |
| 528 database_->FindCache(cache_id_, &cache_record_) && | 529 database_->FindCache(cache_id_, &cache_record_) && |
| 529 database_->FindGroup(cache_record_.group_id, &group_record_) && | 530 database_->FindGroup(cache_record_.group_id, &group_record_) && |
| 530 FindRelatedCacheRecords(cache_id_); | 531 FindRelatedCacheRecords(cache_id_); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 | 602 |
| 602 // StoreGroupAndCacheTask ------- | 603 // StoreGroupAndCacheTask ------- |
| 603 | 604 |
| 604 class AppCacheStorageImpl::StoreGroupAndCacheTask : public StoreOrLoadTask { | 605 class AppCacheStorageImpl::StoreGroupAndCacheTask : public StoreOrLoadTask { |
| 605 public: | 606 public: |
| 606 StoreGroupAndCacheTask(AppCacheStorageImpl* storage, AppCacheGroup* group, | 607 StoreGroupAndCacheTask(AppCacheStorageImpl* storage, AppCacheGroup* group, |
| 607 AppCache* newest_cache); | 608 AppCache* newest_cache); |
| 608 | 609 |
| 609 void GetQuotaThenSchedule(); | 610 void GetQuotaThenSchedule(); |
| 610 void OnQuotaCallback(storage::QuotaStatusCode status, | 611 void OnQuotaCallback(storage::QuotaStatusCode status, |
| 611 int64 usage, | 612 int64_t usage, |
| 612 int64 quota); | 613 int64_t quota); |
| 613 | 614 |
| 614 // DatabaseTask: | 615 // DatabaseTask: |
| 615 void Run() override; | 616 void Run() override; |
| 616 void RunCompleted() override; | 617 void RunCompleted() override; |
| 617 void CancelCompletion() override; | 618 void CancelCompletion() override; |
| 618 | 619 |
| 619 protected: | 620 protected: |
| 620 ~StoreGroupAndCacheTask() override {} | 621 ~StoreGroupAndCacheTask() override {} |
| 621 | 622 |
| 622 private: | 623 private: |
| 623 scoped_refptr<AppCacheGroup> group_; | 624 scoped_refptr<AppCacheGroup> group_; |
| 624 scoped_refptr<AppCache> cache_; | 625 scoped_refptr<AppCache> cache_; |
| 625 bool success_; | 626 bool success_; |
| 626 bool would_exceed_quota_; | 627 bool would_exceed_quota_; |
| 627 int64 space_available_; | 628 int64_t space_available_; |
| 628 int64 new_origin_usage_; | 629 int64_t new_origin_usage_; |
| 629 std::vector<int64> newly_deletable_response_ids_; | 630 std::vector<int64_t> newly_deletable_response_ids_; |
| 630 }; | 631 }; |
| 631 | 632 |
| 632 AppCacheStorageImpl::StoreGroupAndCacheTask::StoreGroupAndCacheTask( | 633 AppCacheStorageImpl::StoreGroupAndCacheTask::StoreGroupAndCacheTask( |
| 633 AppCacheStorageImpl* storage, AppCacheGroup* group, AppCache* newest_cache) | 634 AppCacheStorageImpl* storage, AppCacheGroup* group, AppCache* newest_cache) |
| 634 : StoreOrLoadTask(storage), group_(group), cache_(newest_cache), | 635 : StoreOrLoadTask(storage), group_(group), cache_(newest_cache), |
| 635 success_(false), would_exceed_quota_(false), | 636 success_(false), would_exceed_quota_(false), |
| 636 space_available_(-1), new_origin_usage_(-1) { | 637 space_available_(-1), new_origin_usage_(-1) { |
| 637 group_record_.group_id = group->group_id(); | 638 group_record_.group_id = group->group_id(); |
| 638 group_record_.manifest_url = group->manifest_url(); | 639 group_record_.manifest_url = group->manifest_url(); |
| 639 group_record_.origin = group_record_.manifest_url.GetOrigin(); | 640 group_record_.origin = group_record_.manifest_url.GetOrigin(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 653 storage::QuotaManager* quota_manager = NULL; | 654 storage::QuotaManager* quota_manager = NULL; |
| 654 if (storage_->service()->quota_manager_proxy()) { | 655 if (storage_->service()->quota_manager_proxy()) { |
| 655 quota_manager = | 656 quota_manager = |
| 656 storage_->service()->quota_manager_proxy()->quota_manager(); | 657 storage_->service()->quota_manager_proxy()->quota_manager(); |
| 657 } | 658 } |
| 658 | 659 |
| 659 if (!quota_manager) { | 660 if (!quota_manager) { |
| 660 if (storage_->service()->special_storage_policy() && | 661 if (storage_->service()->special_storage_policy() && |
| 661 storage_->service()->special_storage_policy()->IsStorageUnlimited( | 662 storage_->service()->special_storage_policy()->IsStorageUnlimited( |
| 662 group_record_.origin)) | 663 group_record_.origin)) |
| 663 space_available_ = kint64max; | 664 space_available_ = std::numeric_limits<int64_t>::max(); |
| 664 Schedule(); | 665 Schedule(); |
| 665 return; | 666 return; |
| 666 } | 667 } |
| 667 | 668 |
| 668 // crbug.com/349708 | 669 // crbug.com/349708 |
| 669 TRACE_EVENT0( | 670 TRACE_EVENT0( |
| 670 "io", | 671 "io", |
| 671 "AppCacheStorageImpl::StoreGroupAndCacheTask::GetQuotaThenSchedule"); | 672 "AppCacheStorageImpl::StoreGroupAndCacheTask::GetQuotaThenSchedule"); |
| 672 | 673 |
| 673 // We have to ask the quota manager for the value. | 674 // We have to ask the quota manager for the value. |
| 674 storage_->pending_quota_queries_.insert(this); | 675 storage_->pending_quota_queries_.insert(this); |
| 675 quota_manager->GetUsageAndQuota( | 676 quota_manager->GetUsageAndQuota( |
| 676 group_record_.origin, | 677 group_record_.origin, |
| 677 storage::kStorageTypeTemporary, | 678 storage::kStorageTypeTemporary, |
| 678 base::Bind(&StoreGroupAndCacheTask::OnQuotaCallback, this)); | 679 base::Bind(&StoreGroupAndCacheTask::OnQuotaCallback, this)); |
| 679 } | 680 } |
| 680 | 681 |
| 681 void AppCacheStorageImpl::StoreGroupAndCacheTask::OnQuotaCallback( | 682 void AppCacheStorageImpl::StoreGroupAndCacheTask::OnQuotaCallback( |
| 682 storage::QuotaStatusCode status, | 683 storage::QuotaStatusCode status, |
| 683 int64 usage, | 684 int64_t usage, |
| 684 int64 quota) { | 685 int64_t quota) { |
| 685 if (storage_) { | 686 if (storage_) { |
| 686 if (status == storage::kQuotaStatusOk) | 687 if (status == storage::kQuotaStatusOk) |
| 687 space_available_ = std::max(static_cast<int64>(0), quota - usage); | 688 space_available_ = std::max(static_cast<int64_t>(0), quota - usage); |
| 688 else | 689 else |
| 689 space_available_ = 0; | 690 space_available_ = 0; |
| 690 storage_->pending_quota_queries_.erase(this); | 691 storage_->pending_quota_queries_.erase(this); |
| 691 Schedule(); | 692 Schedule(); |
| 692 } | 693 } |
| 693 } | 694 } |
| 694 | 695 |
| 695 void AppCacheStorageImpl::StoreGroupAndCacheTask::Run() { | 696 void AppCacheStorageImpl::StoreGroupAndCacheTask::Run() { |
| 696 DCHECK(!success_); | 697 DCHECK(!success_); |
| 697 sql::Connection* connection = database_->db_connection(); | 698 sql::Connection* connection = database_->db_connection(); |
| 698 if (!connection) | 699 if (!connection) |
| 699 return; | 700 return; |
| 700 | 701 |
| 701 sql::Transaction transaction(connection); | 702 sql::Transaction transaction(connection); |
| 702 if (!transaction.Begin()) | 703 if (!transaction.Begin()) |
| 703 return; | 704 return; |
| 704 | 705 |
| 705 int64 old_origin_usage = database_->GetOriginUsage(group_record_.origin); | 706 int64_t old_origin_usage = database_->GetOriginUsage(group_record_.origin); |
| 706 | 707 |
| 707 AppCacheDatabase::GroupRecord existing_group; | 708 AppCacheDatabase::GroupRecord existing_group; |
| 708 success_ = database_->FindGroup(group_record_.group_id, &existing_group); | 709 success_ = database_->FindGroup(group_record_.group_id, &existing_group); |
| 709 if (!success_) { | 710 if (!success_) { |
| 710 group_record_.creation_time = base::Time::Now(); | 711 group_record_.creation_time = base::Time::Now(); |
| 711 group_record_.last_access_time = base::Time::Now(); | 712 group_record_.last_access_time = base::Time::Now(); |
| 712 success_ = database_->InsertGroup(&group_record_); | 713 success_ = database_->InsertGroup(&group_record_); |
| 713 } else { | 714 } else { |
| 714 DCHECK(group_record_.group_id == existing_group.group_id); | 715 DCHECK(group_record_.group_id == existing_group.group_id); |
| 715 DCHECK(group_record_.manifest_url == existing_group.manifest_url); | 716 DCHECK(group_record_.manifest_url == existing_group.manifest_url); |
| 716 DCHECK(group_record_.origin == existing_group.origin); | 717 DCHECK(group_record_.origin == existing_group.origin); |
| 717 | 718 |
| 718 database_->UpdateLastAccessTime(group_record_.group_id, | 719 database_->UpdateLastAccessTime(group_record_.group_id, |
| 719 base::Time::Now()); | 720 base::Time::Now()); |
| 720 | 721 |
| 721 database_->UpdateEvictionTimes( | 722 database_->UpdateEvictionTimes( |
| 722 group_record_.group_id, | 723 group_record_.group_id, |
| 723 group_record_.last_full_update_check_time, | 724 group_record_.last_full_update_check_time, |
| 724 group_record_.first_evictable_error_time); | 725 group_record_.first_evictable_error_time); |
| 725 | 726 |
| 726 AppCacheDatabase::CacheRecord cache; | 727 AppCacheDatabase::CacheRecord cache; |
| 727 if (database_->FindCacheForGroup(group_record_.group_id, &cache)) { | 728 if (database_->FindCacheForGroup(group_record_.group_id, &cache)) { |
| 728 // Get the set of response ids in the old cache. | 729 // Get the set of response ids in the old cache. |
| 729 std::set<int64> existing_response_ids; | 730 std::set<int64_t> existing_response_ids; |
| 730 database_->FindResponseIdsForCacheAsSet(cache.cache_id, | 731 database_->FindResponseIdsForCacheAsSet(cache.cache_id, |
| 731 &existing_response_ids); | 732 &existing_response_ids); |
| 732 | 733 |
| 733 // Remove those that remain in the new cache. | 734 // Remove those that remain in the new cache. |
| 734 std::vector<AppCacheDatabase::EntryRecord>::const_iterator entry_iter = | 735 std::vector<AppCacheDatabase::EntryRecord>::const_iterator entry_iter = |
| 735 entry_records_.begin(); | 736 entry_records_.begin(); |
| 736 while (entry_iter != entry_records_.end()) { | 737 while (entry_iter != entry_records_.end()) { |
| 737 existing_response_ids.erase(entry_iter->response_id); | 738 existing_response_ids.erase(entry_iter->response_id); |
| 738 ++entry_iter; | 739 ++entry_iter; |
| 739 } | 740 } |
| 740 | 741 |
| 741 // The rest are deletable. | 742 // The rest are deletable. |
| 742 std::set<int64>::const_iterator id_iter = existing_response_ids.begin(); | 743 std::set<int64_t>::const_iterator id_iter = existing_response_ids.begin(); |
| 743 while (id_iter != existing_response_ids.end()) { | 744 while (id_iter != existing_response_ids.end()) { |
| 744 newly_deletable_response_ids_.push_back(*id_iter); | 745 newly_deletable_response_ids_.push_back(*id_iter); |
| 745 ++id_iter; | 746 ++id_iter; |
| 746 } | 747 } |
| 747 | 748 |
| 748 success_ = | 749 success_ = |
| 749 database_->DeleteCache(cache.cache_id) && | 750 database_->DeleteCache(cache.cache_id) && |
| 750 database_->DeleteEntriesForCache(cache.cache_id) && | 751 database_->DeleteEntriesForCache(cache.cache_id) && |
| 751 database_->DeleteNamespacesForCache(cache.cache_id) && | 752 database_->DeleteNamespacesForCache(cache.cache_id) && |
| 752 database_->DeleteOnlineWhiteListForCache(cache.cache_id) && | 753 database_->DeleteOnlineWhiteListForCache(cache.cache_id) && |
| (...skipping 29 matching lines...) Expand all Loading... |
| 782 would_exceed_quota_ = true; | 783 would_exceed_quota_ = true; |
| 783 success_ = false; | 784 success_ = false; |
| 784 return; | 785 return; |
| 785 } | 786 } |
| 786 success_ = transaction.Commit(); | 787 success_ = transaction.Commit(); |
| 787 return; | 788 return; |
| 788 } | 789 } |
| 789 | 790 |
| 790 // Check limits based on the space availbable given to us via the | 791 // Check limits based on the space availbable given to us via the |
| 791 // quota system. | 792 // quota system. |
| 792 int64 delta = new_origin_usage_ - old_origin_usage; | 793 int64_t delta = new_origin_usage_ - old_origin_usage; |
| 793 if (delta > space_available_) { | 794 if (delta > space_available_) { |
| 794 would_exceed_quota_ = true; | 795 would_exceed_quota_ = true; |
| 795 success_ = false; | 796 success_ = false; |
| 796 return; | 797 return; |
| 797 } | 798 } |
| 798 | 799 |
| 799 success_ = transaction.Commit(); | 800 success_ = transaction.Commit(); |
| 800 } | 801 } |
| 801 | 802 |
| 802 void AppCacheStorageImpl::StoreGroupAndCacheTask::RunCompleted() { | 803 void AppCacheStorageImpl::StoreGroupAndCacheTask::RunCompleted() { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 833 // FindMainResponseTask ------- | 834 // FindMainResponseTask ------- |
| 834 | 835 |
| 835 // Helpers for FindMainResponseTask::Run() | 836 // Helpers for FindMainResponseTask::Run() |
| 836 namespace { | 837 namespace { |
| 837 class SortByCachePreference | 838 class SortByCachePreference |
| 838 : public std::binary_function< | 839 : public std::binary_function< |
| 839 AppCacheDatabase::EntryRecord, | 840 AppCacheDatabase::EntryRecord, |
| 840 AppCacheDatabase::EntryRecord, | 841 AppCacheDatabase::EntryRecord, |
| 841 bool> { | 842 bool> { |
| 842 public: | 843 public: |
| 843 SortByCachePreference(int64 preferred_id, const std::set<int64>& in_use_ids) | 844 SortByCachePreference(int64_t preferred_id, |
| 844 : preferred_id_(preferred_id), in_use_ids_(in_use_ids) { | 845 const std::set<int64_t>& in_use_ids) |
| 845 } | 846 : preferred_id_(preferred_id), in_use_ids_(in_use_ids) {} |
| 846 bool operator()( | 847 bool operator()( |
| 847 const AppCacheDatabase::EntryRecord& lhs, | 848 const AppCacheDatabase::EntryRecord& lhs, |
| 848 const AppCacheDatabase::EntryRecord& rhs) { | 849 const AppCacheDatabase::EntryRecord& rhs) { |
| 849 return compute_value(lhs) > compute_value(rhs); | 850 return compute_value(lhs) > compute_value(rhs); |
| 850 } | 851 } |
| 851 private: | 852 private: |
| 852 int compute_value(const AppCacheDatabase::EntryRecord& entry) { | 853 int compute_value(const AppCacheDatabase::EntryRecord& entry) { |
| 853 if (entry.cache_id == preferred_id_) | 854 if (entry.cache_id == preferred_id_) |
| 854 return 100; | 855 return 100; |
| 855 else if (in_use_ids_.find(entry.cache_id) != in_use_ids_.end()) | 856 else if (in_use_ids_.find(entry.cache_id) != in_use_ids_.end()) |
| 856 return 50; | 857 return 50; |
| 857 return 0; | 858 return 0; |
| 858 } | 859 } |
| 859 int64 preferred_id_; | 860 int64_t preferred_id_; |
| 860 const std::set<int64>& in_use_ids_; | 861 const std::set<int64_t>& in_use_ids_; |
| 861 }; | 862 }; |
| 862 | 863 |
| 863 bool SortByLength( | 864 bool SortByLength( |
| 864 const AppCacheDatabase::NamespaceRecord& lhs, | 865 const AppCacheDatabase::NamespaceRecord& lhs, |
| 865 const AppCacheDatabase::NamespaceRecord& rhs) { | 866 const AppCacheDatabase::NamespaceRecord& rhs) { |
| 866 return lhs.namespace_.namespace_url.spec().length() > | 867 return lhs.namespace_.namespace_url.spec().length() > |
| 867 rhs.namespace_.namespace_url.spec().length(); | 868 rhs.namespace_.namespace_url.spec().length(); |
| 868 } | 869 } |
| 869 | 870 |
| 870 class NetworkNamespaceHelper { | 871 class NetworkNamespaceHelper { |
| 871 public: | 872 public: |
| 872 explicit NetworkNamespaceHelper(AppCacheDatabase* database) | 873 explicit NetworkNamespaceHelper(AppCacheDatabase* database) |
| 873 : database_(database) { | 874 : database_(database) { |
| 874 } | 875 } |
| 875 | 876 |
| 876 bool IsInNetworkNamespace(const GURL& url, int64 cache_id) { | 877 bool IsInNetworkNamespace(const GURL& url, int64_t cache_id) { |
| 877 typedef std::pair<WhiteListMap::iterator, bool> InsertResult; | 878 typedef std::pair<WhiteListMap::iterator, bool> InsertResult; |
| 878 InsertResult result = namespaces_map_.insert( | 879 InsertResult result = namespaces_map_.insert( |
| 879 WhiteListMap::value_type(cache_id, AppCacheNamespaceVector())); | 880 WhiteListMap::value_type(cache_id, AppCacheNamespaceVector())); |
| 880 if (result.second) | 881 if (result.second) |
| 881 GetOnlineWhiteListForCache(cache_id, &result.first->second); | 882 GetOnlineWhiteListForCache(cache_id, &result.first->second); |
| 882 return AppCache::FindNamespace(result.first->second, url) != NULL; | 883 return AppCache::FindNamespace(result.first->second, url) != NULL; |
| 883 } | 884 } |
| 884 | 885 |
| 885 private: | 886 private: |
| 886 void GetOnlineWhiteListForCache( | 887 void GetOnlineWhiteListForCache(int64_t cache_id, |
| 887 int64 cache_id, AppCacheNamespaceVector* namespaces) { | 888 AppCacheNamespaceVector* namespaces) { |
| 888 DCHECK(namespaces && namespaces->empty()); | 889 DCHECK(namespaces && namespaces->empty()); |
| 889 typedef std::vector<AppCacheDatabase::OnlineWhiteListRecord> | 890 typedef std::vector<AppCacheDatabase::OnlineWhiteListRecord> |
| 890 WhiteListVector; | 891 WhiteListVector; |
| 891 WhiteListVector records; | 892 WhiteListVector records; |
| 892 if (!database_->FindOnlineWhiteListForCache(cache_id, &records)) | 893 if (!database_->FindOnlineWhiteListForCache(cache_id, &records)) |
| 893 return; | 894 return; |
| 894 WhiteListVector::const_iterator iter = records.begin(); | 895 WhiteListVector::const_iterator iter = records.begin(); |
| 895 while (iter != records.end()) { | 896 while (iter != records.end()) { |
| 896 namespaces->push_back( | 897 namespaces->push_back( |
| 897 AppCacheNamespace(APPCACHE_NETWORK_NAMESPACE, iter->namespace_url, | 898 AppCacheNamespace(APPCACHE_NETWORK_NAMESPACE, iter->namespace_url, |
| 898 GURL(), iter->is_pattern)); | 899 GURL(), iter->is_pattern)); |
| 899 ++iter; | 900 ++iter; |
| 900 } | 901 } |
| 901 } | 902 } |
| 902 | 903 |
| 903 // Key is cache id | 904 // Key is cache id |
| 904 typedef std::map<int64, AppCacheNamespaceVector> WhiteListMap; | 905 typedef std::map<int64_t, AppCacheNamespaceVector> WhiteListMap; |
| 905 WhiteListMap namespaces_map_; | 906 WhiteListMap namespaces_map_; |
| 906 AppCacheDatabase* database_; | 907 AppCacheDatabase* database_; |
| 907 }; | 908 }; |
| 908 | 909 |
| 909 } // namespace | 910 } // namespace |
| 910 | 911 |
| 911 class AppCacheStorageImpl::FindMainResponseTask : public DatabaseTask { | 912 class AppCacheStorageImpl::FindMainResponseTask : public DatabaseTask { |
| 912 public: | 913 public: |
| 913 FindMainResponseTask(AppCacheStorageImpl* storage, | 914 FindMainResponseTask(AppCacheStorageImpl* storage, |
| 914 const GURL& url, | 915 const GURL& url, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 934 void Run() override; | 935 void Run() override; |
| 935 void RunCompleted() override; | 936 void RunCompleted() override; |
| 936 | 937 |
| 937 protected: | 938 protected: |
| 938 ~FindMainResponseTask() override {} | 939 ~FindMainResponseTask() override {} |
| 939 | 940 |
| 940 private: | 941 private: |
| 941 typedef std::vector<AppCacheDatabase::NamespaceRecord*> | 942 typedef std::vector<AppCacheDatabase::NamespaceRecord*> |
| 942 NamespaceRecordPtrVector; | 943 NamespaceRecordPtrVector; |
| 943 | 944 |
| 944 bool FindExactMatch(int64 preferred_id); | 945 bool FindExactMatch(int64_t preferred_id); |
| 945 bool FindNamespaceMatch(int64 preferred_id); | 946 bool FindNamespaceMatch(int64_t preferred_id); |
| 946 bool FindNamespaceHelper( | 947 bool FindNamespaceHelper(int64_t preferred_cache_id, |
| 947 int64 preferred_cache_id, | 948 AppCacheDatabase::NamespaceRecordVector* namespaces, |
| 948 AppCacheDatabase::NamespaceRecordVector* namespaces, | 949 NetworkNamespaceHelper* network_namespace_helper); |
| 949 NetworkNamespaceHelper* network_namespace_helper); | |
| 950 bool FindFirstValidNamespace(const NamespaceRecordPtrVector& namespaces); | 950 bool FindFirstValidNamespace(const NamespaceRecordPtrVector& namespaces); |
| 951 | 951 |
| 952 GURL url_; | 952 GURL url_; |
| 953 GURL preferred_manifest_url_; | 953 GURL preferred_manifest_url_; |
| 954 std::set<int64> cache_ids_in_use_; | 954 std::set<int64_t> cache_ids_in_use_; |
| 955 AppCacheEntry entry_; | 955 AppCacheEntry entry_; |
| 956 AppCacheEntry fallback_entry_; | 956 AppCacheEntry fallback_entry_; |
| 957 GURL namespace_entry_url_; | 957 GURL namespace_entry_url_; |
| 958 int64 cache_id_; | 958 int64_t cache_id_; |
| 959 int64 group_id_; | 959 int64_t group_id_; |
| 960 GURL manifest_url_; | 960 GURL manifest_url_; |
| 961 }; | 961 }; |
| 962 | 962 |
| 963 void AppCacheStorageImpl::FindMainResponseTask::Run() { | 963 void AppCacheStorageImpl::FindMainResponseTask::Run() { |
| 964 tracked_objects::ScopedTracker tracking_profile( | 964 tracked_objects::ScopedTracker tracking_profile( |
| 965 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 965 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 966 "AppCacheStorageImpl::FindMainResponseTask")); | 966 "AppCacheStorageImpl::FindMainResponseTask")); |
| 967 // NOTE: The heuristics around choosing amoungst multiple candidates | 967 // NOTE: The heuristics around choosing amoungst multiple candidates |
| 968 // is underspecified, and just plain not fully understood. This needs | 968 // is underspecified, and just plain not fully understood. This needs |
| 969 // to be refined. | 969 // to be refined. |
| 970 | 970 |
| 971 // The 'preferred_manifest_url' is the url of the manifest associated | 971 // The 'preferred_manifest_url' is the url of the manifest associated |
| 972 // with the page that opened or embedded the page being loaded now. | 972 // with the page that opened or embedded the page being loaded now. |
| 973 // We have a strong preference to use resources from that cache. | 973 // We have a strong preference to use resources from that cache. |
| 974 // We also have a lesser bias to use resources from caches that are currently | 974 // We also have a lesser bias to use resources from caches that are currently |
| 975 // being used by other unrelated pages. | 975 // being used by other unrelated pages. |
| 976 // TODO(michaeln): come up with a 'preferred_manifest_url' in more cases | 976 // TODO(michaeln): come up with a 'preferred_manifest_url' in more cases |
| 977 // - when navigating a frame whose current contents are from an appcache | 977 // - when navigating a frame whose current contents are from an appcache |
| 978 // - when clicking an href in a frame that is appcached | 978 // - when clicking an href in a frame that is appcached |
| 979 int64 preferred_cache_id = kAppCacheNoCacheId; | 979 int64_t preferred_cache_id = kAppCacheNoCacheId; |
| 980 if (!preferred_manifest_url_.is_empty()) { | 980 if (!preferred_manifest_url_.is_empty()) { |
| 981 AppCacheDatabase::GroupRecord preferred_group; | 981 AppCacheDatabase::GroupRecord preferred_group; |
| 982 AppCacheDatabase::CacheRecord preferred_cache; | 982 AppCacheDatabase::CacheRecord preferred_cache; |
| 983 if (database_->FindGroupForManifestUrl( | 983 if (database_->FindGroupForManifestUrl( |
| 984 preferred_manifest_url_, &preferred_group) && | 984 preferred_manifest_url_, &preferred_group) && |
| 985 database_->FindCacheForGroup( | 985 database_->FindCacheForGroup( |
| 986 preferred_group.group_id, &preferred_cache)) { | 986 preferred_group.group_id, &preferred_cache)) { |
| 987 preferred_cache_id = preferred_cache.cache_id; | 987 preferred_cache_id = preferred_cache.cache_id; |
| 988 } | 988 } |
| 989 } | 989 } |
| 990 | 990 |
| 991 if (FindExactMatch(preferred_cache_id) || | 991 if (FindExactMatch(preferred_cache_id) || |
| 992 FindNamespaceMatch(preferred_cache_id)) { | 992 FindNamespaceMatch(preferred_cache_id)) { |
| 993 // We found something. | 993 // We found something. |
| 994 DCHECK(cache_id_ != kAppCacheNoCacheId && !manifest_url_.is_empty() && | 994 DCHECK(cache_id_ != kAppCacheNoCacheId && !manifest_url_.is_empty() && |
| 995 group_id_ != 0); | 995 group_id_ != 0); |
| 996 return; | 996 return; |
| 997 } | 997 } |
| 998 | 998 |
| 999 // We didn't find anything. | 999 // We didn't find anything. |
| 1000 DCHECK(cache_id_ == kAppCacheNoCacheId && manifest_url_.is_empty() && | 1000 DCHECK(cache_id_ == kAppCacheNoCacheId && manifest_url_.is_empty() && |
| 1001 group_id_ == 0); | 1001 group_id_ == 0); |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 bool AppCacheStorageImpl:: | 1004 bool AppCacheStorageImpl::FindMainResponseTask::FindExactMatch( |
| 1005 FindMainResponseTask::FindExactMatch(int64 preferred_cache_id) { | 1005 int64_t preferred_cache_id) { |
| 1006 std::vector<AppCacheDatabase::EntryRecord> entries; | 1006 std::vector<AppCacheDatabase::EntryRecord> entries; |
| 1007 if (database_->FindEntriesForUrl(url_, &entries) && !entries.empty()) { | 1007 if (database_->FindEntriesForUrl(url_, &entries) && !entries.empty()) { |
| 1008 // Sort them in order of preference, from the preferred_cache first, | 1008 // Sort them in order of preference, from the preferred_cache first, |
| 1009 // followed by hits from caches that are 'in use', then the rest. | 1009 // followed by hits from caches that are 'in use', then the rest. |
| 1010 std::sort(entries.begin(), entries.end(), | 1010 std::sort(entries.begin(), entries.end(), |
| 1011 SortByCachePreference(preferred_cache_id, cache_ids_in_use_)); | 1011 SortByCachePreference(preferred_cache_id, cache_ids_in_use_)); |
| 1012 | 1012 |
| 1013 // Take the first with a valid, non-foreign entry. | 1013 // Take the first with a valid, non-foreign entry. |
| 1014 std::vector<AppCacheDatabase::EntryRecord>::iterator iter; | 1014 std::vector<AppCacheDatabase::EntryRecord>::iterator iter; |
| 1015 for (iter = entries.begin(); iter < entries.end(); ++iter) { | 1015 for (iter = entries.begin(); iter < entries.end(); ++iter) { |
| 1016 AppCacheDatabase::GroupRecord group_record; | 1016 AppCacheDatabase::GroupRecord group_record; |
| 1017 if ((iter->flags & AppCacheEntry::FOREIGN) || | 1017 if ((iter->flags & AppCacheEntry::FOREIGN) || |
| 1018 !database_->FindGroupForCache(iter->cache_id, &group_record)) { | 1018 !database_->FindGroupForCache(iter->cache_id, &group_record)) { |
| 1019 continue; | 1019 continue; |
| 1020 } | 1020 } |
| 1021 manifest_url_ = group_record.manifest_url; | 1021 manifest_url_ = group_record.manifest_url; |
| 1022 group_id_ = group_record.group_id; | 1022 group_id_ = group_record.group_id; |
| 1023 entry_ = AppCacheEntry(iter->flags, iter->response_id); | 1023 entry_ = AppCacheEntry(iter->flags, iter->response_id); |
| 1024 cache_id_ = iter->cache_id; | 1024 cache_id_ = iter->cache_id; |
| 1025 return true; // We found an exact match. | 1025 return true; // We found an exact match. |
| 1026 } | 1026 } |
| 1027 } | 1027 } |
| 1028 return false; | 1028 return false; |
| 1029 } | 1029 } |
| 1030 | 1030 |
| 1031 bool AppCacheStorageImpl:: | 1031 bool AppCacheStorageImpl::FindMainResponseTask::FindNamespaceMatch( |
| 1032 FindMainResponseTask::FindNamespaceMatch(int64 preferred_cache_id) { | 1032 int64_t preferred_cache_id) { |
| 1033 AppCacheDatabase::NamespaceRecordVector all_intercepts; | 1033 AppCacheDatabase::NamespaceRecordVector all_intercepts; |
| 1034 AppCacheDatabase::NamespaceRecordVector all_fallbacks; | 1034 AppCacheDatabase::NamespaceRecordVector all_fallbacks; |
| 1035 if (!database_->FindNamespacesForOrigin( | 1035 if (!database_->FindNamespacesForOrigin( |
| 1036 url_.GetOrigin(), &all_intercepts, &all_fallbacks) | 1036 url_.GetOrigin(), &all_intercepts, &all_fallbacks) |
| 1037 || (all_intercepts.empty() && all_fallbacks.empty())) { | 1037 || (all_intercepts.empty() && all_fallbacks.empty())) { |
| 1038 return false; | 1038 return false; |
| 1039 } | 1039 } |
| 1040 | 1040 |
| 1041 NetworkNamespaceHelper network_namespace_helper(database_); | 1041 NetworkNamespaceHelper network_namespace_helper(database_); |
| 1042 if (FindNamespaceHelper(preferred_cache_id, | 1042 if (FindNamespaceHelper(preferred_cache_id, |
| 1043 &all_intercepts, | 1043 &all_intercepts, |
| 1044 &network_namespace_helper) || | 1044 &network_namespace_helper) || |
| 1045 FindNamespaceHelper(preferred_cache_id, | 1045 FindNamespaceHelper(preferred_cache_id, |
| 1046 &all_fallbacks, | 1046 &all_fallbacks, |
| 1047 &network_namespace_helper)) { | 1047 &network_namespace_helper)) { |
| 1048 return true; | 1048 return true; |
| 1049 } | 1049 } |
| 1050 return false; | 1050 return false; |
| 1051 } | 1051 } |
| 1052 | 1052 |
| 1053 bool AppCacheStorageImpl:: | 1053 bool AppCacheStorageImpl::FindMainResponseTask::FindNamespaceHelper( |
| 1054 FindMainResponseTask::FindNamespaceHelper( | 1054 int64_t preferred_cache_id, |
| 1055 int64 preferred_cache_id, | |
| 1056 AppCacheDatabase::NamespaceRecordVector* namespaces, | 1055 AppCacheDatabase::NamespaceRecordVector* namespaces, |
| 1057 NetworkNamespaceHelper* network_namespace_helper) { | 1056 NetworkNamespaceHelper* network_namespace_helper) { |
| 1058 // Sort them by length, longer matches within the same cache/bucket take | 1057 // Sort them by length, longer matches within the same cache/bucket take |
| 1059 // precedence. | 1058 // precedence. |
| 1060 std::sort(namespaces->begin(), namespaces->end(), SortByLength); | 1059 std::sort(namespaces->begin(), namespaces->end(), SortByLength); |
| 1061 | 1060 |
| 1062 NamespaceRecordPtrVector preferred_namespaces; | 1061 NamespaceRecordPtrVector preferred_namespaces; |
| 1063 NamespaceRecordPtrVector inuse_namespaces; | 1062 NamespaceRecordPtrVector inuse_namespaces; |
| 1064 NamespaceRecordPtrVector other_namespaces; | 1063 NamespaceRecordPtrVector other_namespaces; |
| 1065 std::vector<AppCacheDatabase::NamespaceRecord>::iterator iter; | 1064 std::vector<AppCacheDatabase::NamespaceRecord>::iterator iter; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 void AppCacheStorageImpl::FindMainResponseTask::RunCompleted() { | 1122 void AppCacheStorageImpl::FindMainResponseTask::RunCompleted() { |
| 1124 storage_->CallOnMainResponseFound( | 1123 storage_->CallOnMainResponseFound( |
| 1125 &delegates_, url_, entry_, namespace_entry_url_, fallback_entry_, | 1124 &delegates_, url_, entry_, namespace_entry_url_, fallback_entry_, |
| 1126 cache_id_, group_id_, manifest_url_); | 1125 cache_id_, group_id_, manifest_url_); |
| 1127 } | 1126 } |
| 1128 | 1127 |
| 1129 // MarkEntryAsForeignTask ------- | 1128 // MarkEntryAsForeignTask ------- |
| 1130 | 1129 |
| 1131 class AppCacheStorageImpl::MarkEntryAsForeignTask : public DatabaseTask { | 1130 class AppCacheStorageImpl::MarkEntryAsForeignTask : public DatabaseTask { |
| 1132 public: | 1131 public: |
| 1133 MarkEntryAsForeignTask( | 1132 MarkEntryAsForeignTask(AppCacheStorageImpl* storage, |
| 1134 AppCacheStorageImpl* storage, const GURL& url, int64 cache_id) | 1133 const GURL& url, |
| 1134 int64_t cache_id) |
| 1135 : DatabaseTask(storage), cache_id_(cache_id), entry_url_(url) {} | 1135 : DatabaseTask(storage), cache_id_(cache_id), entry_url_(url) {} |
| 1136 | 1136 |
| 1137 // DatabaseTask: | 1137 // DatabaseTask: |
| 1138 void Run() override; | 1138 void Run() override; |
| 1139 void RunCompleted() override; | 1139 void RunCompleted() override; |
| 1140 | 1140 |
| 1141 protected: | 1141 protected: |
| 1142 ~MarkEntryAsForeignTask() override {} | 1142 ~MarkEntryAsForeignTask() override {} |
| 1143 | 1143 |
| 1144 private: | 1144 private: |
| 1145 int64 cache_id_; | 1145 int64_t cache_id_; |
| 1146 GURL entry_url_; | 1146 GURL entry_url_; |
| 1147 }; | 1147 }; |
| 1148 | 1148 |
| 1149 void AppCacheStorageImpl::MarkEntryAsForeignTask::Run() { | 1149 void AppCacheStorageImpl::MarkEntryAsForeignTask::Run() { |
| 1150 database_->AddEntryFlags(entry_url_, cache_id_, AppCacheEntry::FOREIGN); | 1150 database_->AddEntryFlags(entry_url_, cache_id_, AppCacheEntry::FOREIGN); |
| 1151 } | 1151 } |
| 1152 | 1152 |
| 1153 void AppCacheStorageImpl::MarkEntryAsForeignTask::RunCompleted() { | 1153 void AppCacheStorageImpl::MarkEntryAsForeignTask::RunCompleted() { |
| 1154 DCHECK(storage_->pending_foreign_markings_.front().first == entry_url_ && | 1154 DCHECK(storage_->pending_foreign_markings_.front().first == entry_url_ && |
| 1155 storage_->pending_foreign_markings_.front().second == cache_id_); | 1155 storage_->pending_foreign_markings_.front().second == cache_id_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1167 // DatabaseTask: | 1167 // DatabaseTask: |
| 1168 void Run() override; | 1168 void Run() override; |
| 1169 void RunCompleted() override; | 1169 void RunCompleted() override; |
| 1170 void CancelCompletion() override; | 1170 void CancelCompletion() override; |
| 1171 | 1171 |
| 1172 protected: | 1172 protected: |
| 1173 ~MakeGroupObsoleteTask() override {} | 1173 ~MakeGroupObsoleteTask() override {} |
| 1174 | 1174 |
| 1175 private: | 1175 private: |
| 1176 scoped_refptr<AppCacheGroup> group_; | 1176 scoped_refptr<AppCacheGroup> group_; |
| 1177 int64 group_id_; | 1177 int64_t group_id_; |
| 1178 GURL origin_; | 1178 GURL origin_; |
| 1179 bool success_; | 1179 bool success_; |
| 1180 int response_code_; | 1180 int response_code_; |
| 1181 int64 new_origin_usage_; | 1181 int64_t new_origin_usage_; |
| 1182 std::vector<int64> newly_deletable_response_ids_; | 1182 std::vector<int64_t> newly_deletable_response_ids_; |
| 1183 }; | 1183 }; |
| 1184 | 1184 |
| 1185 AppCacheStorageImpl::MakeGroupObsoleteTask::MakeGroupObsoleteTask( | 1185 AppCacheStorageImpl::MakeGroupObsoleteTask::MakeGroupObsoleteTask( |
| 1186 AppCacheStorageImpl* storage, | 1186 AppCacheStorageImpl* storage, |
| 1187 AppCacheGroup* group, | 1187 AppCacheGroup* group, |
| 1188 int response_code) | 1188 int response_code) |
| 1189 : DatabaseTask(storage), | 1189 : DatabaseTask(storage), |
| 1190 group_(group), | 1190 group_(group), |
| 1191 group_id_(group->group_id()), | 1191 group_id_(group->group_id()), |
| 1192 origin_(group->manifest_url().GetOrigin()), | 1192 origin_(group->manifest_url().GetOrigin()), |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1243 // Overriden to safely drop our reference to the group | 1243 // Overriden to safely drop our reference to the group |
| 1244 // which is not thread safe refcounted. | 1244 // which is not thread safe refcounted. |
| 1245 DatabaseTask::CancelCompletion(); | 1245 DatabaseTask::CancelCompletion(); |
| 1246 group_ = NULL; | 1246 group_ = NULL; |
| 1247 } | 1247 } |
| 1248 | 1248 |
| 1249 // GetDeletableResponseIdsTask ------- | 1249 // GetDeletableResponseIdsTask ------- |
| 1250 | 1250 |
| 1251 class AppCacheStorageImpl::GetDeletableResponseIdsTask : public DatabaseTask { | 1251 class AppCacheStorageImpl::GetDeletableResponseIdsTask : public DatabaseTask { |
| 1252 public: | 1252 public: |
| 1253 GetDeletableResponseIdsTask(AppCacheStorageImpl* storage, int64 max_rowid) | 1253 GetDeletableResponseIdsTask(AppCacheStorageImpl* storage, int64_t max_rowid) |
| 1254 : DatabaseTask(storage), max_rowid_(max_rowid) {} | 1254 : DatabaseTask(storage), max_rowid_(max_rowid) {} |
| 1255 | 1255 |
| 1256 // DatabaseTask: | 1256 // DatabaseTask: |
| 1257 void Run() override; | 1257 void Run() override; |
| 1258 void RunCompleted() override; | 1258 void RunCompleted() override; |
| 1259 | 1259 |
| 1260 protected: | 1260 protected: |
| 1261 ~GetDeletableResponseIdsTask() override {} | 1261 ~GetDeletableResponseIdsTask() override {} |
| 1262 | 1262 |
| 1263 private: | 1263 private: |
| 1264 int64 max_rowid_; | 1264 int64_t max_rowid_; |
| 1265 std::vector<int64> response_ids_; | 1265 std::vector<int64_t> response_ids_; |
| 1266 }; | 1266 }; |
| 1267 | 1267 |
| 1268 void AppCacheStorageImpl::GetDeletableResponseIdsTask::Run() { | 1268 void AppCacheStorageImpl::GetDeletableResponseIdsTask::Run() { |
| 1269 const int kSqlLimit = 1000; | 1269 const int kSqlLimit = 1000; |
| 1270 database_->GetDeletableResponseIds(&response_ids_, max_rowid_, kSqlLimit); | 1270 database_->GetDeletableResponseIds(&response_ids_, max_rowid_, kSqlLimit); |
| 1271 // TODO(michaeln): retrieve group_ids too | 1271 // TODO(michaeln): retrieve group_ids too |
| 1272 } | 1272 } |
| 1273 | 1273 |
| 1274 void AppCacheStorageImpl::GetDeletableResponseIdsTask::RunCompleted() { | 1274 void AppCacheStorageImpl::GetDeletableResponseIdsTask::RunCompleted() { |
| 1275 if (!response_ids_.empty()) | 1275 if (!response_ids_.empty()) |
| 1276 storage_->StartDeletingResponses(response_ids_); | 1276 storage_->StartDeletingResponses(response_ids_); |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 // InsertDeletableResponseIdsTask ------- | 1279 // InsertDeletableResponseIdsTask ------- |
| 1280 | 1280 |
| 1281 class AppCacheStorageImpl::InsertDeletableResponseIdsTask | 1281 class AppCacheStorageImpl::InsertDeletableResponseIdsTask |
| 1282 : public DatabaseTask { | 1282 : public DatabaseTask { |
| 1283 public: | 1283 public: |
| 1284 explicit InsertDeletableResponseIdsTask(AppCacheStorageImpl* storage) | 1284 explicit InsertDeletableResponseIdsTask(AppCacheStorageImpl* storage) |
| 1285 : DatabaseTask(storage) {} | 1285 : DatabaseTask(storage) {} |
| 1286 | 1286 |
| 1287 // DatabaseTask: | 1287 // DatabaseTask: |
| 1288 void Run() override; | 1288 void Run() override; |
| 1289 | 1289 |
| 1290 std::vector<int64> response_ids_; | 1290 std::vector<int64_t> response_ids_; |
| 1291 | 1291 |
| 1292 protected: | 1292 protected: |
| 1293 ~InsertDeletableResponseIdsTask() override {} | 1293 ~InsertDeletableResponseIdsTask() override {} |
| 1294 }; | 1294 }; |
| 1295 | 1295 |
| 1296 void AppCacheStorageImpl::InsertDeletableResponseIdsTask::Run() { | 1296 void AppCacheStorageImpl::InsertDeletableResponseIdsTask::Run() { |
| 1297 database_->InsertDeletableResponseIds(response_ids_); | 1297 database_->InsertDeletableResponseIds(response_ids_); |
| 1298 // TODO(michaeln): store group_ids too | 1298 // TODO(michaeln): store group_ids too |
| 1299 } | 1299 } |
| 1300 | 1300 |
| 1301 // DeleteDeletableResponseIdsTask ------- | 1301 // DeleteDeletableResponseIdsTask ------- |
| 1302 | 1302 |
| 1303 class AppCacheStorageImpl::DeleteDeletableResponseIdsTask | 1303 class AppCacheStorageImpl::DeleteDeletableResponseIdsTask |
| 1304 : public DatabaseTask { | 1304 : public DatabaseTask { |
| 1305 public: | 1305 public: |
| 1306 explicit DeleteDeletableResponseIdsTask(AppCacheStorageImpl* storage) | 1306 explicit DeleteDeletableResponseIdsTask(AppCacheStorageImpl* storage) |
| 1307 : DatabaseTask(storage) {} | 1307 : DatabaseTask(storage) {} |
| 1308 | 1308 |
| 1309 // DatabaseTask: | 1309 // DatabaseTask: |
| 1310 void Run() override; | 1310 void Run() override; |
| 1311 | 1311 |
| 1312 std::vector<int64> response_ids_; | 1312 std::vector<int64_t> response_ids_; |
| 1313 | 1313 |
| 1314 protected: | 1314 protected: |
| 1315 ~DeleteDeletableResponseIdsTask() override {} | 1315 ~DeleteDeletableResponseIdsTask() override {} |
| 1316 }; | 1316 }; |
| 1317 | 1317 |
| 1318 void AppCacheStorageImpl::DeleteDeletableResponseIdsTask::Run() { | 1318 void AppCacheStorageImpl::DeleteDeletableResponseIdsTask::Run() { |
| 1319 database_->DeleteDeletableResponseIds(response_ids_); | 1319 database_->DeleteDeletableResponseIds(response_ids_); |
| 1320 } | 1320 } |
| 1321 | 1321 |
| 1322 // LazyUpdateLastAccessTimeTask ------- | 1322 // LazyUpdateLastAccessTimeTask ------- |
| 1323 | 1323 |
| 1324 class AppCacheStorageImpl::LazyUpdateLastAccessTimeTask | 1324 class AppCacheStorageImpl::LazyUpdateLastAccessTimeTask |
| 1325 : public DatabaseTask { | 1325 : public DatabaseTask { |
| 1326 public: | 1326 public: |
| 1327 LazyUpdateLastAccessTimeTask( | 1327 LazyUpdateLastAccessTimeTask( |
| 1328 AppCacheStorageImpl* storage, AppCacheGroup* group, base::Time time) | 1328 AppCacheStorageImpl* storage, AppCacheGroup* group, base::Time time) |
| 1329 : DatabaseTask(storage), group_id_(group->group_id()), | 1329 : DatabaseTask(storage), group_id_(group->group_id()), |
| 1330 last_access_time_(time) { | 1330 last_access_time_(time) { |
| 1331 storage->NotifyStorageAccessed(group->manifest_url().GetOrigin()); | 1331 storage->NotifyStorageAccessed(group->manifest_url().GetOrigin()); |
| 1332 } | 1332 } |
| 1333 | 1333 |
| 1334 // DatabaseTask: | 1334 // DatabaseTask: |
| 1335 void Run() override; | 1335 void Run() override; |
| 1336 void RunCompleted() override; | 1336 void RunCompleted() override; |
| 1337 | 1337 |
| 1338 protected: | 1338 protected: |
| 1339 ~LazyUpdateLastAccessTimeTask() override {} | 1339 ~LazyUpdateLastAccessTimeTask() override {} |
| 1340 | 1340 |
| 1341 private: | 1341 private: |
| 1342 int64 group_id_; | 1342 int64_t group_id_; |
| 1343 base::Time last_access_time_; | 1343 base::Time last_access_time_; |
| 1344 }; | 1344 }; |
| 1345 | 1345 |
| 1346 void AppCacheStorageImpl::LazyUpdateLastAccessTimeTask::Run() { | 1346 void AppCacheStorageImpl::LazyUpdateLastAccessTimeTask::Run() { |
| 1347 tracked_objects::ScopedTracker tracking_profile( | 1347 tracked_objects::ScopedTracker tracking_profile( |
| 1348 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1348 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1349 "AppCacheStorageImpl::LazyUpdateLastAccessTimeTask")); | 1349 "AppCacheStorageImpl::LazyUpdateLastAccessTimeTask")); |
| 1350 database_->LazyUpdateLastAccessTime(group_id_, last_access_time_); | 1350 database_->LazyUpdateLastAccessTime(group_id_, last_access_time_); |
| 1351 } | 1351 } |
| 1352 | 1352 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1386 first_evictable_error_time_(group->first_evictable_error_time()) { | 1386 first_evictable_error_time_(group->first_evictable_error_time()) { |
| 1387 } | 1387 } |
| 1388 | 1388 |
| 1389 // DatabaseTask: | 1389 // DatabaseTask: |
| 1390 void Run() override; | 1390 void Run() override; |
| 1391 | 1391 |
| 1392 protected: | 1392 protected: |
| 1393 ~UpdateEvictionTimesTask() override {} | 1393 ~UpdateEvictionTimesTask() override {} |
| 1394 | 1394 |
| 1395 private: | 1395 private: |
| 1396 int64 group_id_; | 1396 int64_t group_id_; |
| 1397 base::Time last_full_update_check_time_; | 1397 base::Time last_full_update_check_time_; |
| 1398 base::Time first_evictable_error_time_; | 1398 base::Time first_evictable_error_time_; |
| 1399 }; | 1399 }; |
| 1400 | 1400 |
| 1401 void AppCacheStorageImpl::UpdateEvictionTimesTask::Run() { | 1401 void AppCacheStorageImpl::UpdateEvictionTimesTask::Run() { |
| 1402 tracked_objects::ScopedTracker tracking_profile( | 1402 tracked_objects::ScopedTracker tracking_profile( |
| 1403 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1403 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1404 "AppCacheStorageImpl::UpdateEvictionTimes")); | 1404 "AppCacheStorageImpl::UpdateEvictionTimes")); |
| 1405 database_->UpdateEvictionTimes(group_id_, | 1405 database_->UpdateEvictionTimes(group_id_, |
| 1406 last_full_update_check_time_, | 1406 last_full_update_check_time_, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1474 task->Schedule(); | 1474 task->Schedule(); |
| 1475 } | 1475 } |
| 1476 | 1476 |
| 1477 void AppCacheStorageImpl::GetAllInfo(Delegate* delegate) { | 1477 void AppCacheStorageImpl::GetAllInfo(Delegate* delegate) { |
| 1478 DCHECK(delegate); | 1478 DCHECK(delegate); |
| 1479 scoped_refptr<GetAllInfoTask> task(new GetAllInfoTask(this)); | 1479 scoped_refptr<GetAllInfoTask> task(new GetAllInfoTask(this)); |
| 1480 task->AddDelegate(GetOrCreateDelegateReference(delegate)); | 1480 task->AddDelegate(GetOrCreateDelegateReference(delegate)); |
| 1481 task->Schedule(); | 1481 task->Schedule(); |
| 1482 } | 1482 } |
| 1483 | 1483 |
| 1484 void AppCacheStorageImpl::LoadCache(int64 id, Delegate* delegate) { | 1484 void AppCacheStorageImpl::LoadCache(int64_t id, Delegate* delegate) { |
| 1485 DCHECK(delegate); | 1485 DCHECK(delegate); |
| 1486 if (is_disabled_) { | 1486 if (is_disabled_) { |
| 1487 delegate->OnCacheLoaded(NULL, id); | 1487 delegate->OnCacheLoaded(NULL, id); |
| 1488 return; | 1488 return; |
| 1489 } | 1489 } |
| 1490 | 1490 |
| 1491 AppCache* cache = working_set_.GetCache(id); | 1491 AppCache* cache = working_set_.GetCache(id); |
| 1492 if (cache) { | 1492 if (cache) { |
| 1493 delegate->OnCacheLoaded(cache, id); | 1493 delegate->OnCacheLoaded(cache, id); |
| 1494 if (cache->owning_group()) { | 1494 if (cache->owning_group()) { |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1660 &delegates, url, found_entry, | 1660 &delegates, url, found_entry, |
| 1661 GURL(), AppCacheEntry(), | 1661 GURL(), AppCacheEntry(), |
| 1662 cache.get() ? cache->cache_id() : kAppCacheNoCacheId, | 1662 cache.get() ? cache->cache_id() : kAppCacheNoCacheId, |
| 1663 group.get() ? group->group_id() : kAppCacheNoCacheId, | 1663 group.get() ? group->group_id() : kAppCacheNoCacheId, |
| 1664 group.get() ? group->manifest_url() : GURL()); | 1664 group.get() ? group->manifest_url() : GURL()); |
| 1665 } | 1665 } |
| 1666 } | 1666 } |
| 1667 | 1667 |
| 1668 void AppCacheStorageImpl::CallOnMainResponseFound( | 1668 void AppCacheStorageImpl::CallOnMainResponseFound( |
| 1669 DelegateReferenceVector* delegates, | 1669 DelegateReferenceVector* delegates, |
| 1670 const GURL& url, const AppCacheEntry& entry, | 1670 const GURL& url, |
| 1671 const GURL& namespace_entry_url, const AppCacheEntry& fallback_entry, | 1671 const AppCacheEntry& entry, |
| 1672 int64 cache_id, int64 group_id, const GURL& manifest_url) { | 1672 const GURL& namespace_entry_url, |
| 1673 const AppCacheEntry& fallback_entry, |
| 1674 int64_t cache_id, |
| 1675 int64_t group_id, |
| 1676 const GURL& manifest_url) { |
| 1673 FOR_EACH_DELEGATE( | 1677 FOR_EACH_DELEGATE( |
| 1674 (*delegates), | 1678 (*delegates), |
| 1675 OnMainResponseFound(url, entry, | 1679 OnMainResponseFound(url, entry, |
| 1676 namespace_entry_url, fallback_entry, | 1680 namespace_entry_url, fallback_entry, |
| 1677 cache_id, group_id, manifest_url)); | 1681 cache_id, group_id, manifest_url)); |
| 1678 } | 1682 } |
| 1679 | 1683 |
| 1680 void AppCacheStorageImpl::FindResponseForSubRequest( | 1684 void AppCacheStorageImpl::FindResponseForSubRequest( |
| 1681 AppCache* cache, const GURL& url, | 1685 AppCache* cache, const GURL& url, |
| 1682 AppCacheEntry* found_entry, AppCacheEntry* found_fallback_entry, | 1686 AppCacheEntry* found_entry, AppCacheEntry* found_fallback_entry, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1694 } | 1698 } |
| 1695 | 1699 |
| 1696 GURL fallback_namespace_not_used; | 1700 GURL fallback_namespace_not_used; |
| 1697 GURL intercept_namespace_not_used; | 1701 GURL intercept_namespace_not_used; |
| 1698 cache->FindResponseForRequest( | 1702 cache->FindResponseForRequest( |
| 1699 url, found_entry, &intercept_namespace_not_used, | 1703 url, found_entry, &intercept_namespace_not_used, |
| 1700 found_fallback_entry, &fallback_namespace_not_used, | 1704 found_fallback_entry, &fallback_namespace_not_used, |
| 1701 found_network_namespace); | 1705 found_network_namespace); |
| 1702 } | 1706 } |
| 1703 | 1707 |
| 1704 void AppCacheStorageImpl::MarkEntryAsForeign( | 1708 void AppCacheStorageImpl::MarkEntryAsForeign(const GURL& entry_url, |
| 1705 const GURL& entry_url, int64 cache_id) { | 1709 int64_t cache_id) { |
| 1706 AppCache* cache = working_set_.GetCache(cache_id); | 1710 AppCache* cache = working_set_.GetCache(cache_id); |
| 1707 if (cache) { | 1711 if (cache) { |
| 1708 AppCacheEntry* entry = cache->GetEntry(entry_url); | 1712 AppCacheEntry* entry = cache->GetEntry(entry_url); |
| 1709 DCHECK(entry); | 1713 DCHECK(entry); |
| 1710 if (entry) | 1714 if (entry) |
| 1711 entry->add_types(AppCacheEntry::FOREIGN); | 1715 entry->add_types(AppCacheEntry::FOREIGN); |
| 1712 } | 1716 } |
| 1713 scoped_refptr<MarkEntryAsForeignTask> task( | 1717 scoped_refptr<MarkEntryAsForeignTask> task( |
| 1714 new MarkEntryAsForeignTask(this, entry_url, cache_id)); | 1718 new MarkEntryAsForeignTask(this, entry_url, cache_id)); |
| 1715 task->Schedule(); | 1719 task->Schedule(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1726 task->Schedule(); | 1730 task->Schedule(); |
| 1727 } | 1731 } |
| 1728 | 1732 |
| 1729 void AppCacheStorageImpl::StoreEvictionTimes(AppCacheGroup* group) { | 1733 void AppCacheStorageImpl::StoreEvictionTimes(AppCacheGroup* group) { |
| 1730 scoped_refptr<UpdateEvictionTimesTask> task( | 1734 scoped_refptr<UpdateEvictionTimesTask> task( |
| 1731 new UpdateEvictionTimesTask(this, group)); | 1735 new UpdateEvictionTimesTask(this, group)); |
| 1732 task->Schedule(); | 1736 task->Schedule(); |
| 1733 } | 1737 } |
| 1734 | 1738 |
| 1735 AppCacheResponseReader* AppCacheStorageImpl::CreateResponseReader( | 1739 AppCacheResponseReader* AppCacheStorageImpl::CreateResponseReader( |
| 1736 const GURL& manifest_url, int64 group_id, int64 response_id) { | 1740 const GURL& manifest_url, |
| 1741 int64_t group_id, |
| 1742 int64_t response_id) { |
| 1737 return new AppCacheResponseReader(response_id, group_id, disk_cache()); | 1743 return new AppCacheResponseReader(response_id, group_id, disk_cache()); |
| 1738 } | 1744 } |
| 1739 | 1745 |
| 1740 AppCacheResponseWriter* AppCacheStorageImpl::CreateResponseWriter( | 1746 AppCacheResponseWriter* AppCacheStorageImpl::CreateResponseWriter( |
| 1741 const GURL& manifest_url, int64 group_id) { | 1747 const GURL& manifest_url, |
| 1748 int64_t group_id) { |
| 1742 return new AppCacheResponseWriter(NewResponseId(), group_id, disk_cache()); | 1749 return new AppCacheResponseWriter(NewResponseId(), group_id, disk_cache()); |
| 1743 } | 1750 } |
| 1744 | 1751 |
| 1745 AppCacheResponseMetadataWriter* | 1752 AppCacheResponseMetadataWriter* |
| 1746 AppCacheStorageImpl::CreateResponseMetadataWriter(int64 group_id, | 1753 AppCacheStorageImpl::CreateResponseMetadataWriter(int64_t group_id, |
| 1747 int64 response_id) { | 1754 int64_t response_id) { |
| 1748 return new AppCacheResponseMetadataWriter(response_id, group_id, | 1755 return new AppCacheResponseMetadataWriter(response_id, group_id, |
| 1749 disk_cache()); | 1756 disk_cache()); |
| 1750 } | 1757 } |
| 1751 | 1758 |
| 1752 void AppCacheStorageImpl::DoomResponses( | 1759 void AppCacheStorageImpl::DoomResponses( |
| 1753 const GURL& manifest_url, const std::vector<int64>& response_ids) { | 1760 const GURL& manifest_url, |
| 1761 const std::vector<int64_t>& response_ids) { |
| 1754 if (response_ids.empty()) | 1762 if (response_ids.empty()) |
| 1755 return; | 1763 return; |
| 1756 | 1764 |
| 1757 // Start deleting them from the disk cache lazily. | 1765 // Start deleting them from the disk cache lazily. |
| 1758 StartDeletingResponses(response_ids); | 1766 StartDeletingResponses(response_ids); |
| 1759 | 1767 |
| 1760 // Also schedule a database task to record these ids in the | 1768 // Also schedule a database task to record these ids in the |
| 1761 // deletable responses table. | 1769 // deletable responses table. |
| 1762 // TODO(michaeln): There is a race here. If the browser crashes | 1770 // TODO(michaeln): There is a race here. If the browser crashes |
| 1763 // prior to committing these rows to the database and prior to us | 1771 // prior to committing these rows to the database and prior to us |
| 1764 // having deleted them from the disk cache, we'll never delete them. | 1772 // having deleted them from the disk cache, we'll never delete them. |
| 1765 scoped_refptr<InsertDeletableResponseIdsTask> task( | 1773 scoped_refptr<InsertDeletableResponseIdsTask> task( |
| 1766 new InsertDeletableResponseIdsTask(this)); | 1774 new InsertDeletableResponseIdsTask(this)); |
| 1767 task->response_ids_ = response_ids; | 1775 task->response_ids_ = response_ids; |
| 1768 task->Schedule(); | 1776 task->Schedule(); |
| 1769 } | 1777 } |
| 1770 | 1778 |
| 1771 void AppCacheStorageImpl::DeleteResponses( | 1779 void AppCacheStorageImpl::DeleteResponses( |
| 1772 const GURL& manifest_url, const std::vector<int64>& response_ids) { | 1780 const GURL& manifest_url, |
| 1781 const std::vector<int64_t>& response_ids) { |
| 1773 if (response_ids.empty()) | 1782 if (response_ids.empty()) |
| 1774 return; | 1783 return; |
| 1775 StartDeletingResponses(response_ids); | 1784 StartDeletingResponses(response_ids); |
| 1776 } | 1785 } |
| 1777 | 1786 |
| 1778 void AppCacheStorageImpl::DelayedStartDeletingUnusedResponses() { | 1787 void AppCacheStorageImpl::DelayedStartDeletingUnusedResponses() { |
| 1779 // Only if we haven't already begun. | 1788 // Only if we haven't already begun. |
| 1780 if (!did_start_deleting_responses_) { | 1789 if (!did_start_deleting_responses_) { |
| 1781 scoped_refptr<GetDeletableResponseIdsTask> task( | 1790 scoped_refptr<GetDeletableResponseIdsTask> task( |
| 1782 new GetDeletableResponseIdsTask(this, last_deletable_response_rowid_)); | 1791 new GetDeletableResponseIdsTask(this, last_deletable_response_rowid_)); |
| 1783 task->Schedule(); | 1792 task->Schedule(); |
| 1784 } | 1793 } |
| 1785 } | 1794 } |
| 1786 | 1795 |
| 1787 void AppCacheStorageImpl::StartDeletingResponses( | 1796 void AppCacheStorageImpl::StartDeletingResponses( |
| 1788 const std::vector<int64>& response_ids) { | 1797 const std::vector<int64_t>& response_ids) { |
| 1789 DCHECK(!response_ids.empty()); | 1798 DCHECK(!response_ids.empty()); |
| 1790 did_start_deleting_responses_ = true; | 1799 did_start_deleting_responses_ = true; |
| 1791 deletable_response_ids_.insert( | 1800 deletable_response_ids_.insert( |
| 1792 deletable_response_ids_.end(), | 1801 deletable_response_ids_.end(), |
| 1793 response_ids.begin(), response_ids.end()); | 1802 response_ids.begin(), response_ids.end()); |
| 1794 if (!is_response_deletion_scheduled_) | 1803 if (!is_response_deletion_scheduled_) |
| 1795 ScheduleDeleteOneResponse(); | 1804 ScheduleDeleteOneResponse(); |
| 1796 } | 1805 } |
| 1797 | 1806 |
| 1798 void AppCacheStorageImpl::ScheduleDeleteOneResponse() { | 1807 void AppCacheStorageImpl::ScheduleDeleteOneResponse() { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1811 | 1820 |
| 1812 if (!disk_cache()) { | 1821 if (!disk_cache()) { |
| 1813 DCHECK(is_disabled_); | 1822 DCHECK(is_disabled_); |
| 1814 deletable_response_ids_.clear(); | 1823 deletable_response_ids_.clear(); |
| 1815 deleted_response_ids_.clear(); | 1824 deleted_response_ids_.clear(); |
| 1816 is_response_deletion_scheduled_ = false; | 1825 is_response_deletion_scheduled_ = false; |
| 1817 return; | 1826 return; |
| 1818 } | 1827 } |
| 1819 | 1828 |
| 1820 // TODO(michaeln): add group_id to DoomEntry args | 1829 // TODO(michaeln): add group_id to DoomEntry args |
| 1821 int64 id = deletable_response_ids_.front(); | 1830 int64_t id = deletable_response_ids_.front(); |
| 1822 int rv = disk_cache_->DoomEntry( | 1831 int rv = disk_cache_->DoomEntry( |
| 1823 id, base::Bind(&AppCacheStorageImpl::OnDeletedOneResponse, | 1832 id, base::Bind(&AppCacheStorageImpl::OnDeletedOneResponse, |
| 1824 base::Unretained(this))); | 1833 base::Unretained(this))); |
| 1825 if (rv != net::ERR_IO_PENDING) | 1834 if (rv != net::ERR_IO_PENDING) |
| 1826 OnDeletedOneResponse(rv); | 1835 OnDeletedOneResponse(rv); |
| 1827 } | 1836 } |
| 1828 | 1837 |
| 1829 void AppCacheStorageImpl::OnDeletedOneResponse(int rv) { | 1838 void AppCacheStorageImpl::OnDeletedOneResponse(int rv) { |
| 1830 is_response_deletion_scheduled_ = false; | 1839 is_response_deletion_scheduled_ = false; |
| 1831 if (is_disabled_) | 1840 if (is_disabled_) |
| 1832 return; | 1841 return; |
| 1833 | 1842 |
| 1834 int64 id = deletable_response_ids_.front(); | 1843 int64_t id = deletable_response_ids_.front(); |
| 1835 deletable_response_ids_.pop_front(); | 1844 deletable_response_ids_.pop_front(); |
| 1836 if (rv != net::ERR_ABORTED) | 1845 if (rv != net::ERR_ABORTED) |
| 1837 deleted_response_ids_.push_back(id); | 1846 deleted_response_ids_.push_back(id); |
| 1838 | 1847 |
| 1839 const size_t kBatchSize = 50U; | 1848 const size_t kBatchSize = 50U; |
| 1840 if (deleted_response_ids_.size() >= kBatchSize || | 1849 if (deleted_response_ids_.size() >= kBatchSize || |
| 1841 deletable_response_ids_.empty()) { | 1850 deletable_response_ids_.empty()) { |
| 1842 scoped_refptr<DeleteDeletableResponseIdsTask> task( | 1851 scoped_refptr<DeleteDeletableResponseIdsTask> task( |
| 1843 new DeleteDeletableResponseIdsTask(this)); | 1852 new DeleteDeletableResponseIdsTask(this)); |
| 1844 task->response_ids_.swap(deleted_response_ids_); | 1853 task->response_ids_.swap(deleted_response_ids_); |
| 1845 task->Schedule(); | 1854 task->Schedule(); |
| 1846 } | 1855 } |
| 1847 | 1856 |
| 1848 if (deletable_response_ids_.empty()) { | 1857 if (deletable_response_ids_.empty()) { |
| 1849 scoped_refptr<GetDeletableResponseIdsTask> task( | 1858 scoped_refptr<GetDeletableResponseIdsTask> task( |
| 1850 new GetDeletableResponseIdsTask(this, last_deletable_response_rowid_)); | 1859 new GetDeletableResponseIdsTask(this, last_deletable_response_rowid_)); |
| 1851 task->Schedule(); | 1860 task->Schedule(); |
| 1852 return; | 1861 return; |
| 1853 } | 1862 } |
| 1854 | 1863 |
| 1855 ScheduleDeleteOneResponse(); | 1864 ScheduleDeleteOneResponse(); |
| 1856 } | 1865 } |
| 1857 | 1866 |
| 1858 AppCacheStorageImpl::CacheLoadTask* | 1867 AppCacheStorageImpl::CacheLoadTask* |
| 1859 AppCacheStorageImpl::GetPendingCacheLoadTask(int64 cache_id) { | 1868 AppCacheStorageImpl::GetPendingCacheLoadTask(int64_t cache_id) { |
| 1860 PendingCacheLoads::iterator found = pending_cache_loads_.find(cache_id); | 1869 PendingCacheLoads::iterator found = pending_cache_loads_.find(cache_id); |
| 1861 if (found != pending_cache_loads_.end()) | 1870 if (found != pending_cache_loads_.end()) |
| 1862 return found->second; | 1871 return found->second; |
| 1863 return NULL; | 1872 return NULL; |
| 1864 } | 1873 } |
| 1865 | 1874 |
| 1866 AppCacheStorageImpl::GroupLoadTask* | 1875 AppCacheStorageImpl::GroupLoadTask* |
| 1867 AppCacheStorageImpl::GetPendingGroupLoadTask(const GURL& manifest_url) { | 1876 AppCacheStorageImpl::GetPendingGroupLoadTask(const GURL& manifest_url) { |
| 1868 PendingGroupLoads::iterator found = pending_group_loads_.find(manifest_url); | 1877 PendingGroupLoads::iterator found = pending_group_loads_.find(manifest_url); |
| 1869 if (found != pending_group_loads_.end()) | 1878 if (found != pending_group_loads_.end()) |
| 1870 return found->second; | 1879 return found->second; |
| 1871 return NULL; | 1880 return NULL; |
| 1872 } | 1881 } |
| 1873 | 1882 |
| 1874 void AppCacheStorageImpl::GetPendingForeignMarkingsForCache( | 1883 void AppCacheStorageImpl::GetPendingForeignMarkingsForCache( |
| 1875 int64 cache_id, std::vector<GURL>* urls) { | 1884 int64_t cache_id, |
| 1885 std::vector<GURL>* urls) { |
| 1876 PendingForeignMarkings::iterator iter = pending_foreign_markings_.begin(); | 1886 PendingForeignMarkings::iterator iter = pending_foreign_markings_.begin(); |
| 1877 while (iter != pending_foreign_markings_.end()) { | 1887 while (iter != pending_foreign_markings_.end()) { |
| 1878 if (iter->second == cache_id) | 1888 if (iter->second == cache_id) |
| 1879 urls->push_back(iter->first); | 1889 urls->push_back(iter->first); |
| 1880 ++iter; | 1890 ++iter; |
| 1881 } | 1891 } |
| 1882 } | 1892 } |
| 1883 | 1893 |
| 1884 void AppCacheStorageImpl::ScheduleSimpleTask(const base::Closure& task) { | 1894 void AppCacheStorageImpl::ScheduleSimpleTask(const base::Closure& task) { |
| 1885 pending_simple_tasks_.push_back(task); | 1895 pending_simple_tasks_.push_back(task); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1979 | 1989 |
| 1980 void AppCacheStorageImpl::OnLazyCommitTimer() { | 1990 void AppCacheStorageImpl::OnLazyCommitTimer() { |
| 1981 lazy_commit_timer_.Stop(); | 1991 lazy_commit_timer_.Stop(); |
| 1982 if (is_disabled()) | 1992 if (is_disabled()) |
| 1983 return; | 1993 return; |
| 1984 scoped_refptr<DatabaseTask> task(new CommitLastAccessTimesTask(this)); | 1994 scoped_refptr<DatabaseTask> task(new CommitLastAccessTimesTask(this)); |
| 1985 task->Schedule(); | 1995 task->Schedule(); |
| 1986 } | 1996 } |
| 1987 | 1997 |
| 1988 } // namespace content | 1998 } // namespace content |
| OLD | NEW |