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

Unified Diff: components/offline_pages/offline_page_model.cc

Issue 1397233002: [Offline pages] Detecting missing offline copy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebasing Created 5 years, 2 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 3e93bf9b86b157b8db4373d286061ebf12a76b80..353166c530f94855ee5787c0c150979a6a4cc4a4 100644
--- a/components/offline_pages/offline_page_model.cc
+++ b/components/offline_pages/offline_page_model.cc
@@ -5,6 +5,7 @@
#include "components/offline_pages/offline_page_model.h"
#include <algorithm>
+#include <utility>
#include "base/bind.h"
#include "base/files/file_util.h"
@@ -73,6 +74,19 @@ void DeleteArchiveFiles(const std::vector<base::FilePath>& paths_to_delete,
void EmptyDeleteCallback(OfflinePageModel::DeletePageResult /* result */) {
}
+void ListPagesMissingArchiveFile(
jianli 2015/10/20 21:56:49 I think FindPagesMissingArchiveFile sounds easier
fgorski 2015/10/21 20:01:33 Done.
+ const std::vector<std::pair<int64, base::FilePath>>& id_path_pairs,
+ std::vector<int64>* ids_of_pages_missing_archive_file) {
+ DCHECK(ids_of_pages_missing_archive_file);
+
+ for (const auto& id_path : id_path_pairs) {
+ if (!base::PathExists(id_path.second) ||
+ !base::DirectoryExists(id_path.second)) {
jianli 2015/10/20 21:56:49 The not operator should be removed for the 2nd tes
fgorski 2015/10/21 20:01:33 Done.
+ ids_of_pages_missing_archive_file->push_back(id_path.first);
+ }
+ }
+}
+
} // namespace
OfflinePageModel::OfflinePageModel(
@@ -233,6 +247,25 @@ const OfflinePageItem* OfflinePageModel::GetPageByOfflineURL(
return nullptr;
}
+void OfflinePageModel::CheckForExternalFileDeletion() {
+ DCHECK(is_loaded_);
+
+ std::vector<std::pair<int64, base::FilePath>> id_path_pairs;
+ for (const auto& id_page_pair : offline_pages_) {
+ id_path_pairs.push_back(
+ std::make_pair(id_page_pair.first, id_page_pair.second.file_path));
+ }
+
+ std::vector<int64>* ids_of_pages_missing_archive_file =
+ new std::vector<int64>();
+ task_runner_->PostTaskAndReply(
+ FROM_HERE, base::Bind(&ListPagesMissingArchiveFile, id_path_pairs,
+ ids_of_pages_missing_archive_file),
+ base::Bind(&OfflinePageModel::OnListPagesMissingArchiveFileDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ base::Owned(ids_of_pages_missing_archive_file)));
+}
+
OfflinePageMetadataStore* OfflinePageModel::GetStoreForTesting() {
return store_.get();
}
@@ -320,7 +353,8 @@ void OfflinePageModel::OnMarkPageForDeletionDone(
weak_ptr_factory_.GetWeakPtr()),
kFinalDeletionDelay);
- FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelChanged(this));
+ FOR_EACH_OBSERVER(
+ Observer, observers_, OfflinePageDeleted(offline_page_item.bookmark_id));
jianli 2015/10/20 21:56:48 I think we should be firing both OfflinePageModelC
fgorski 2015/10/21 20:01:33 I think triggering OfflinePageDeleted is enough an
jianli 2015/10/21 21:21:11 Yes, we should avoid this. I now understand how bo
}
void OfflinePageModel::OnUndoOfflinePageDone(
@@ -410,6 +444,8 @@ void OfflinePageModel::OnLoadDone(
FinalizePageDeletion();
FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this));
+
+ CheckForExternalFileDeletion();
}
void OfflinePageModel::InformSavePageDone(const SavePageCallback& callback,
@@ -478,4 +514,32 @@ void OfflinePageModel::InformDeletePageDone(const DeletePageCallback& callback,
callback.Run(result);
}
+void OfflinePageModel::OnListPagesMissingArchiveFileDone(
+ const std::vector<int64>* ids_of_pages_missing_archive_file) {
+ DCHECK(ids_of_pages_missing_archive_file);
+ if (ids_of_pages_missing_archive_file->empty())
+ return;
+
+ DeletePageCallback done_callback(
+ base::Bind(&OfflinePageModel::OnRemovalOfPagesMissingArchiveFileDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ *ids_of_pages_missing_archive_file));
+
+ store_->RemoveOfflinePages(
+ *ids_of_pages_missing_archive_file,
+ base::Bind(&OfflinePageModel::OnRemoveOfflinePagesDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ *ids_of_pages_missing_archive_file,
+ done_callback));
+}
+
+void OfflinePageModel::OnRemovalOfPagesMissingArchiveFileDone(
jianli 2015/10/20 21:56:49 The name OnRemovalOfPagesMissingArchiveFileDone se
fgorski 2015/10/21 20:01:33 How about: OnRemoveOfflinePagesMissingArchiveFileD
+ const std::vector<int64>& bookmark_ids,
+ OfflinePageModel::DeletePageResult /* result */) {
+ for (int64 bookmark_id : bookmark_ids) {
jianli 2015/10/20 21:56:49 nit: remove unneeded brackets
fgorski 2015/10/21 20:01:33 No, because it won't compile on Windows
+ FOR_EACH_OBSERVER(Observer, observers_, OfflinePageDeleted(bookmark_id));
+ }
+}
+
jianli 2015/10/20 21:56:48 nit: remove extra blank line
fgorski 2015/10/21 20:01:33 Done.
+
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698