Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/offline_pages/offline_page_model_impl.h" | 5 #include "components/offline_pages/offline_page_model_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 298 1, kMaxOpenedPageHistogramBucket.InMinutes(), 50, | 298 1, kMaxOpenedPageHistogramBucket.InMinutes(), 50, |
| 299 base::HistogramBase::kUmaTargetedHistogramFlag); | 299 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 300 histogram->Add( | 300 histogram->Add( |
| 301 (access_time - offline_page_item.last_access_time).InMinutes()); | 301 (access_time - offline_page_item.last_access_time).InMinutes()); |
| 302 } | 302 } |
| 303 | 303 |
| 304 } // namespace | 304 } // namespace |
| 305 | 305 |
| 306 // protected | 306 // protected |
| 307 OfflinePageModelImpl::OfflinePageModelImpl() | 307 OfflinePageModelImpl::OfflinePageModelImpl() |
| 308 : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} | 308 : OfflinePageModel(), |
| 309 is_loaded_(false), | |
| 310 store_reset_attempts_left_(3), | |
| 311 weak_ptr_factory_(this) {} | |
| 309 | 312 |
| 310 OfflinePageModelImpl::OfflinePageModelImpl( | 313 OfflinePageModelImpl::OfflinePageModelImpl( |
| 311 std::unique_ptr<OfflinePageMetadataStore> store, | 314 std::unique_ptr<OfflinePageMetadataStore> store, |
| 312 const base::FilePath& archives_dir, | 315 const base::FilePath& archives_dir, |
| 313 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 316 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
| 314 : store_(std::move(store)), | 317 : store_(std::move(store)), |
| 315 archives_dir_(archives_dir), | 318 archives_dir_(archives_dir), |
| 316 is_loaded_(false), | 319 is_loaded_(false), |
| 317 policy_controller_(new ClientPolicyController()), | 320 policy_controller_(new ClientPolicyController()), |
| 318 archive_manager_(new ArchiveManager(archives_dir, task_runner)), | 321 archive_manager_(new ArchiveManager(archives_dir, task_runner)), |
| 322 store_reset_attempts_left_(3), | |
| 319 testing_clock_(nullptr), | 323 testing_clock_(nullptr), |
| 320 weak_ptr_factory_(this) { | 324 weak_ptr_factory_(this) { |
| 321 archive_manager_->EnsureArchivesDirCreated( | 325 archive_manager_->EnsureArchivesDirCreated( |
| 322 base::Bind(&OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone, | 326 base::Bind(&OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone, |
| 323 weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now())); | 327 weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now())); |
| 324 } | 328 } |
| 325 | 329 |
| 326 OfflinePageModelImpl::~OfflinePageModelImpl() {} | 330 OfflinePageModelImpl::~OfflinePageModelImpl() {} |
| 327 | 331 |
| 328 void OfflinePageModelImpl::AddObserver(Observer* observer) { | 332 void OfflinePageModelImpl::AddObserver(Observer* observer) { |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 793 | 797 |
| 794 // No need to fire OfflinePageModelChanged event since updating access info | 798 // No need to fire OfflinePageModelChanged event since updating access info |
| 795 // should not have any impact to the UI. | 799 // should not have any impact to the UI. |
| 796 } | 800 } |
| 797 | 801 |
| 798 void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone( | 802 void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone( |
| 799 const base::TimeTicks& start_time) { | 803 const base::TimeTicks& start_time) { |
| 800 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime", | 804 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime", |
| 801 base::TimeTicks::Now() - start_time); | 805 base::TimeTicks::Now() - start_time); |
| 802 | 806 |
| 803 store_->GetOfflinePages(base::Bind(&OfflinePageModelImpl::OnLoadDone, | 807 store_->GetOfflinePages( |
| 804 weak_ptr_factory_.GetWeakPtr(), | 808 base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit, |
| 805 start_time)); | 809 weak_ptr_factory_.GetWeakPtr(), start_time)); |
| 806 } | 810 } |
| 807 | 811 |
| 808 void OfflinePageModelImpl::OnLoadDone( | 812 void OfflinePageModelImpl::OnGetOfflinePagesDoneForInit( |
| 809 const base::TimeTicks& start_time, | 813 const base::TimeTicks& start_time, |
| 810 OfflinePageMetadataStore::LoadStatus load_status, | 814 StoreState store_state, |
| 811 const std::vector<OfflinePageItem>& offline_pages) { | 815 const std::vector<OfflinePageItem>& offline_pages) { |
| 812 DCHECK(!is_loaded_); | 816 DCHECK(!is_loaded_); |
| 813 is_loaded_ = true; | 817 UMA_HISTOGRAM_ENUMERATION( |
| 818 "OfflinePages.StoreState", static_cast<int32_t>(store_state), | |
| 819 static_cast<int32_t>(StoreState::STORE_STATE_COUNT)); | |
| 814 | 820 |
| 815 // TODO(jianli): rebuild the store upon failure. | 821 if (store_state != StoreState::LOADED) { |
| 822 DVLOG(1) << "Offline pages database loading failed: " | |
| 823 << static_cast<int32_t>(store_state); | |
| 824 } | |
| 816 | 825 |
| 817 if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED) | 826 if (store_state == StoreState::FAILED_LOADING && MaybeResetStore(start_time)) |
| 818 CacheLoadedData(offline_pages); | 827 return; |
| 819 | 828 |
| 820 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime", | 829 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime", |
| 821 base::TimeTicks::Now() - start_time); | 830 base::TimeTicks::Now() - start_time); |
| 831 UMA_HISTOGRAM_COUNTS("OfflinePages.SavedPageCount", | |
|
Mark P
2016/10/12 16:04:12
I notice this moved from offline_page_metadata_sto
fgorski
2016/10/12 20:44:09
Yes, because we are going to be calling the other
Mark P
2016/10/12 22:12:15
Acknowledged.
| |
| 832 static_cast<int32_t>(offline_pages.size())); | |
| 833 | |
| 834 CacheLoadedData(offline_pages); | |
| 835 is_loaded_ = true; | |
| 822 | 836 |
| 823 // Create Storage Manager. | 837 // Create Storage Manager. |
| 824 storage_manager_.reset(new OfflinePageStorageManager( | 838 storage_manager_.reset(new OfflinePageStorageManager( |
| 825 this, GetPolicyController(), archive_manager_.get())); | 839 this, GetPolicyController(), archive_manager_.get())); |
| 826 | 840 |
| 827 // Run all the delayed tasks. | 841 // Run all the delayed tasks. |
| 828 for (const auto& delayed_task : delayed_tasks_) | 842 for (const auto& delayed_task : delayed_tasks_) |
| 829 delayed_task.Run(); | 843 delayed_task.Run(); |
| 830 delayed_tasks_.clear(); | 844 delayed_tasks_.clear(); |
| 831 | 845 |
| 832 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this)); | 846 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this)); |
| 833 | 847 |
| 834 CheckMetadataConsistency(); | 848 CheckMetadataConsistency(); |
| 835 | 849 |
| 836 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 850 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 837 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, | 851 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, |
| 838 weak_ptr_factory_.GetWeakPtr(), | 852 weak_ptr_factory_.GetWeakPtr(), |
| 839 base::Bind(&OfflinePageModelImpl::OnStorageCleared, | 853 base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| 840 weak_ptr_factory_.GetWeakPtr())), | 854 weak_ptr_factory_.GetWeakPtr())), |
| 841 kStorageManagerStartingDelay); | 855 kStorageManagerStartingDelay); |
| 842 } | 856 } |
| 843 | 857 |
| 858 bool OfflinePageModelImpl::MaybeResetStore(const base::TimeTicks& start_time) { | |
| 859 if (store_reset_attempts_left_ <= 0) | |
| 860 return false; | |
| 861 | |
| 862 store_reset_attempts_left_--; | |
| 863 store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreResetDone, | |
| 864 weak_ptr_factory_.GetWeakPtr(), start_time)); | |
| 865 return true; | |
| 866 } | |
| 867 | |
| 868 void OfflinePageModelImpl::OnStoreResetDone(const base::TimeTicks& start_time, | |
| 869 bool reset_success) { | |
| 870 UMA_HISTOGRAM_ENUMERATION( | |
| 871 "OfflinePages.StoreState", static_cast<int32_t>(store_->state()), | |
| 872 static_cast<int32_t>(StoreState::STORE_STATE_COUNT)); | |
| 873 | |
| 874 if (reset_success) { | |
| 875 store_->GetOfflinePages( | |
| 876 base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit, | |
| 877 weak_ptr_factory_.GetWeakPtr(), start_time)); | |
| 878 return; | |
| 879 } | |
| 880 | |
| 881 if (store_->state() == StoreState::FAILED_RESET && | |
| 882 MaybeResetStore(start_time)) { | |
| 883 return; | |
| 884 } | |
| 885 | |
| 886 // Reset failed enough times. Simply initialize the model with no items. | |
| 887 OnGetOfflinePagesDoneForInit(start_time, store_->state(), | |
| 888 std::vector<OfflinePageItem>()); | |
| 889 } | |
| 890 | |
| 844 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, | 891 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, |
| 845 SavePageResult result, | 892 SavePageResult result, |
| 846 const ClientId& client_id, | 893 const ClientId& client_id, |
| 847 int64_t offline_id) { | 894 int64_t offline_id) { |
| 848 ReportSavePageResultHistogramAfterSave(client_id, result); | 895 ReportSavePageResultHistogramAfterSave(client_id, result); |
| 849 archive_manager_->GetStorageStats( | 896 archive_manager_->GetStorageStats( |
| 850 base::Bind(&ReportStorageHistogramsAfterSave)); | 897 base::Bind(&ReportStorageHistogramsAfterSave)); |
| 851 callback.Run(result, offline_id); | 898 callback.Run(result, offline_id); |
| 852 } | 899 } |
| 853 | 900 |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1071 } | 1118 } |
| 1072 | 1119 |
| 1073 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); | 1120 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); |
| 1074 } | 1121 } |
| 1075 | 1122 |
| 1076 base::Time OfflinePageModelImpl::GetCurrentTime() const { | 1123 base::Time OfflinePageModelImpl::GetCurrentTime() const { |
| 1077 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); | 1124 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); |
| 1078 } | 1125 } |
| 1079 | 1126 |
| 1080 } // namespace offline_pages | 1127 } // namespace offline_pages |
| OLD | NEW |