Chromium Code Reviews| Index: components/offline_pages/offline_page_model.cc |
| diff --git a/components/offline_pages/offline_page_model.cc b/components/offline_pages/offline_page_model.cc |
| index c007366c99bae9358ce43e51af940b7d7aa5f5f9..b4f7e59f842a4474662907ed1cae14c498b95671 100644 |
| --- a/components/offline_pages/offline_page_model.cc |
| +++ b/components/offline_pages/offline_page_model.cc |
| @@ -18,7 +18,6 @@ |
| #include "components/bookmarks/browser/bookmark_model.h" |
| #include "components/bookmarks/browser/bookmark_node.h" |
| #include "components/offline_pages/offline_page_item.h" |
| -#include "components/offline_pages/offline_page_metadata_store.h" |
| #include "url/gurl.h" |
| using ArchiverResult = offline_pages::OfflinePageArchiver::ArchiverResult; |
| @@ -28,6 +27,17 @@ namespace offline_pages { |
| namespace { |
| +// This enum is used in an UMA histogram. Hence the entries here shouldn't |
| +// be deleted or re-ordered and new ones should be added to the end. |
| +enum ClearAllStatus { |
| + CLEAR_ALL_SUCCEEDED, |
| + STORE_RESET_FAILED, |
| + STORE_RELOAD_FAILED, |
| + |
| + // NOTE: always keep this entry at the end. |
| + CLEAR_ALL_STATUS_COUNT |
| +}; |
| + |
| // Threshold for how old offline copy of a page should be before we offer to |
| // delete it to free up space. |
| const base::TimeDelta kPageCleanUpThreshold = base::TimeDelta::FromDays(30); |
| @@ -219,6 +229,19 @@ void OfflinePageModel::DeletePagesByBookmarkId( |
| base::Owned(success))); |
| } |
| +void OfflinePageModel::ClearAll(const base::Closure& callback) { |
| + DCHECK(is_loaded_); |
| + |
| + std::vector<int64> bookmark_ids; |
| + for (const auto& id_page_pair : offline_pages_) |
| + bookmark_ids.push_back(id_page_pair.first); |
| + DeletePagesByBookmarkId( |
| + bookmark_ids, |
| + base::Bind(&OfflinePageModel::OnRemoveAllFilesDoneForClearAll, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + callback)); |
| +} |
| + |
| const std::vector<OfflinePageItem> OfflinePageModel::GetAllPages() const { |
| DCHECK(is_loaded_); |
| std::vector<OfflinePageItem> offline_pages; |
| @@ -437,15 +460,18 @@ void OfflinePageModel::BookmarkNodeRemoved( |
| } |
| void OfflinePageModel::OnLoadDone( |
| - bool success, |
| + OfflinePageMetadataStore::LoadStatus load_status, |
| const std::vector<OfflinePageItem>& offline_pages) { |
| DCHECK(!is_loaded_); |
| is_loaded_ = true; |
| - if (success) { |
| - for (const auto& offline_page : offline_pages) |
| - offline_pages_[offline_page.bookmark_id] = offline_page; |
| - } |
| + // TODO(jianli): rebuild the store upon failure. |
| + |
| + UMA_HISTOGRAM_ENUMERATION("OfflinePages.LoadStatus", |
| + load_status, |
| + OfflinePageMetadataStore::LOAD_STATUS_COUNT); |
| + if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED) |
| + CacheLoadedData(offline_pages); |
| // Run all the delayed tasks. |
| for (const auto& delayed_task : delayed_tasks_) |
| @@ -554,4 +580,47 @@ void OfflinePageModel::OnRemoveOfflinePagesMissingArchiveFileDone( |
| } |
| } |
| +void OfflinePageModel::OnRemoveAllFilesDoneForClearAll( |
| + const base::Closure& callback, |
| + DeletePageResult result) { |
| + store_->Reset(base::Bind(&OfflinePageModel::OnResetStoreDoneForClearAll, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + callback)); |
| +} |
| + |
| +void OfflinePageModel::OnResetStoreDoneForClearAll( |
| + const base::Closure& callback, bool success) { |
| + DCHECK(success); |
|
fgorski
2015/10/27 20:13:09
DCHECK makes sense :)
|
| + UMA_HISTOGRAM_ENUMERATION("OfflinePages.ClearAllStatus", |
| + STORE_RESET_FAILED, |
| + CLEAR_ALL_STATUS_COUNT); |
| + |
| + offline_pages_.clear(); |
| + store_->Load(base::Bind(&OfflinePageModel::OnReloadStoreDoneForClearAll, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + callback)); |
| +} |
| + |
| +void OfflinePageModel::OnReloadStoreDoneForClearAll( |
| + const base::Closure& callback, |
| + OfflinePageMetadataStore::LoadStatus load_status, |
| + const std::vector<OfflinePageItem>& offline_pages) { |
| + DCHECK_EQ(OfflinePageMetadataStore::LOAD_SUCCEEDED, load_status); |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "OfflinePages.ClearAllStatus", |
| + load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED ? |
| + CLEAR_ALL_SUCCEEDED : STORE_RELOAD_FAILED, |
| + CLEAR_ALL_STATUS_COUNT); |
| + |
| + CacheLoadedData(offline_pages); |
| + callback.Run(); |
| +} |
| + |
| +void OfflinePageModel::CacheLoadedData( |
| + const std::vector<OfflinePageItem>& offline_pages) { |
| + offline_pages_.clear(); |
| + for (const auto& offline_page : offline_pages) |
| + offline_pages_[offline_page.bookmark_id] = offline_page; |
| +} |
| + |
| } // namespace offline_pages |