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

Unified Diff: components/offline_pages/offline_page_metadata_store_impl.cc

Issue 1420003004: Wipe out offline page data on clearing cookie and site data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address more feedback 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_metadata_store_impl.cc
diff --git a/components/offline_pages/offline_page_metadata_store_impl.cc b/components/offline_pages/offline_page_metadata_store_impl.cc
index 974df27c1fc56a8d985ef3c4d9d7b3fd70b6e4cf..d1b9ce8b1dc59099a9f037b6d54dff814a54b5f1 100644
--- a/components/offline_pages/offline_page_metadata_store_impl.cc
+++ b/components/offline_pages/offline_page_metadata_store_impl.cc
@@ -16,7 +16,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/thread_task_runner_handle.h"
-#include "components/leveldb_proto/proto_database.h"
+#include "components/leveldb_proto/proto_database_impl.h"
#include "components/offline_pages/offline_page_item.h"
#include "components/offline_pages/proto/offline_pages.pb.h"
#include "third_party/leveldatabase/env_chromium.h"
@@ -36,8 +36,6 @@ const char kDatabaseUMAClientName[] = "OfflinePageMetadataStore";
namespace offline_pages {
namespace {
-typedef std::vector<OfflinePageEntry> OfflinePageEntryVector;
-
void OfflinePageItemToEntry(const OfflinePageItem& item,
offline_pages::OfflinePageEntry* item_proto) {
DCHECK(item_proto);
@@ -94,85 +92,87 @@ bool OfflinePageItemFromEntry(const offline_pages::OfflinePageEntry& item_proto,
return true;
}
-void OnLoadDone(const OfflinePageMetadataStore::LoadCallback& callback,
- const base::Callback<void()>& failure_callback,
- bool success,
- scoped_ptr<OfflinePageEntryVector> entries) {
- UMA_HISTOGRAM_BOOLEAN("OfflinePages.LoadSuccess", success);
- if (!success) {
- DVLOG(1) << "Offline pages database load failed.";
- failure_callback.Run();
- base::MessageLoop::current()->PostTask(
- FROM_HERE, base::Bind(callback, false, std::vector<OfflinePageItem>()));
- return;
- }
-
- std::vector<OfflinePageItem> result;
- for (OfflinePageEntryVector::iterator it = entries->begin();
- it != entries->end(); ++it) {
- OfflinePageItem item;
- if (OfflinePageItemFromEntry(*it, &item))
- result.push_back(item);
- else
- DVLOG(1) << "Failed to create offline page item from proto.";
- }
- UMA_HISTOGRAM_COUNTS("OfflinePages.SavedPageCount", result.size());
-
- base::MessageLoop::current()->PostTask(FROM_HERE,
- base::Bind(callback, true, result));
-}
-
-void OnUpdateDone(const OfflinePageMetadataStore::UpdateCallback& callback,
- const base::Callback<void()>& failure_callback,
- bool success) {
- if (!success) {
- // TODO(fgorski): Add UMA for this case.
- DVLOG(1) << "Offline pages database update failed.";
- failure_callback.Run();
- }
-
- base::MessageLoop::current()->PostTask(FROM_HERE,
- base::Bind(callback, success));
-}
-
} // namespace
OfflinePageMetadataStoreImpl::OfflinePageMetadataStoreImpl(
- scoped_ptr<ProtoDatabase<OfflinePageEntry>> database,
+ scoped_refptr<base::SequencedTaskRunner> background_task_runner,
const base::FilePath& database_dir)
- : database_(database.Pass()), weak_ptr_factory_(this) {
- database_->Init(kDatabaseUMAClientName, database_dir,
- base::Bind(&OfflinePageMetadataStoreImpl::OnInitDone,
- weak_ptr_factory_.GetWeakPtr()));
+ : background_task_runner_(background_task_runner),
+ database_dir_(database_dir),
+ weak_ptr_factory_(this) {
}
OfflinePageMetadataStoreImpl::~OfflinePageMetadataStoreImpl() {
}
-void OfflinePageMetadataStoreImpl::OnInitDone(bool success) {
+void OfflinePageMetadataStoreImpl::Load(const LoadCallback& callback) {
+ // First initialize the database.
+ database_.reset(new leveldb_proto::ProtoDatabaseImpl<OfflinePageEntry>(
+ background_task_runner_));
+ database_->Init(kDatabaseUMAClientName, database_dir_,
+ base::Bind(&OfflinePageMetadataStoreImpl::LoadContinuation,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
+}
+
+void OfflinePageMetadataStoreImpl::LoadContinuation(
+ const LoadCallback& callback,
+ bool success) {
if (!success) {
- // TODO(fgorski): Add UMA for this case.
- DVLOG(1) << "Offline pages database init failed.";
- ResetDB();
+ NotifyLoadResult(callback,
+ STORE_INIT_FAILED,
+ std::vector<OfflinePageItem>());
return;
}
+
+ // After initialization, start to load the data.
+ database_->LoadEntries(
+ base::Bind(&OfflinePageMetadataStoreImpl::LoadDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
}
-void OfflinePageMetadataStoreImpl::Load(const LoadCallback& callback) {
- if (!database_.get()) {
- // Failing fast here, because DB is not initialized, and there is nothing
- // that can be done about it.
- // Callback is invoked through message loop to avoid improper retry and
- // simplify testing.
- DVLOG(1) << "Offline pages database not available in Load.";
- base::MessageLoop::current()->PostTask(
- FROM_HERE, base::Bind(callback, false, std::vector<OfflinePageItem>()));
- return;
+void OfflinePageMetadataStoreImpl::LoadDone(
+ const LoadCallback& callback,
+ bool success,
+ scoped_ptr<std::vector<OfflinePageEntry>> entries) {
+ DCHECK(entries);
+
+ std::vector<OfflinePageItem> result;
+ LoadStatus status = LOAD_SUCCEEDED;
+
+ if (success) {
+ for (const auto& entry : *entries) {
+ OfflinePageItem item;
+ if (!OfflinePageItemFromEntry(entry, &item)) {
+ status = DATA_PARSING_FAILED;
+ result.clear();
+ break;
+ }
+ result.push_back(item);
+ }
+
+ } else {
+ status = STORE_LOAD_FAILED;
}
- database_->LoadEntries(base::Bind(
- &OnLoadDone, callback, base::Bind(&OfflinePageMetadataStoreImpl::ResetDB,
- weak_ptr_factory_.GetWeakPtr())));
+ NotifyLoadResult(callback, status, result);
+}
+
+void OfflinePageMetadataStoreImpl::NotifyLoadResult(
+ const LoadCallback& callback,
+ LoadStatus status,
+ const std::vector<OfflinePageItem>& result) {
+ UMA_HISTOGRAM_ENUMERATION("OfflinePages.LoadStatus",
+ status,
+ OfflinePageMetadataStore::LOAD_STATUS_COUNT);
+ if (status == LOAD_SUCCEEDED) {
+ UMA_HISTOGRAM_COUNTS("OfflinePages.SavedPageCount", result.size());
+ } else {
+ DVLOG(1) << "Offline pages database loading failed: " << status;
+ database_.reset();
+ }
+ callback.Run(status, result);
}
void OfflinePageMetadataStoreImpl::AddOrUpdateOfflinePage(
@@ -223,14 +223,35 @@ void OfflinePageMetadataStoreImpl::UpdateEntries(
database_->UpdateEntries(
entries_to_save.Pass(), keys_to_remove.Pass(),
- base::Bind(&OnUpdateDone, callback,
- base::Bind(&OfflinePageMetadataStoreImpl::ResetDB,
- weak_ptr_factory_.GetWeakPtr())));
+ base::Bind(&OfflinePageMetadataStoreImpl::UpdateDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
+}
+
+void OfflinePageMetadataStoreImpl::UpdateDone(
+ const OfflinePageMetadataStore::UpdateCallback& callback,
+ bool success) {
+ if (!success) {
+ // TODO(fgorski): Add UMA for this case. Consider rebuilding the store.
+ DVLOG(1) << "Offline pages database update failed.";
+ }
+
+ callback.Run(success);
+}
+
+void OfflinePageMetadataStoreImpl::Reset(const ResetCallback& callback) {
+ database_->Destroy(
+ base::Bind(&OfflinePageMetadataStoreImpl::ResetDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
}
-void OfflinePageMetadataStoreImpl::ResetDB() {
+void OfflinePageMetadataStoreImpl::ResetDone(
+ const ResetCallback& callback,
+ bool success) {
database_.reset();
weak_ptr_factory_.InvalidateWeakPtrs();
+ callback.Run(success);
}
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698