Index: components/bookmarks/browser/bookmark_model.cc |
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc |
index 2e174dbedc63314fc2de85d1accdda9582439c90..fe5f04b1fefa9134a804d190891d69b75e01f9c4 100644 |
--- a/components/bookmarks/browser/bookmark_model.cc |
+++ b/components/bookmarks/browser/bookmark_model.cc |
@@ -446,24 +446,35 @@ void BookmarkModel::SetNodeSyncTransactionVersion( |
store_->ScheduleSave(); |
} |
-void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) { |
+void BookmarkModel::OnFaviconChanged(const std::vector<GURL>& page_urls, |
+ const std::vector<GURL>& icon_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::set<const BookmarkNode*> to_update; |
+ for (const GURL& page_url : page_urls) { |
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)); |
- } |
+ GetNodesByURL(page_url, &nodes); |
+ for (const BookmarkNode* node : nodes) |
+ to_update.insert(node); |
+ } |
+ |
+ for (const GURL& icon_url : icon_urls) { |
+ std::vector<const BookmarkNode*> nodes; |
+ GetNodesByIconURL(icon_url, &nodes); |
+ for (const BookmarkNode* node : nodes) |
+ to_update.insert(node); |
+ } |
+ |
+ for (const BookmarkNode* node : to_update) { |
+ // Rerequest the favicon. |
+ BookmarkNode* mutable_node = AsMutable(node); |
+ mutable_node->InvalidateFavicon(); |
+ CancelPendingFaviconLoadRequests(mutable_node); |
+ FOR_EACH_OBSERVER(BookmarkModelObserver, |
+ observers_, |
+ BookmarkNodeFaviconChanged(this, mutable_node)); |
} |
} |
@@ -504,6 +515,16 @@ void BookmarkModel::GetNodesByURL(const GURL& url, |
} |
} |
+void BookmarkModel::GetNodesByIconURL(const GURL& icon_url, |
+ std::vector<const BookmarkNode*>* nodes) { |
+ // TODO: Do something more efficient if this gets called a lot |
+ base::AutoLock url_lock(url_lock_); |
+ for (const BookmarkNode* node : nodes_ordered_by_url_set_) { |
+ if (node->icon_url() == icon_url) |
+ nodes->push_back(node); |
+ } |
+} |
+ |
const BookmarkNode* BookmarkModel::GetMostRecentlyAddedUserNodeForURL( |
const GURL& url) { |
std::vector<const BookmarkNode*> nodes; |