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

Unified Diff: chrome/browser/bookmarks/bookmark_model.cc

Issue 242693003: Introduce BookmarkClient interface to abstract embedder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 8 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: chrome/browser/bookmarks/bookmark_model.cc
diff --git a/chrome/browser/bookmarks/bookmark_model.cc b/chrome/browser/bookmarks/bookmark_model.cc
index 1f49a239f33781caca74d1d659ec99085aa1ea09..124558317cec41999482d61db419a245ef4713f5 100644
--- a/chrome/browser/bookmarks/bookmark_model.cc
+++ b/chrome/browser/bookmarks/bookmark_model.cc
@@ -10,29 +10,19 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/i18n/string_compare.h"
-#include "base/prefs/pref_service.h"
-#include "base/sequenced_task_runner.h"
+#include "base/logging.h"
+#include "base/strings/string_util.h"
#include "chrome/browser/bookmarks/bookmark_expanded_state_tracker.h"
#include "chrome/browser/bookmarks/bookmark_index.h"
#include "chrome/browser/bookmarks/bookmark_model_observer.h"
+#include "chrome/browser/bookmarks/bookmark_node_data.h"
#include "chrome/browser/bookmarks/bookmark_storage.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/favicon/favicon_changed_details.h"
-#include "chrome/browser/favicon/favicon_service.h"
-#include "chrome/browser/favicon/favicon_service_factory.h"
-#include "chrome/browser/history/history_service.h"
-#include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/pref_names.h"
#include "components/bookmarks/core/browser/bookmark_match.h"
#include "components/favicon_base/favicon_types.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_source.h"
#include "grit/component_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/favicon_size.h"
-#include "ui/gfx/image/image_util.h"
using base::Time;
@@ -72,9 +62,8 @@ class SortComparator : public std::binary_function<const BookmarkNode*,
// BookmarkModel --------------------------------------------------------------
-BookmarkModel::BookmarkModel(Profile* profile,
- bool index_urls)
- : profile_(profile),
+BookmarkModel::BookmarkModel(BookmarkClient* client, bool index_urls)
+ : client_(client),
loaded_(false),
root_(GURL()),
bookmark_bar_node_(NULL),
@@ -85,10 +74,7 @@ BookmarkModel::BookmarkModel(Profile* profile,
index_urls_(index_urls),
loaded_signal_(true, false),
extensive_changes_(0) {
- if (!profile_) {
- // Profile is null during testing.
- DoneLoading(CreateLoadDetails());
- }
+ DCHECK(client_);
}
BookmarkModel::~BookmarkModel() {
@@ -112,7 +98,11 @@ void BookmarkModel::Shutdown() {
}
void BookmarkModel::Load(
- const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
+ PrefService* pref_service,
+ const std::string& accept_languages,
+ const base::FilePath& profile_path,
+ const scoped_refptr<base::SequencedTaskRunner>& io_task_runner,
+ const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner) {
if (store_.get()) {
// If the store is non-null, it means Load was already invoked. Load should
// only be invoked once.
@@ -121,16 +111,11 @@ void BookmarkModel::Load(
}
expanded_state_tracker_.reset(
- new BookmarkExpandedStateTracker(this, profile_->GetPrefs()));
-
- // Listen for changes to favicons so that we can update the favicon of the
- // node appropriately.
- registrar_.Add(this, chrome::NOTIFICATION_FAVICON_CHANGED,
- content::Source<Profile>(profile_));
+ new BookmarkExpandedStateTracker(this, pref_service));
// Load the bookmarks. BookmarkStorage notifies us when done.
- store_ = new BookmarkStorage(profile_, this, task_runner.get());
- store_->LoadBookmarks(CreateLoadDetails());
+ store_ = new BookmarkStorage(this, profile_path, io_task_runner.get());
+ store_->LoadBookmarks(CreateLoadDetails(accept_languages), ui_task_runner);
}
const BookmarkNode* BookmarkModel::GetParentForNewNodes() {
@@ -208,7 +193,7 @@ void BookmarkModel::RemoveAll() {
if (store_.get())
store_->ScheduleSave();
- NotifyHistoryAboutRemovedBookmarks(removed_urls);
+ client_->NotifyHistoryAboutRemovedBookmarks(removed_urls);
FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
BookmarkAllNodesRemoved(this));
@@ -289,7 +274,8 @@ const gfx::Image& BookmarkModel::GetFavicon(const BookmarkNode* node) {
return node->favicon();
}
-void BookmarkModel::SetTitle(const BookmarkNode* node, const base::string16& title) {
+void BookmarkModel::SetTitle(const BookmarkNode* node,
+ const base::string16& title) {
if (!node) {
NOTREACHED();
return;
@@ -417,6 +403,27 @@ void BookmarkModel::SetNodeSyncTransactionVersion(
store_->ScheduleSave();
}
+void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) {
+ // Ignore events if |Load| has not been called yet.
+ if (!store_)
+ return;
+
+ // Prevent the observers from getting confused for multiple favicon loads.
+ for (std::set<GURL>::const_iterator i = urls.begin(); i != urls.end(); ++i) {
+ std::vector<const BookmarkNode*> nodes;
+ GetNodesByURL(*i, &nodes);
+ for (size_t i = 0; i < nodes.size(); ++i) {
+ // Got an updated favicon, for a URL, do a new request.
+ BookmarkNode* node = AsMutable(nodes[i]);
+ node->InvalidateFavicon();
+ CancelPendingFaviconLoadRequests(node);
+ FOR_EACH_OBSERVER(BookmarkModelObserver,
+ observers_,
+ BookmarkNodeFaviconChanged(this, node));
+ }
+ }
+}
+
void BookmarkModel::SetDateAdded(const BookmarkNode* node,
base::Time date_added) {
if (!node) {
@@ -624,7 +631,6 @@ void BookmarkModel::GetBookmarksMatching(
}
void BookmarkModel::ClearStore() {
- registrar_.RemoveAll();
store_ = NULL;
}
@@ -740,7 +746,7 @@ void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) {
if (store_.get())
store_->ScheduleSave();
- NotifyHistoryAboutRemovedBookmarks(removed_urls);
+ client_->NotifyHistoryAboutRemovedBookmarks(removed_urls);
sky 2014/04/23 20:32:07 I don't think this needs to be on the client. The
sdefresne 2014/04/24 12:30:15 Make sense. I was also considering doing it. I'll
FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
BookmarkNodeRemoved(this, parent, index, node.get()));
@@ -784,22 +790,6 @@ void BookmarkModel::RemoveNodeAndGetRemovedUrls(BookmarkNode* node,
}
}
-void BookmarkModel::NotifyHistoryAboutRemovedBookmarks(
- const std::set<GURL>& removed_bookmark_urls) const {
- if (removed_bookmark_urls.empty()) {
- // No point in sending out notification if the starred state didn't change.
- return;
- }
-
- if (profile_) {
- HistoryService* history =
- HistoryServiceFactory::GetForProfile(profile_,
- Profile::EXPLICIT_ACCESS);
- if (history)
- history->URLsNoLongerBookmarked(removed_bookmark_urls);
- }
-}
-
BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent,
int index,
BookmarkNode* node) {
@@ -873,19 +863,15 @@ void BookmarkModel::LoadFavicon(BookmarkNode* node) {
return;
DCHECK(node->url().is_valid());
- FaviconService* favicon_service = FaviconServiceFactory::GetForProfile(
- profile_, Profile::EXPLICIT_ACCESS);
- if (!favicon_service)
- return;
- base::CancelableTaskTracker::TaskId taskId =
- favicon_service->GetFaviconImageForURL(
- FaviconService::FaviconForURLParams(
- node->url(), favicon_base::FAVICON, gfx::kFaviconSize),
- base::Bind(&BookmarkModel::OnFaviconDataAvailable,
- base::Unretained(this),
- node),
- &cancelable_task_tracker_);
- node->set_favicon_load_task_id(taskId);
+ base::CancelableTaskTracker::TaskId taskId = client_->GetFaviconImageForURL(
+ node->url(),
+ favicon_base::FAVICON,
+ gfx::kFaviconSize,
+ base::Bind(
+ &BookmarkModel::OnFaviconDataAvailable, base::Unretained(this), node),
+ &cancelable_task_tracker_);
+ if (taskId != base::CancelableTaskTracker::kBadTaskId)
+ node->set_favicon_load_task_id(taskId);
}
void BookmarkModel::FaviconLoaded(const BookmarkNode* node) {
@@ -900,35 +886,6 @@ void BookmarkModel::CancelPendingFaviconLoadRequests(BookmarkNode* node) {
}
}
-void BookmarkModel::Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- switch (type) {
- case chrome::NOTIFICATION_FAVICON_CHANGED: {
- // Prevent the observers from getting confused for multiple favicon loads.
- content::Details<FaviconChangedDetails> favicon_details(details);
- for (std::set<GURL>::const_iterator i = favicon_details->urls.begin();
- i != favicon_details->urls.end(); ++i) {
- std::vector<const BookmarkNode*> nodes;
- GetNodesByURL(*i, &nodes);
- for (size_t i = 0; i < nodes.size(); ++i) {
- // Got an updated favicon, for a URL, do a new request.
- BookmarkNode* node = AsMutable(nodes[i]);
- node->InvalidateFavicon();
- CancelPendingFaviconLoadRequests(node);
- FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
- BookmarkNodeFaviconChanged(this, node));
- }
- }
- break;
- }
-
- default:
- NOTREACHED();
- break;
- }
-}
-
void BookmarkModel::PopulateNodesByURL(BookmarkNode* node) {
// NOTE: this is called with url_lock_ already held. As such, this doesn't
// explicitly grab the lock.
@@ -942,7 +899,8 @@ int64 BookmarkModel::generate_next_node_id() {
return next_node_id_++;
}
-BookmarkLoadDetails* BookmarkModel::CreateLoadDetails() {
+BookmarkLoadDetails* BookmarkModel::CreateLoadDetails(
+ const std::string& accept_languages) {
BookmarkPermanentNode* bb_node =
CreatePermanentNode(BookmarkNode::BOOKMARK_BAR);
BookmarkPermanentNode* other_node =
@@ -950,12 +908,9 @@ BookmarkLoadDetails* BookmarkModel::CreateLoadDetails() {
BookmarkPermanentNode* mobile_node =
CreatePermanentNode(BookmarkNode::MOBILE);
return new BookmarkLoadDetails(
- bb_node, other_node, mobile_node,
- new BookmarkIndex(
- profile_,
- index_urls_,
- profile_ ?
- profile_->GetPrefs()->GetString(prefs::kAcceptLanguages) :
- std::string()),
+ bb_node,
+ other_node,
+ mobile_node,
+ new BookmarkIndex(client_, index_urls_, accept_languages),
next_node_id_);
}

Powered by Google App Engine
This is Rietveld 408576698