Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Unified Diff: components/offline_pages/offline_page_model.cc

Issue 1694863003: Refactor the offline page storage to include client namespace and id. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..65ecd3ee83fddeb046f920bd243f01544b0e1ee5 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_);
@@ -165,13 +168,14 @@ void OfflinePageModel::SavePage(const GURL& url,
archiver->CreateArchive(archives_dir_,
base::Bind(&OfflinePageModel::OnCreateArchiveDone,
weak_ptr_factory_.GetWeakPtr(), url,
- bookmark_id, base::Time::Now(), callback));
+ 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 +194,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 +213,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);
}
@@ -242,7 +246,7 @@ void OfflinePageModel::DeletePagesByBookmarkId(
base::Bind(&DeleteArchiveFiles, paths_to_delete, success),
base::Bind(&OfflinePageModel::OnDeleteArchiveFilesDone,
weak_ptr_factory_.GetWeakPtr(),
- bookmark_ids,
+ offline_ids,
callback,
base::Owned(success)));
}
@@ -250,11 +254,11 @@ void OfflinePageModel::DeletePagesByBookmarkId(
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));
@@ -295,9 +299,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_namespace == cid.space &&
+ offline_pages[i].client_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 +368,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 +393,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 +408,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 +428,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 +440,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);
@@ -437,30 +456,30 @@ void OfflinePageModel::OnMarkPageForDeletionDone(
kFinalDeletionDelay);
FOR_EACH_OBSERVER(
- Observer, observers_, OfflinePageDeleted(offline_page_item.bookmark_id));
+ 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 +505,13 @@ void OfflinePageModel::BookmarkNodeAdded(bookmarks::BookmarkModel* model,
int index) {
const bookmarks::BookmarkNode* node = parent->GetChild(index);
DCHECK(node);
- UndoPageDeletion(node->id());
+ ClientId cid;
+ cid.space = "bookmark";
+ 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 +520,23 @@ void OfflinePageModel::BookmarkNodeRemoved(
int old_index,
const bookmarks::BookmarkNode* node,
const std::set<GURL>& removed_urls) {
+ ClientId cid;
+ cid.space = "bookmark";
+ 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 +544,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.space = "bookmark";
+ 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 +600,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 +611,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 +656,21 @@ 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) {
+ if (offline_ids.size() > 1) {
UMA_HISTOGRAM_COUNTS(
- "OfflinePages.BatchDelete.Count", bookmark_ids.size());
+ "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);
+ (success || offline_ids.size() > 1) ? DeletePageResult::SUCCESS
+ : DeletePageResult::STORE_FAILURE);
}
void OfflinePageModel::InformDeletePageDone(const DeletePageCallback& callback,
@@ -664,10 +703,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 +750,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

Powered by Google App Engine
This is Rietveld 408576698