| 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/appcache/appcache_storage_impl.h" | 5 #include "webkit/appcache/appcache_storage_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 std::vector<int64>* deletable_response_ids) { | 55 std::vector<int64>* deletable_response_ids) { |
| 56 AppCacheDatabase::CacheRecord cache_record; | 56 AppCacheDatabase::CacheRecord cache_record; |
| 57 bool success = false; | 57 bool success = false; |
| 58 if (database->FindCacheForGroup(group_id, &cache_record)) { | 58 if (database->FindCacheForGroup(group_id, &cache_record)) { |
| 59 database->FindResponseIdsForCacheAsVector(cache_record.cache_id, | 59 database->FindResponseIdsForCacheAsVector(cache_record.cache_id, |
| 60 deletable_response_ids); | 60 deletable_response_ids); |
| 61 success = | 61 success = |
| 62 database->DeleteGroup(group_id) && | 62 database->DeleteGroup(group_id) && |
| 63 database->DeleteCache(cache_record.cache_id) && | 63 database->DeleteCache(cache_record.cache_id) && |
| 64 database->DeleteEntriesForCache(cache_record.cache_id) && | 64 database->DeleteEntriesForCache(cache_record.cache_id) && |
| 65 database->DeleteFallbackNameSpacesForCache(cache_record.cache_id) && | 65 database->DeleteNamespacesForCache(cache_record.cache_id) && |
| 66 database->DeleteOnlineWhiteListForCache(cache_record.cache_id) && | 66 database->DeleteOnlineWhiteListForCache(cache_record.cache_id) && |
| 67 database->InsertDeletableResponseIds(*deletable_response_ids); | 67 database->InsertDeletableResponseIds(*deletable_response_ids); |
| 68 } else { | 68 } else { |
| 69 NOTREACHED() << "A existing group without a cache is unexpected"; | 69 NOTREACHED() << "A existing group without a cache is unexpected"; |
| 70 success = database->DeleteGroup(group_id); | 70 success = database->DeleteGroup(group_id); |
| 71 } | 71 } |
| 72 return success; | 72 return success; |
| 73 } | 73 } |
| 74 | 74 |
| 75 // Deletes all appcache data (if clear_all_data is true), or session-only | 75 // Deletes all appcache data (if clear_all_data is true), or session-only |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 explicit StoreOrLoadTask(AppCacheStorageImpl* storage) | 362 explicit StoreOrLoadTask(AppCacheStorageImpl* storage) |
| 363 : DatabaseTask(storage) {} | 363 : DatabaseTask(storage) {} |
| 364 | 364 |
| 365 bool FindRelatedCacheRecords(int64 cache_id); | 365 bool FindRelatedCacheRecords(int64 cache_id); |
| 366 void CreateCacheAndGroupFromRecords( | 366 void CreateCacheAndGroupFromRecords( |
| 367 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group); | 367 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group); |
| 368 | 368 |
| 369 AppCacheDatabase::GroupRecord group_record_; | 369 AppCacheDatabase::GroupRecord group_record_; |
| 370 AppCacheDatabase::CacheRecord cache_record_; | 370 AppCacheDatabase::CacheRecord cache_record_; |
| 371 std::vector<AppCacheDatabase::EntryRecord> entry_records_; | 371 std::vector<AppCacheDatabase::EntryRecord> entry_records_; |
| 372 std::vector<AppCacheDatabase::FallbackNameSpaceRecord> | 372 std::vector<AppCacheDatabase::NamespaceRecord> |
| 373 intercept_namespace_records_; |
| 374 std::vector<AppCacheDatabase::NamespaceRecord> |
| 373 fallback_namespace_records_; | 375 fallback_namespace_records_; |
| 374 std::vector<AppCacheDatabase::OnlineWhiteListRecord> | 376 std::vector<AppCacheDatabase::OnlineWhiteListRecord> |
| 375 online_whitelist_records_; | 377 online_whitelist_records_; |
| 376 }; | 378 }; |
| 377 | 379 |
| 378 bool AppCacheStorageImpl::StoreOrLoadTask::FindRelatedCacheRecords( | 380 bool AppCacheStorageImpl::StoreOrLoadTask::FindRelatedCacheRecords( |
| 379 int64 cache_id) { | 381 int64 cache_id) { |
| 380 return database_->FindEntriesForCache(cache_id, &entry_records_) && | 382 return database_->FindEntriesForCache(cache_id, &entry_records_) && |
| 381 database_->FindFallbackNameSpacesForCache( | 383 database_->FindNamespacesForCache( |
| 382 cache_id, &fallback_namespace_records_) && | 384 cache_id, &intercept_namespace_records_, |
| 385 &fallback_namespace_records_) && |
| 383 database_->FindOnlineWhiteListForCache( | 386 database_->FindOnlineWhiteListForCache( |
| 384 cache_id, &online_whitelist_records_); | 387 cache_id, &online_whitelist_records_); |
| 385 } | 388 } |
| 386 | 389 |
| 387 void AppCacheStorageImpl::StoreOrLoadTask::CreateCacheAndGroupFromRecords( | 390 void AppCacheStorageImpl::StoreOrLoadTask::CreateCacheAndGroupFromRecords( |
| 388 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group) { | 391 scoped_refptr<AppCache>* cache, scoped_refptr<AppCacheGroup>* group) { |
| 389 DCHECK(storage_ && cache && group); | 392 DCHECK(storage_ && cache && group); |
| 390 | 393 |
| 391 (*cache) = storage_->working_set_.GetCache(cache_record_.cache_id); | 394 (*cache) = storage_->working_set_.GetCache(cache_record_.cache_id); |
| 392 if (cache->get()) { | 395 if (cache->get()) { |
| 393 (*group) = cache->get()->owning_group(); | 396 (*group) = cache->get()->owning_group(); |
| 394 DCHECK(group->get()); | 397 DCHECK(group->get()); |
| 395 DCHECK_EQ(group_record_.group_id, group->get()->group_id()); | 398 DCHECK_EQ(group_record_.group_id, group->get()->group_id()); |
| 396 storage_->NotifyStorageAccessed(group_record_.origin); | 399 storage_->NotifyStorageAccessed(group_record_.origin); |
| 397 return; | 400 return; |
| 398 } | 401 } |
| 399 | 402 |
| 400 (*cache) = new AppCache(storage_->service_, cache_record_.cache_id); | 403 (*cache) = new AppCache(storage_->service_, cache_record_.cache_id); |
| 401 cache->get()->InitializeWithDatabaseRecords( | 404 cache->get()->InitializeWithDatabaseRecords( |
| 402 cache_record_, entry_records_, fallback_namespace_records_, | 405 cache_record_, entry_records_, |
| 406 intercept_namespace_records_, |
| 407 fallback_namespace_records_, |
| 403 online_whitelist_records_); | 408 online_whitelist_records_); |
| 404 cache->get()->set_complete(true); | 409 cache->get()->set_complete(true); |
| 405 | 410 |
| 406 (*group) = storage_->working_set_.GetGroup(group_record_.manifest_url); | 411 (*group) = storage_->working_set_.GetGroup(group_record_.manifest_url); |
| 407 if (group->get()) { | 412 if (group->get()) { |
| 408 DCHECK(group_record_.group_id == group->get()->group_id()); | 413 DCHECK(group_record_.group_id == group->get()->group_id()); |
| 409 group->get()->AddCache(cache->get()); | 414 group->get()->AddCache(cache->get()); |
| 410 } else { | 415 } else { |
| 411 (*group) = new AppCacheGroup( | 416 (*group) = new AppCacheGroup( |
| 412 storage_->service_, group_record_.manifest_url, | 417 storage_->service_, group_record_.manifest_url, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 AppCacheStorageImpl::StoreGroupAndCacheTask::StoreGroupAndCacheTask( | 546 AppCacheStorageImpl::StoreGroupAndCacheTask::StoreGroupAndCacheTask( |
| 542 AppCacheStorageImpl* storage, AppCacheGroup* group, AppCache* newest_cache) | 547 AppCacheStorageImpl* storage, AppCacheGroup* group, AppCache* newest_cache) |
| 543 : StoreOrLoadTask(storage), group_(group), cache_(newest_cache), | 548 : StoreOrLoadTask(storage), group_(group), cache_(newest_cache), |
| 544 success_(false), would_exceed_quota_(false), | 549 success_(false), would_exceed_quota_(false), |
| 545 space_available_(-1), new_origin_usage_(-1) { | 550 space_available_(-1), new_origin_usage_(-1) { |
| 546 group_record_.group_id = group->group_id(); | 551 group_record_.group_id = group->group_id(); |
| 547 group_record_.manifest_url = group->manifest_url(); | 552 group_record_.manifest_url = group->manifest_url(); |
| 548 group_record_.origin = group_record_.manifest_url.GetOrigin(); | 553 group_record_.origin = group_record_.manifest_url.GetOrigin(); |
| 549 newest_cache->ToDatabaseRecords( | 554 newest_cache->ToDatabaseRecords( |
| 550 group, | 555 group, |
| 551 &cache_record_, &entry_records_, &fallback_namespace_records_, | 556 &cache_record_, &entry_records_, |
| 557 &intercept_namespace_records_, |
| 558 &fallback_namespace_records_, |
| 552 &online_whitelist_records_); | 559 &online_whitelist_records_); |
| 553 } | 560 } |
| 554 | 561 |
| 555 void AppCacheStorageImpl::StoreGroupAndCacheTask::GetQuotaThenSchedule() { | 562 void AppCacheStorageImpl::StoreGroupAndCacheTask::GetQuotaThenSchedule() { |
| 556 quota::QuotaManager* quota_manager = NULL; | 563 quota::QuotaManager* quota_manager = NULL; |
| 557 if (storage_->service()->quota_manager_proxy()) { | 564 if (storage_->service()->quota_manager_proxy()) { |
| 558 quota_manager = | 565 quota_manager = |
| 559 storage_->service()->quota_manager_proxy()->quota_manager(); | 566 storage_->service()->quota_manager_proxy()->quota_manager(); |
| 560 } | 567 } |
| 561 | 568 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 // The rest are deletable. | 638 // The rest are deletable. |
| 632 std::set<int64>::const_iterator id_iter = existing_response_ids.begin(); | 639 std::set<int64>::const_iterator id_iter = existing_response_ids.begin(); |
| 633 while (id_iter != existing_response_ids.end()) { | 640 while (id_iter != existing_response_ids.end()) { |
| 634 newly_deletable_response_ids_.push_back(*id_iter); | 641 newly_deletable_response_ids_.push_back(*id_iter); |
| 635 ++id_iter; | 642 ++id_iter; |
| 636 } | 643 } |
| 637 | 644 |
| 638 success_ = | 645 success_ = |
| 639 database_->DeleteCache(cache.cache_id) && | 646 database_->DeleteCache(cache.cache_id) && |
| 640 database_->DeleteEntriesForCache(cache.cache_id) && | 647 database_->DeleteEntriesForCache(cache.cache_id) && |
| 641 database_->DeleteFallbackNameSpacesForCache(cache.cache_id) && | 648 database_->DeleteNamespacesForCache(cache.cache_id) && |
| 642 database_->DeleteOnlineWhiteListForCache(cache.cache_id) && | 649 database_->DeleteOnlineWhiteListForCache(cache.cache_id) && |
| 643 database_->InsertDeletableResponseIds(newly_deletable_response_ids_); | 650 database_->InsertDeletableResponseIds(newly_deletable_response_ids_); |
| 644 // TODO(michaeln): store group_id too with deletable ids | 651 // TODO(michaeln): store group_id too with deletable ids |
| 645 } else { | 652 } else { |
| 646 NOTREACHED() << "A existing group without a cache is unexpected"; | 653 NOTREACHED() << "A existing group without a cache is unexpected"; |
| 647 } | 654 } |
| 648 } | 655 } |
| 649 | 656 |
| 650 success_ = | 657 success_ = |
| 651 success_ && | 658 success_ && |
| 652 database_->InsertCache(&cache_record_) && | 659 database_->InsertCache(&cache_record_) && |
| 653 database_->InsertEntryRecords(entry_records_) && | 660 database_->InsertEntryRecords(entry_records_) && |
| 654 database_->InsertFallbackNameSpaceRecords(fallback_namespace_records_)&& | 661 database_->InsertNamespaceRecords(intercept_namespace_records_) && |
| 662 database_->InsertNamespaceRecords(fallback_namespace_records_) && |
| 655 database_->InsertOnlineWhiteListRecords(online_whitelist_records_); | 663 database_->InsertOnlineWhiteListRecords(online_whitelist_records_); |
| 656 | 664 |
| 657 if (!success_) | 665 if (!success_) |
| 658 return; | 666 return; |
| 659 | 667 |
| 660 new_origin_usage_ = database_->GetOriginUsage(group_record_.origin); | 668 new_origin_usage_ = database_->GetOriginUsage(group_record_.origin); |
| 661 | 669 |
| 662 // Only check quota when the new usage exceeds the old usage. | 670 // Only check quota when the new usage exceeds the old usage. |
| 663 if (new_origin_usage_ <= old_origin_usage) { | 671 if (new_origin_usage_ <= old_origin_usage) { |
| 664 success_ = transaction.Commit(); | 672 success_ = transaction.Commit(); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 void AppCacheStorageImpl::StoreGroupAndCacheTask::CancelCompletion() { | 721 void AppCacheStorageImpl::StoreGroupAndCacheTask::CancelCompletion() { |
| 714 // Overriden to safely drop our reference to the group and cache | 722 // Overriden to safely drop our reference to the group and cache |
| 715 // which are not thread safe refcounted. | 723 // which are not thread safe refcounted. |
| 716 DatabaseTask::CancelCompletion(); | 724 DatabaseTask::CancelCompletion(); |
| 717 group_ = NULL; | 725 group_ = NULL; |
| 718 cache_ = NULL; | 726 cache_ = NULL; |
| 719 } | 727 } |
| 720 | 728 |
| 721 // FindMainResponseTask ------- | 729 // FindMainResponseTask ------- |
| 722 | 730 |
| 723 class AppCacheStorageImpl::FindMainResponseTask : public DatabaseTask { | |
| 724 public: | |
| 725 FindMainResponseTask(AppCacheStorageImpl* storage, | |
| 726 const GURL& url, | |
| 727 const GURL& preferred_manifest_url, | |
| 728 const AppCacheWorkingSet::GroupMap* groups_in_use) | |
| 729 : DatabaseTask(storage), url_(url), | |
| 730 preferred_manifest_url_(preferred_manifest_url), | |
| 731 cache_id_(kNoCacheId), group_id_(0) { | |
| 732 if (groups_in_use) { | |
| 733 for (AppCacheWorkingSet::GroupMap::const_iterator it = | |
| 734 groups_in_use->begin(); | |
| 735 it != groups_in_use->end(); ++it) { | |
| 736 AppCacheGroup* group = it->second; | |
| 737 AppCache* cache = group->newest_complete_cache(); | |
| 738 if (group->is_obsolete() || !cache) | |
| 739 continue; | |
| 740 cache_ids_in_use_.insert(cache->cache_id()); | |
| 741 } | |
| 742 } | |
| 743 } | |
| 744 | |
| 745 virtual void Run(); | |
| 746 virtual void RunCompleted(); | |
| 747 | |
| 748 private: | |
| 749 typedef std::vector<AppCacheDatabase::FallbackNameSpaceRecord*> | |
| 750 FallbackNameSpaceVector; | |
| 751 bool FindExactMatch(int64 preferred_id); | |
| 752 bool FindFallback(int64 preferred_id); | |
| 753 bool FindFirstValidFallback(const FallbackNameSpaceVector& fallbacks); | |
| 754 | |
| 755 GURL url_; | |
| 756 GURL preferred_manifest_url_; | |
| 757 std::set<int64> cache_ids_in_use_; | |
| 758 AppCacheEntry entry_; | |
| 759 AppCacheEntry fallback_entry_; | |
| 760 GURL fallback_url_; | |
| 761 int64 cache_id_; | |
| 762 int64 group_id_; | |
| 763 GURL manifest_url_; | |
| 764 }; | |
| 765 | |
| 766 // Helpers for FindMainResponseTask::Run() | 731 // Helpers for FindMainResponseTask::Run() |
| 767 namespace { | 732 namespace { |
| 768 class SortByCachePreference | 733 class SortByCachePreference |
| 769 : public std::binary_function< | 734 : public std::binary_function< |
| 770 AppCacheDatabase::EntryRecord, | 735 AppCacheDatabase::EntryRecord, |
| 771 AppCacheDatabase::EntryRecord, | 736 AppCacheDatabase::EntryRecord, |
| 772 bool> { | 737 bool> { |
| 773 public: | 738 public: |
| 774 SortByCachePreference(int64 preferred_id, const std::set<int64>& in_use_ids) | 739 SortByCachePreference(int64 preferred_id, const std::set<int64>& in_use_ids) |
| 775 : preferred_id_(preferred_id), in_use_ids_(in_use_ids) { | 740 : preferred_id_(preferred_id), in_use_ids_(in_use_ids) { |
| 776 } | 741 } |
| 777 bool operator()( | 742 bool operator()( |
| 778 const AppCacheDatabase::EntryRecord& lhs, | 743 const AppCacheDatabase::EntryRecord& lhs, |
| 779 const AppCacheDatabase::EntryRecord& rhs) { | 744 const AppCacheDatabase::EntryRecord& rhs) { |
| 780 return compute_value(lhs) > compute_value(rhs); | 745 return compute_value(lhs) > compute_value(rhs); |
| 781 } | 746 } |
| 782 private: | 747 private: |
| 783 int compute_value(const AppCacheDatabase::EntryRecord& entry) { | 748 int compute_value(const AppCacheDatabase::EntryRecord& entry) { |
| 784 if (entry.cache_id == preferred_id_) | 749 if (entry.cache_id == preferred_id_) |
| 785 return 100; | 750 return 100; |
| 786 else if (in_use_ids_.find(entry.cache_id) != in_use_ids_.end()) | 751 else if (in_use_ids_.find(entry.cache_id) != in_use_ids_.end()) |
| 787 return 50; | 752 return 50; |
| 788 return 0; | 753 return 0; |
| 789 } | 754 } |
| 790 int64 preferred_id_; | 755 int64 preferred_id_; |
| 791 const std::set<int64>& in_use_ids_; | 756 const std::set<int64>& in_use_ids_; |
| 792 }; | 757 }; |
| 793 | 758 |
| 794 bool SortByLength( | 759 bool SortByLength( |
| 795 const AppCacheDatabase::FallbackNameSpaceRecord& lhs, | 760 const AppCacheDatabase::NamespaceRecord& lhs, |
| 796 const AppCacheDatabase::FallbackNameSpaceRecord& rhs) { | 761 const AppCacheDatabase::NamespaceRecord& rhs) { |
| 797 return lhs.namespace_url.spec().length() > rhs.namespace_url.spec().length(); | 762 return lhs.namespace_url.spec().length() > rhs.namespace_url.spec().length(); |
| 798 } | 763 } |
| 799 | 764 |
| 800 class NetworkNamespaceHelper { | 765 class NetworkNamespaceHelper { |
| 801 public: | 766 public: |
| 802 explicit NetworkNamespaceHelper(AppCacheDatabase* database) | 767 explicit NetworkNamespaceHelper(AppCacheDatabase* database) |
| 803 : database_(database) { | 768 : database_(database) { |
| 804 } | 769 } |
| 805 | 770 |
| 806 bool IsInNetworkNamespace(const GURL& url, int64 cache_id) { | 771 bool IsInNetworkNamespace(const GURL& url, int64 cache_id) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 830 } | 795 } |
| 831 | 796 |
| 832 // Key is cache id | 797 // Key is cache id |
| 833 typedef std::map<int64, std::vector<GURL> > WhiteListMap; | 798 typedef std::map<int64, std::vector<GURL> > WhiteListMap; |
| 834 WhiteListMap namespaces_map_; | 799 WhiteListMap namespaces_map_; |
| 835 AppCacheDatabase* database_; | 800 AppCacheDatabase* database_; |
| 836 }; | 801 }; |
| 837 | 802 |
| 838 } // namespace | 803 } // namespace |
| 839 | 804 |
| 805 class AppCacheStorageImpl::FindMainResponseTask : public DatabaseTask { |
| 806 public: |
| 807 FindMainResponseTask(AppCacheStorageImpl* storage, |
| 808 const GURL& url, |
| 809 const GURL& preferred_manifest_url, |
| 810 const AppCacheWorkingSet::GroupMap* groups_in_use) |
| 811 : DatabaseTask(storage), url_(url), |
| 812 preferred_manifest_url_(preferred_manifest_url), |
| 813 cache_id_(kNoCacheId), group_id_(0) { |
| 814 if (groups_in_use) { |
| 815 for (AppCacheWorkingSet::GroupMap::const_iterator it = |
| 816 groups_in_use->begin(); |
| 817 it != groups_in_use->end(); ++it) { |
| 818 AppCacheGroup* group = it->second; |
| 819 AppCache* cache = group->newest_complete_cache(); |
| 820 if (group->is_obsolete() || !cache) |
| 821 continue; |
| 822 cache_ids_in_use_.insert(cache->cache_id()); |
| 823 } |
| 824 } |
| 825 } |
| 826 |
| 827 virtual void Run(); |
| 828 virtual void RunCompleted(); |
| 829 |
| 830 private: |
| 831 typedef std::vector<AppCacheDatabase::NamespaceRecord*> |
| 832 NamespaceRecordPtrVector; |
| 833 bool FindExactMatch(int64 preferred_id); |
| 834 bool FindNamespaceMatch(int64 preferred_id); |
| 835 bool FindNamespaceHelper( |
| 836 int64 preferred_cache_id, |
| 837 AppCacheDatabase::NamespaceRecordVector* namespaces, |
| 838 NetworkNamespaceHelper* network_namespace_helper); |
| 839 bool FindFirstValidNamespace(const NamespaceRecordPtrVector& namespaces); |
| 840 |
| 841 GURL url_; |
| 842 GURL preferred_manifest_url_; |
| 843 std::set<int64> cache_ids_in_use_; |
| 844 AppCacheEntry entry_; |
| 845 AppCacheEntry fallback_entry_; |
| 846 GURL fallback_url_; |
| 847 int64 cache_id_; |
| 848 int64 group_id_; |
| 849 GURL manifest_url_; |
| 850 }; |
| 851 |
| 852 |
| 853 |
| 840 void AppCacheStorageImpl::FindMainResponseTask::Run() { | 854 void AppCacheStorageImpl::FindMainResponseTask::Run() { |
| 841 // NOTE: The heuristics around choosing amoungst multiple candidates | 855 // NOTE: The heuristics around choosing amoungst multiple candidates |
| 842 // is underspecified, and just plain not fully understood. This needs | 856 // is underspecified, and just plain not fully understood. This needs |
| 843 // to be refined. | 857 // to be refined. |
| 844 | 858 |
| 845 // The 'preferred_manifest_url' is the url of the manifest associated | 859 // The 'preferred_manifest_url' is the url of the manifest associated |
| 846 // with the page that opened or embedded the page being loaded now. | 860 // with the page that opened or embedded the page being loaded now. |
| 847 // We have a strong preference to use resources from that cache. | 861 // We have a strong preference to use resources from that cache. |
| 848 // We also have a lesser bias to use resources from caches that are currently | 862 // We also have a lesser bias to use resources from caches that are currently |
| 849 // being used by other unrelated pages. | 863 // being used by other unrelated pages. |
| 850 // TODO(michaeln): come up with a 'preferred_manifest_url' in more cases | 864 // TODO(michaeln): come up with a 'preferred_manifest_url' in more cases |
| 851 // - when navigating a frame whose current contents are from an appcache | 865 // - when navigating a frame whose current contents are from an appcache |
| 852 // - when clicking an href in a frame that is appcached | 866 // - when clicking an href in a frame that is appcached |
| 853 int64 preferred_cache_id = kNoCacheId; | 867 int64 preferred_cache_id = kNoCacheId; |
| 854 if (!preferred_manifest_url_.is_empty()) { | 868 if (!preferred_manifest_url_.is_empty()) { |
| 855 AppCacheDatabase::GroupRecord preferred_group; | 869 AppCacheDatabase::GroupRecord preferred_group; |
| 856 AppCacheDatabase::CacheRecord preferred_cache; | 870 AppCacheDatabase::CacheRecord preferred_cache; |
| 857 if (database_->FindGroupForManifestUrl( | 871 if (database_->FindGroupForManifestUrl( |
| 858 preferred_manifest_url_, &preferred_group) && | 872 preferred_manifest_url_, &preferred_group) && |
| 859 database_->FindCacheForGroup( | 873 database_->FindCacheForGroup( |
| 860 preferred_group.group_id, &preferred_cache)) { | 874 preferred_group.group_id, &preferred_cache)) { |
| 861 preferred_cache_id = preferred_cache.cache_id; | 875 preferred_cache_id = preferred_cache.cache_id; |
| 862 } | 876 } |
| 863 } | 877 } |
| 864 | 878 |
| 865 // TODO(michaeln): Also lookup matches in intercept namespaces. | |
| 866 // http://code.google.com/p/chromium/issues/detail?id=101565 | |
| 867 if (FindExactMatch(preferred_cache_id) || | 879 if (FindExactMatch(preferred_cache_id) || |
| 868 FindFallback(preferred_cache_id)) { | 880 FindNamespaceMatch(preferred_cache_id)) { |
| 869 // We found something. | 881 // We found something. |
| 870 DCHECK(cache_id_ != kNoCacheId && !manifest_url_.is_empty() && | 882 DCHECK(cache_id_ != kNoCacheId && !manifest_url_.is_empty() && |
| 871 group_id_ != 0); | 883 group_id_ != 0); |
| 872 return; | 884 return; |
| 873 } | 885 } |
| 874 | 886 |
| 875 // We didn't find anything. | 887 // We didn't find anything. |
| 876 DCHECK(cache_id_ == kNoCacheId && manifest_url_.is_empty() && | 888 DCHECK(cache_id_ == kNoCacheId && manifest_url_.is_empty() && |
| 877 group_id_ == 0); | 889 group_id_ == 0); |
| 878 } | 890 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 898 group_id_ = group_record.group_id; | 910 group_id_ = group_record.group_id; |
| 899 entry_ = AppCacheEntry(iter->flags, iter->response_id); | 911 entry_ = AppCacheEntry(iter->flags, iter->response_id); |
| 900 cache_id_ = iter->cache_id; | 912 cache_id_ = iter->cache_id; |
| 901 return true; // We found an exact match. | 913 return true; // We found an exact match. |
| 902 } | 914 } |
| 903 } | 915 } |
| 904 return false; | 916 return false; |
| 905 } | 917 } |
| 906 | 918 |
| 907 bool AppCacheStorageImpl:: | 919 bool AppCacheStorageImpl:: |
| 908 FindMainResponseTask::FindFallback(int64 preferred_cache_id) { | 920 FindMainResponseTask::FindNamespaceMatch(int64 preferred_cache_id) { |
| 909 std::vector<AppCacheDatabase::FallbackNameSpaceRecord> all_fallbacks; | 921 AppCacheDatabase::NamespaceRecordVector all_intercepts; |
| 910 if (!database_->FindFallbackNameSpacesForOrigin( | 922 AppCacheDatabase::NamespaceRecordVector all_fallbacks; |
| 911 url_.GetOrigin(), &all_fallbacks) | 923 if (!database_->FindNamespacesForOrigin( |
| 912 || all_fallbacks.empty()) { | 924 url_.GetOrigin(), &all_intercepts, &all_fallbacks) |
| 925 || (all_intercepts.empty() && all_fallbacks.empty())) { |
| 913 return false; | 926 return false; |
| 914 } | 927 } |
| 915 | 928 |
| 929 NetworkNamespaceHelper network_namespace_helper(database_); |
| 930 if (FindNamespaceHelper(preferred_cache_id, |
| 931 &all_intercepts, |
| 932 &network_namespace_helper) || |
| 933 FindNamespaceHelper(preferred_cache_id, |
| 934 &all_fallbacks, |
| 935 &network_namespace_helper)) { |
| 936 return true; |
| 937 } |
| 938 return false; |
| 939 } |
| 940 |
| 941 bool AppCacheStorageImpl:: |
| 942 FindMainResponseTask::FindNamespaceHelper( |
| 943 int64 preferred_cache_id, |
| 944 AppCacheDatabase::NamespaceRecordVector* namespaces, |
| 945 NetworkNamespaceHelper* network_namespace_helper) { |
| 916 // Sort them by length, longer matches within the same cache/bucket take | 946 // Sort them by length, longer matches within the same cache/bucket take |
| 917 // precedence. | 947 // precedence. |
| 918 std::sort(all_fallbacks.begin(), all_fallbacks.end(), SortByLength); | 948 std::sort(namespaces->begin(), namespaces->end(), SortByLength); |
| 919 | 949 |
| 920 // Filter the list and bin them into buckets. | 950 NamespaceRecordPtrVector preferred_namespaces; |
| 921 NetworkNamespaceHelper network_namespace_helper(database_); | 951 NamespaceRecordPtrVector inuse_namespaces; |
| 922 FallbackNameSpaceVector preferred_fallbacks; | 952 NamespaceRecordPtrVector other_namespaces; |
| 923 FallbackNameSpaceVector inuse_fallbacks; | 953 std::vector<AppCacheDatabase::NamespaceRecord>::iterator iter; |
| 924 FallbackNameSpaceVector other_fallbacks; | 954 for (iter = namespaces->begin(); iter < namespaces->end(); ++iter) { |
| 925 std::vector<AppCacheDatabase::FallbackNameSpaceRecord>::iterator iter; | |
| 926 for (iter = all_fallbacks.begin(); iter < all_fallbacks.end(); ++iter) { | |
| 927 // Skip those that aren't a prefix match. | 955 // Skip those that aren't a prefix match. |
| 928 if (!StartsWithASCII(url_.spec(), iter->namespace_url.spec(), true)) | 956 if (!StartsWithASCII(url_.spec(), iter->namespace_url.spec(), true)) |
| 929 continue; | 957 continue; |
| 930 | 958 |
| 931 // Skip fallback namespaces where the requested url falls into a network | 959 // Skip namespaces where the requested url falls into a network |
| 932 // namespace of its containing appcache. | 960 // namespace of its containing appcache. |
| 933 if (network_namespace_helper.IsInNetworkNamespace(url_, iter->cache_id)) | 961 if (network_namespace_helper->IsInNetworkNamespace(url_, iter->cache_id)) |
| 934 continue; | 962 continue; |
| 935 | 963 |
| 936 // Bin them into one of our three buckets. | 964 // Bin them into one of our three buckets. |
| 937 if (iter->cache_id == preferred_cache_id) | 965 if (iter->cache_id == preferred_cache_id) |
| 938 preferred_fallbacks.push_back(&(*iter)); | 966 preferred_namespaces.push_back(&(*iter)); |
| 939 else if (cache_ids_in_use_.find(iter->cache_id) != cache_ids_in_use_.end()) | 967 else if (cache_ids_in_use_.find(iter->cache_id) != cache_ids_in_use_.end()) |
| 940 inuse_fallbacks.push_back(&(*iter)); | 968 inuse_namespaces.push_back(&(*iter)); |
| 941 else | 969 else |
| 942 other_fallbacks.push_back(&(*iter)); | 970 other_namespaces.push_back(&(*iter)); |
| 943 } | 971 } |
| 944 | 972 |
| 945 if (FindFirstValidFallback(preferred_fallbacks) || | 973 if (FindFirstValidNamespace(preferred_namespaces) || |
| 946 FindFirstValidFallback(inuse_fallbacks) || | 974 FindFirstValidNamespace(inuse_namespaces) || |
| 947 FindFirstValidFallback(other_fallbacks)) | 975 FindFirstValidNamespace(other_namespaces)) |
| 948 return true; // We found one. | 976 return true; // We found one. |
| 949 | 977 |
| 950 // We didn't find anything. | 978 // We didn't find anything. |
| 951 return false; | 979 return false; |
| 952 } | 980 } |
| 953 | 981 |
| 954 bool AppCacheStorageImpl:: | 982 bool AppCacheStorageImpl:: |
| 955 FindMainResponseTask::FindFirstValidFallback( | 983 FindMainResponseTask::FindFirstValidNamespace( |
| 956 const FallbackNameSpaceVector& fallbacks) { | 984 const NamespaceRecordPtrVector& namespaces) { |
| 957 // Take the first with a valid, non-foreign entry. | 985 // Take the first with a valid, non-foreign entry. |
| 958 FallbackNameSpaceVector::const_iterator iter; | 986 NamespaceRecordPtrVector::const_iterator iter; |
| 959 for (iter = fallbacks.begin(); iter < fallbacks.end(); ++iter) { | 987 for (iter = namespaces.begin(); iter < namespaces.end(); ++iter) { |
| 960 AppCacheDatabase::EntryRecord entry_record; | 988 AppCacheDatabase::EntryRecord entry_record; |
| 961 if (database_->FindEntry((*iter)->cache_id, (*iter)->fallback_entry_url, | 989 if (database_->FindEntry((*iter)->cache_id, (*iter)->target_url, |
| 962 &entry_record)) { | 990 &entry_record)) { |
| 963 AppCacheDatabase::GroupRecord group_record; | 991 AppCacheDatabase::GroupRecord group_record; |
| 964 if ((entry_record.flags & AppCacheEntry::FOREIGN) || | 992 if ((entry_record.flags & AppCacheEntry::FOREIGN) || |
| 965 !database_->FindGroupForCache(entry_record.cache_id, &group_record)) { | 993 !database_->FindGroupForCache(entry_record.cache_id, &group_record)) { |
| 966 continue; | 994 continue; |
| 967 } | 995 } |
| 968 manifest_url_ = group_record.manifest_url; | 996 manifest_url_ = group_record.manifest_url; |
| 969 group_id_ = group_record.group_id; | 997 group_id_ = group_record.group_id; |
| 970 cache_id_ = (*iter)->cache_id; | 998 cache_id_ = (*iter)->cache_id; |
| 971 fallback_url_ = (*iter)->fallback_entry_url; | 999 if ((*iter)->type == FALLBACK_NAMESPACE) { |
| 972 fallback_entry_ = AppCacheEntry( | 1000 fallback_url_ = (*iter)->target_url; |
| 973 entry_record.flags, entry_record.response_id); | 1001 fallback_entry_ = AppCacheEntry( |
| 1002 entry_record.flags, entry_record.response_id); |
| 1003 } else { |
| 1004 entry_ = AppCacheEntry(entry_record.flags, entry_record.response_id); |
| 1005 } |
| 974 return true; // We found one. | 1006 return true; // We found one. |
| 975 } | 1007 } |
| 976 } | 1008 } |
| 977 return false; // We didn't find a match. | 1009 return false; // We didn't find a match. |
| 978 } | 1010 } |
| 979 | 1011 |
| 980 void AppCacheStorageImpl::FindMainResponseTask::RunCompleted() { | 1012 void AppCacheStorageImpl::FindMainResponseTask::RunCompleted() { |
| 981 storage_->CallOnMainResponseFound( | 1013 storage_->CallOnMainResponseFound( |
| 982 &delegates_, url_, entry_, fallback_url_, fallback_entry_, | 1014 &delegates_, url_, entry_, fallback_url_, fallback_entry_, |
| 983 cache_id_, group_id_, manifest_url_); | 1015 cache_id_, group_id_, manifest_url_); |
| (...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1671 Disable(); | 1703 Disable(); |
| 1672 if (!is_incognito_) { | 1704 if (!is_incognito_) { |
| 1673 VLOG(1) << "Deleting existing appcache data and starting over."; | 1705 VLOG(1) << "Deleting existing appcache data and starting over."; |
| 1674 db_thread_->PostTask( | 1706 db_thread_->PostTask( |
| 1675 FROM_HERE, base::Bind(&DeleteDirectory, cache_directory_)); | 1707 FROM_HERE, base::Bind(&DeleteDirectory, cache_directory_)); |
| 1676 } | 1708 } |
| 1677 } | 1709 } |
| 1678 } | 1710 } |
| 1679 | 1711 |
| 1680 } // namespace appcache | 1712 } // namespace appcache |
| OLD | NEW |