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_); |
} |