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 18b656c0c929574fe500998b16e1a861d8f4e003..8178a15cf369c19a3e3a4adcb762acd599e6d5ed 100644 |
| --- a/components/offline_pages/offline_page_model.cc |
| +++ b/components/offline_pages/offline_page_model.cc |
| @@ -13,11 +13,13 @@ |
| #include "base/logging.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/sequenced_task_runner.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "base/thread_task_runner_handle.h" |
| #include "base/time/time.h" |
| #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/proto/offline_pages.pb.h" |
| #include "url/gurl.h" |
| using ArchiverResult = offline_pages::OfflinePageArchiver::ArchiverResult; |
| @@ -149,7 +151,8 @@ void OfflinePageModel::RemoveObserver(Observer* observer) { |
| } |
| void OfflinePageModel::SavePage(const GURL& url, |
| - int64_t bookmark_id, |
| + int64_t offline_id, |
| + const ClientId& client_id, |
| scoped_ptr<OfflinePageArchiver> archiver, |
| const SavePageCallback& callback) { |
| DCHECK(is_loaded_); |
| @@ -162,16 +165,16 @@ void OfflinePageModel::SavePage(const GURL& url, |
| } |
| DCHECK(archiver.get()); |
| - archiver->CreateArchive(archives_dir_, |
| - base::Bind(&OfflinePageModel::OnCreateArchiveDone, |
| - weak_ptr_factory_.GetWeakPtr(), url, |
| - bookmark_id, base::Time::Now(), callback)); |
| + archiver->CreateArchive( |
| + archives_dir_, base::Bind(&OfflinePageModel::OnCreateArchiveDone, |
| + weak_ptr_factory_.GetWeakPtr(), url, offline_id, |
| + client_id, base::Time::Now(), callback)); |
| pending_archivers_.push_back(std::move(archiver)); |
| } |
| -void OfflinePageModel::MarkPageAccessed(int64_t bookmark_id) { |
| +void OfflinePageModel::MarkPageAccessed(int64_t offline_id) { |
| DCHECK(is_loaded_); |
| - auto iter = offline_pages_.find(bookmark_id); |
| + auto iter = offline_pages_.find(offline_id); |
| if (iter == offline_pages_.end()) |
| return; |
| @@ -190,10 +193,10 @@ void OfflinePageModel::MarkPageAccessed(int64_t bookmark_id) { |
| weak_ptr_factory_.GetWeakPtr(), offline_page_item)); |
| } |
| -void OfflinePageModel::MarkPageForDeletion(int64_t bookmark_id, |
| +void OfflinePageModel::MarkPageForDeletion(int64_t offline_id, |
| const DeletePageCallback& callback) { |
| DCHECK(is_loaded_); |
| - auto iter = offline_pages_.find(bookmark_id); |
| + auto iter = offline_pages_.find(offline_id); |
| if (iter == offline_pages_.end()) { |
| InformDeletePageDone(callback, DeletePageResult::NOT_FOUND); |
| return; |
| @@ -209,23 +212,23 @@ void OfflinePageModel::MarkPageForDeletion(int64_t bookmark_id, |
| weak_ptr_factory_.GetWeakPtr(), offline_page_item, callback)); |
| } |
| -void OfflinePageModel::DeletePageByBookmarkId( |
| - int64_t bookmark_id, |
| +void OfflinePageModel::DeletePageByOfflineId( |
| + int64_t offline_id, |
| const DeletePageCallback& callback) { |
| DCHECK(is_loaded_); |
| - std::vector<int64_t> bookmark_ids_to_delete; |
| - bookmark_ids_to_delete.push_back(bookmark_id); |
| - DeletePagesByBookmarkId(bookmark_ids_to_delete, callback); |
| + std::vector<int64_t> offline_ids_to_delete; |
| + offline_ids_to_delete.push_back(offline_id); |
| + DeletePagesByOfflineId(offline_ids_to_delete, callback); |
| } |
| -void OfflinePageModel::DeletePagesByBookmarkId( |
| - const std::vector<int64_t>& bookmark_ids, |
| +void OfflinePageModel::DeletePagesByOfflineId( |
| + const std::vector<int64_t>& offline_ids, |
| const DeletePageCallback& callback) { |
| DCHECK(is_loaded_); |
| std::vector<base::FilePath> paths_to_delete; |
| - for (const auto& bookmark_id : bookmark_ids) { |
| - auto iter = offline_pages_.find(bookmark_id); |
| + for (const auto& offline_id : offline_ids) { |
| + auto iter = offline_pages_.find(offline_id); |
| if (iter != offline_pages_.end()) { |
| paths_to_delete.push_back(iter->second.file_path); |
| } |
| @@ -238,26 +241,22 @@ void OfflinePageModel::DeletePagesByBookmarkId( |
| bool* success = new bool(false); |
| task_runner_->PostTaskAndReply( |
| - FROM_HERE, |
| - base::Bind(&DeleteArchiveFiles, paths_to_delete, success), |
| + FROM_HERE, base::Bind(&DeleteArchiveFiles, paths_to_delete, success), |
| base::Bind(&OfflinePageModel::OnDeleteArchiveFilesDone, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - bookmark_ids, |
| - callback, |
| + weak_ptr_factory_.GetWeakPtr(), offline_ids, callback, |
| base::Owned(success))); |
| } |
| void OfflinePageModel::ClearAll(const base::Closure& callback) { |
| DCHECK(is_loaded_); |
| - std::vector<int64_t> bookmark_ids; |
| + std::vector<int64_t> offline_ids; |
| for (const auto& id_page_pair : offline_pages_) |
| - bookmark_ids.push_back(id_page_pair.first); |
| - DeletePagesByBookmarkId( |
| - bookmark_ids, |
| + offline_ids.push_back(id_page_pair.first); |
| + DeletePagesByOfflineId( |
| + offline_ids, |
| base::Bind(&OfflinePageModel::OnRemoveAllFilesDoneForClearAll, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - callback)); |
| + weak_ptr_factory_.GetWeakPtr(), callback)); |
| } |
| bool OfflinePageModel::HasOfflinePages() const { |
| @@ -295,9 +294,23 @@ const std::vector<OfflinePageItem> OfflinePageModel::GetPagesToCleanUp() const { |
| return offline_pages; |
| } |
| -const OfflinePageItem* OfflinePageModel::GetPageByBookmarkId( |
| - int64_t bookmark_id) const { |
| - const auto iter = offline_pages_.find(bookmark_id); |
| +const std::vector<int64_t> OfflinePageModel::GetOfflineIdsForClientId( |
| + const ClientId& cid) const { |
| + std::vector<int64_t> results; |
| + // TODO(bburns): actually use an index rather than linear scan. |
| + const std::vector<OfflinePageItem> offline_pages = GetAllPages(); |
| + for (size_t i = 0; i < offline_pages.size(); i++) { |
| + if (offline_pages[i].client_id.name_space == cid.name_space && |
| + offline_pages[i].client_id.id == cid.id) { |
| + results.push_back(offline_pages[i].offline_id); |
| + } |
| + } |
| + return results; |
| +} |
| + |
| +const OfflinePageItem* OfflinePageModel::GetPageByOfflineId( |
| + int64_t offline_id) const { |
| + const auto iter = offline_pages_.find(offline_id); |
| return iter != offline_pages_.end() && !iter->second.IsMarkedForDeletion() |
| ? &(iter->second) |
| : nullptr; |
| @@ -350,7 +363,8 @@ OfflinePageMetadataStore* OfflinePageModel::GetStoreForTesting() { |
| } |
| void OfflinePageModel::OnCreateArchiveDone(const GURL& requested_url, |
| - int64_t bookmark_id, |
| + int64_t offline_id, |
| + const ClientId& client_id, |
| const base::Time& start_time, |
| const SavePageCallback& callback, |
| OfflinePageArchiver* archiver, |
| @@ -374,8 +388,8 @@ void OfflinePageModel::OnCreateArchiveDone(const GURL& requested_url, |
| return; |
| } |
| - OfflinePageItem offline_page_item(url, bookmark_id, file_path, file_size, |
| - start_time); |
| + OfflinePageItem offline_page_item(url, offline_id, client_id, file_path, |
| + file_size, start_time); |
| store_->AddOrUpdateOfflinePage( |
| offline_page_item, |
| base::Bind(&OfflinePageModel::OnAddOfflinePageDone, |
| @@ -389,7 +403,7 @@ void OfflinePageModel::OnAddOfflinePageDone(OfflinePageArchiver* archiver, |
| bool success) { |
| SavePageResult result; |
| if (success) { |
| - offline_pages_[offline_page.bookmark_id] = offline_page; |
| + offline_pages_[offline_page.offline_id] = offline_page; |
| result = SavePageResult::SUCCESS; |
| UMA_HISTOGRAM_TIMES( |
| "OfflinePages.SavePageTime", |
| @@ -409,7 +423,7 @@ void OfflinePageModel::OnMarkPageAccesseDone( |
| const OfflinePageItem& offline_page_item, bool success) { |
| // Update the item in the cache only upon success. |
| if (success) |
| - offline_pages_[offline_page_item.bookmark_id] = offline_page_item; |
| + offline_pages_[offline_page_item.offline_id] = offline_page_item; |
| // No need to fire OfflinePageModelChanged event since updating access info |
| // should not have any impact to the UI. |
| @@ -421,7 +435,7 @@ void OfflinePageModel::OnMarkPageForDeletionDone( |
| bool success) { |
| // Update the item in the cache only upon success. |
| if (success) |
| - offline_pages_[offline_page_item.bookmark_id] = offline_page_item; |
| + offline_pages_[offline_page_item.offline_id] = offline_page_item; |
| InformDeletePageDone(callback, success ? DeletePageResult::SUCCESS |
| : DeletePageResult::STORE_FAILURE); |
| @@ -436,31 +450,31 @@ void OfflinePageModel::OnMarkPageForDeletionDone( |
| weak_ptr_factory_.GetWeakPtr()), |
| kFinalDeletionDelay); |
| - FOR_EACH_OBSERVER( |
| - Observer, observers_, OfflinePageDeleted(offline_page_item.bookmark_id)); |
| + FOR_EACH_OBSERVER(Observer, observers_, |
| + OfflinePageDeleted(offline_page_item.offline_id)); |
| } |
| void OfflinePageModel::OnUndoOfflinePageDone( |
| const OfflinePageItem& offline_page, bool success) { |
| if (!success) |
| return; |
| - offline_pages_[offline_page.bookmark_id] = offline_page; |
| + offline_pages_[offline_page.offline_id] = offline_page; |
| FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelChanged(this)); |
| } |
| void OfflinePageModel::FinalizePageDeletion() { |
| - std::vector<int64_t> bookmark_ids_pending_deletion; |
| + std::vector<int64_t> offline_ids_pending_deletion; |
| for (const auto& id_page_pair : offline_pages_) { |
| if (!id_page_pair.second.IsMarkedForDeletion()) |
| continue; |
| - bookmark_ids_pending_deletion.push_back(id_page_pair.second.bookmark_id); |
| + offline_ids_pending_deletion.push_back(id_page_pair.second.offline_id); |
| } |
| - DeletePagesByBookmarkId(bookmark_ids_pending_deletion, DeletePageCallback()); |
| + DeletePagesByOfflineId(offline_ids_pending_deletion, DeletePageCallback()); |
| } |
| -void OfflinePageModel::UndoPageDeletion(int64_t bookmark_id) { |
| - auto iter = offline_pages_.find(bookmark_id); |
| +void OfflinePageModel::UndoPageDeletion(int64_t offline_id) { |
| + auto iter = offline_pages_.find(offline_id); |
| if (iter == offline_pages_.end()) |
| return; |
| @@ -486,7 +500,13 @@ void OfflinePageModel::BookmarkNodeAdded(bookmarks::BookmarkModel* model, |
| int index) { |
| const bookmarks::BookmarkNode* node = parent->GetChild(index); |
| DCHECK(node); |
| - UndoPageDeletion(node->id()); |
| + ClientId cid; |
| + cid.name_space = "bookmark"; |
|
Dmitry Titov
2016/02/23 20:35:20
This should be pulled into a constant. You already
bburns
2016/02/23 20:58:30
Done.
|
| + cid.id = base::Int64ToString(node->id()); |
| + std::vector<int64_t> ids = GetOfflineIdsForClientId(cid); |
| + for (size_t i = 0; i < ids.size(); i++) { |
| + UndoPageDeletion(ids[i]); |
| + } |
| } |
| void OfflinePageModel::BookmarkNodeRemoved( |
| @@ -495,15 +515,22 @@ void OfflinePageModel::BookmarkNodeRemoved( |
| int old_index, |
| const bookmarks::BookmarkNode* node, |
| const std::set<GURL>& removed_urls) { |
| + ClientId cid; |
| + cid.name_space = "bookmark"; |
|
Dmitry Titov
2016/02/23 20:35:20
same as above
bburns
2016/02/23 20:58:30
Done.
|
| + cid.id = base::Int64ToString(node->id()); |
| + std::vector<int64_t> ids = GetOfflineIdsForClientId(cid); |
| if (!is_loaded_) { |
| - delayed_tasks_.push_back( |
| - base::Bind(&OfflinePageModel::MarkPageForDeletion, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - node->id(), |
| - base::Bind(&EmptyDeleteCallback))); |
| + for (size_t i = 0; i < ids.size(); i++) { |
| + delayed_tasks_.push_back( |
| + base::Bind(&OfflinePageModel::MarkPageForDeletion, |
| + weak_ptr_factory_.GetWeakPtr(), ids[i], |
| + base::Bind(&EmptyDeleteCallback))); |
| + } |
| return; |
| } |
| - MarkPageForDeletion(node->id(), base::Bind(&EmptyDeleteCallback)); |
| + for (size_t i = 0; i < ids.size(); i++) { |
| + MarkPageForDeletion(ids[i], base::Bind(&EmptyDeleteCallback)); |
| + } |
| } |
| void OfflinePageModel::BookmarkNodeChanged( |
| @@ -511,9 +538,15 @@ void OfflinePageModel::BookmarkNodeChanged( |
| const bookmarks::BookmarkNode* node) { |
| // BookmarkNodeChanged could be triggered if title or URL gets changed. If |
| // the latter, we need to invalidate the offline copy. |
| - auto iter = offline_pages_.find(node->id()); |
| - if (iter != offline_pages_.end() && iter->second.url != node->url()) |
| - DeletePageByBookmarkId(node->id(), DeletePageCallback()); |
| + ClientId cid; |
| + cid.name_space = "bookmark"; |
|
Dmitry Titov
2016/02/23 20:35:20
same ^^
bburns
2016/02/23 20:58:30
Done.
|
| + cid.id = base::Int64ToString(node->id()); |
| + std::vector<int64_t> ids = GetOfflineIdsForClientId(cid); |
| + for (size_t i = 0; i < ids.size(); i++) { |
| + auto iter = offline_pages_.find(ids[i]); |
| + if (iter != offline_pages_.end() && iter->second.url != node->url()) |
| + DeletePageByOfflineId(ids[i], DeletePageCallback()); |
| + } |
| } |
| void OfflinePageModel::OnEnsureArchivesDirCreatedDone() { |
| @@ -561,7 +594,7 @@ void OfflinePageModel::DeletePendingArchiver(OfflinePageArchiver* archiver) { |
| } |
| void OfflinePageModel::OnDeleteArchiveFilesDone( |
| - const std::vector<int64_t>& bookmark_ids, |
| + const std::vector<int64_t>& offline_ids, |
| const DeletePageCallback& callback, |
| const bool* success) { |
| DCHECK(success); |
| @@ -572,21 +605,21 @@ void OfflinePageModel::OnDeleteArchiveFilesDone( |
| } |
| store_->RemoveOfflinePages( |
| - bookmark_ids, |
| + offline_ids, |
| base::Bind(&OfflinePageModel::OnRemoveOfflinePagesDone, |
| - weak_ptr_factory_.GetWeakPtr(), bookmark_ids, callback)); |
| + weak_ptr_factory_.GetWeakPtr(), offline_ids, callback)); |
| } |
| void OfflinePageModel::OnRemoveOfflinePagesDone( |
| - const std::vector<int64_t>& bookmark_ids, |
| + const std::vector<int64_t>& offline_ids, |
| const DeletePageCallback& callback, |
| bool success) { |
| // Delete the offline page from the in memory cache regardless of success in |
| // store. |
| base::Time now = base::Time::Now(); |
| int64_t total_size = 0; |
| - for (int64_t bookmark_id : bookmark_ids) { |
| - auto iter = offline_pages_.find(bookmark_id); |
| + for (int64_t offline_id : offline_ids) { |
| + auto iter = offline_pages_.find(offline_id); |
| if (iter == offline_pages_.end()) |
| continue; |
| total_size += iter->second.file_size; |
| @@ -617,21 +650,19 @@ void OfflinePageModel::OnRemoveOfflinePagesDone( |
| // yet informed the observer that the offline page is deleted. |
| if (!iter->second.IsMarkedForDeletion()) { |
| FOR_EACH_OBSERVER(Observer, observers_, |
| - OfflinePageDeleted(iter->second.bookmark_id)); |
| + OfflinePageDeleted(iter->second.offline_id)); |
| } |
| offline_pages_.erase(iter); |
| } |
| - if (bookmark_ids.size() > 1) { |
| - UMA_HISTOGRAM_COUNTS( |
| - "OfflinePages.BatchDelete.Count", bookmark_ids.size()); |
| + if (offline_ids.size() > 1) { |
| + UMA_HISTOGRAM_COUNTS("OfflinePages.BatchDelete.Count", offline_ids.size()); |
| UMA_HISTOGRAM_MEMORY_KB( |
| "OfflinePages.BatchDelete.TotalPageSize", total_size / 1024); |
| } |
| // Deleting multiple pages always succeeds when it gets to this point. |
| - InformDeletePageDone( |
| - callback, |
| - (success || bookmark_ids.size() > 1) ? DeletePageResult::SUCCESS |
| - : DeletePageResult::STORE_FAILURE); |
| + InformDeletePageDone(callback, (success || offline_ids.size() > 1) |
| + ? DeletePageResult::SUCCESS |
| + : DeletePageResult::STORE_FAILURE); |
| } |
| void OfflinePageModel::InformDeletePageDone(const DeletePageCallback& callback, |
| @@ -664,10 +695,10 @@ void OfflinePageModel::OnFindPagesMissingArchiveFile( |
| } |
| void OfflinePageModel::OnRemoveOfflinePagesMissingArchiveFileDone( |
| - const std::vector<int64_t>& bookmark_ids, |
| + const std::vector<int64_t>& offline_ids, |
| OfflinePageModel::DeletePageResult /* result */) { |
| - for (int64_t bookmark_id : bookmark_ids) { |
| - FOR_EACH_OBSERVER(Observer, observers_, OfflinePageDeleted(bookmark_id)); |
| + for (int64_t offline_id : offline_ids) { |
| + FOR_EACH_OBSERVER(Observer, observers_, OfflinePageDeleted(offline_id)); |
| } |
| } |
| @@ -711,7 +742,7 @@ 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; |
| + offline_pages_[offline_page.offline_id] = offline_page; |
| } |
| } // namespace offline_pages |