| Index: components/offline_pages/offline_page_model_impl.cc
|
| diff --git a/components/offline_pages/offline_page_model_impl.cc b/components/offline_pages/offline_page_model_impl.cc
|
| index 9df2141e42d0a78c368c778df1e86e674993211d..453b95681ec481e2e6c4948983ffca4230e6fabc 100644
|
| --- a/components/offline_pages/offline_page_model_impl.cc
|
| +++ b/components/offline_pages/offline_page_model_impl.cc
|
| @@ -647,7 +647,6 @@ void OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone(
|
| }
|
|
|
| void OfflinePageModelImpl::CheckMetadataConsistency() {
|
| - DCHECK(is_loaded_);
|
| archive_manager_->GetAllArchives(
|
| base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| @@ -792,7 +791,7 @@ void OfflinePageModelImpl::OnAddOfflinePageDone(
|
| if (result == SavePageResult::SUCCESS) {
|
| DeleteExistingPagesWithSameURL(offline_page);
|
| } else {
|
| - PostClearStorageIfNeededTask();
|
| + PostClearStorageIfNeededTask(false /* delayed */);
|
| }
|
|
|
| DeletePendingArchiver(archiver);
|
| @@ -816,6 +815,24 @@ void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
|
| UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime",
|
| base::TimeTicks::Now() - start_time);
|
|
|
| + store_->Initialize(base::Bind(&OfflinePageModelImpl::OnStoreInitialized,
|
| + weak_ptr_factory_.GetWeakPtr(), start_time));
|
| +}
|
| +
|
| +void OfflinePageModelImpl::OnStoreInitialized(const base::TimeTicks& start_time,
|
| + StoreState state) {
|
| + if (state == StoreState::FAILED_RESET) {
|
| + CompleteLoad();
|
| + return;
|
| + }
|
| +
|
| + if (state == StoreState::FAILED_LOADING) {
|
| + store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreInitialized,
|
| + weak_ptr_factory_.GetWeakPtr(), start_time));
|
| + return;
|
| + }
|
| +
|
| + DCHECK_EQ(state, StoreState::LOADED);
|
| store_->GetOfflinePages(base::Bind(&OfflinePageModelImpl::OnLoadDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| start_time));
|
| @@ -823,39 +840,36 @@ void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
|
|
|
| void OfflinePageModelImpl::OnLoadDone(
|
| const base::TimeTicks& start_time,
|
| - OfflinePageMetadataStore::LoadStatus load_status,
|
| const std::vector<OfflinePageItem>& offline_pages) {
|
| DCHECK(!is_loaded_);
|
| - is_loaded_ = true;
|
| -
|
| - // TODO(jianli): rebuild the store upon failure.
|
| -
|
| - if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED)
|
| - CacheLoadedData(offline_pages);
|
|
|
| UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime",
|
| base::TimeTicks::Now() - start_time);
|
|
|
| - // Create Storage Manager.
|
| - storage_manager_.reset(new OfflinePageStorageManager(
|
| - this, GetPolicyController(), archive_manager_.get()));
|
| + CacheLoadedData(offline_pages);
|
| + CompleteLoad();
|
|
|
| - // Run all the delayed tasks.
|
| - for (const auto& delayed_task : delayed_tasks_)
|
| - delayed_task.Run();
|
| - delayed_tasks_.clear();
|
| + // Ensure necessary cleanup operations are started.
|
| + CheckMetadataConsistency();
|
| +}
|
| +
|
| +void OfflinePageModelImpl::CompleteLoad() {
|
| + is_loaded_ = true;
|
|
|
| + // All actions below are meant to be taken regardless of successful load of
|
| + // the store.
|
| +
|
| + // Inform observers the load is done.
|
| for (Observer& observer : observers_)
|
| observer.OfflinePageModelLoaded(this);
|
|
|
| - CheckMetadataConsistency();
|
| + // Run all the delayed tasks.
|
| + for (const auto& delayed_task : delayed_tasks_)
|
| + delayed_task.Run();
|
| + delayed_tasks_.clear();
|
|
|
| - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| - FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Bind(&OfflinePageModelImpl::OnStorageCleared,
|
| - weak_ptr_factory_.GetWeakPtr())),
|
| - kStorageManagerStartingDelay);
|
| + // Clear storage.
|
| + PostClearStorageIfNeededTask(true /* delayed */);
|
| }
|
|
|
| void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback,
|
| @@ -914,7 +928,7 @@ void OfflinePageModelImpl::OnPagesFoundWithSameURL(
|
| void OfflinePageModelImpl::OnDeleteOldPagesWithSameURL(
|
| DeletePageResult result) {
|
| // TODO(romax) Add UMAs for failure cases.
|
| - PostClearStorageIfNeededTask();
|
| + PostClearStorageIfNeededTask(false /* delayed */);
|
| }
|
|
|
| void OfflinePageModelImpl::DeletePendingArchiver(
|
| @@ -1053,6 +1067,11 @@ void OfflinePageModelImpl::CacheLoadedData(
|
|
|
| void OfflinePageModelImpl::ClearStorageIfNeeded(
|
| const ClearStorageCallback& callback) {
|
| + // Create Storage Manager if necessary.
|
| + if (!storage_manager_) {
|
| + storage_manager_.reset(new OfflinePageStorageManager(
|
| + this, GetPolicyController(), archive_manager_.get()));
|
| + }
|
| storage_manager_->ClearPagesIfNeeded(callback);
|
| }
|
|
|
| @@ -1067,12 +1086,15 @@ void OfflinePageModelImpl::OnStorageCleared(size_t expired_page_count,
|
| }
|
| }
|
|
|
| -void OfflinePageModelImpl::PostClearStorageIfNeededTask() {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| +void OfflinePageModelImpl::PostClearStorageIfNeededTask(bool delayed) {
|
| + base::TimeDelta delay =
|
| + delayed ? kStorageManagerStartingDelay : base::TimeDelta();
|
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| base::Bind(&OfflinePageModelImpl::OnStorageCleared,
|
| - weak_ptr_factory_.GetWeakPtr())));
|
| + weak_ptr_factory_.GetWeakPtr())),
|
| + delay);
|
| }
|
|
|
| bool OfflinePageModelImpl::IsRemovedOnCacheReset(
|
|
|