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

Side by Side Diff: components/bookmarks/browser/bookmark_model.cc

Issue 1133463005: Update all bookmarks which use an icon URL when a favicon's bitmap is updated (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@startup_do_not_unexpire
Patch Set: Created 5 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/bookmarks/browser/bookmark_model.h" 5 #include "components/bookmarks/browser/bookmark_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 DCHECK(client_->CanSyncNode(node)); 439 DCHECK(client_->CanSyncNode(node));
440 440
441 if (sync_transaction_version == node->sync_transaction_version()) 441 if (sync_transaction_version == node->sync_transaction_version())
442 return; 442 return;
443 443
444 AsMutable(node)->set_sync_transaction_version(sync_transaction_version); 444 AsMutable(node)->set_sync_transaction_version(sync_transaction_version);
445 if (store_.get()) 445 if (store_.get())
446 store_->ScheduleSave(); 446 store_->ScheduleSave();
447 } 447 }
448 448
449 void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) { 449 void BookmarkModel::OnFaviconsChanged(const std::vector<GURL>& page_urls,
450 const std::vector<GURL>& icon_urls) {
450 // Ignore events if |Load| has not been called yet. 451 // Ignore events if |Load| has not been called yet.
451 if (!store_) 452 if (!store_)
452 return; 453 return;
453 454
454 // Prevent the observers from getting confused for multiple favicon loads. 455 std::set<const BookmarkNode*> to_update;
455 for (std::set<GURL>::const_iterator i = urls.begin(); i != urls.end(); ++i) { 456 for (const GURL& page_url : page_urls) {
456 std::vector<const BookmarkNode*> nodes; 457 std::vector<const BookmarkNode*> nodes;
457 GetNodesByURL(*i, &nodes); 458 GetNodesByURL(page_url, &nodes);
458 for (size_t i = 0; i < nodes.size(); ++i) { 459 for (const BookmarkNode* node : nodes)
459 // Got an updated favicon, for a URL, do a new request. 460 to_update.insert(node);
460 BookmarkNode* node = AsMutable(nodes[i]); 461 }
461 node->InvalidateFavicon(); 462
462 CancelPendingFaviconLoadRequests(node); 463 for (const GURL& icon_url : icon_urls) {
463 FOR_EACH_OBSERVER(BookmarkModelObserver, 464 std::vector<const BookmarkNode*> nodes;
464 observers_, 465 GetNodesByIconURL(icon_url, &nodes);
465 BookmarkNodeFaviconChanged(this, node)); 466 for (const BookmarkNode* node : nodes)
466 } 467 to_update.insert(node);
468 }
469
470 for (const BookmarkNode* node : to_update) {
471 // Rerequest the favicon.
472 BookmarkNode* mutable_node = AsMutable(node);
473 mutable_node->InvalidateFavicon();
474 CancelPendingFaviconLoadRequests(mutable_node);
475 FOR_EACH_OBSERVER(BookmarkModelObserver,
476 observers_,
477 BookmarkNodeFaviconChanged(this, mutable_node));
467 } 478 }
468 } 479 }
469 480
470 void BookmarkModel::SetDateAdded(const BookmarkNode* node, 481 void BookmarkModel::SetDateAdded(const BookmarkNode* node,
471 Time date_added) { 482 Time date_added) {
472 if (!node) { 483 if (!node) {
473 NOTREACHED(); 484 NOTREACHED();
474 return; 485 return;
475 } 486 }
476 487
(...skipping 20 matching lines...) Expand all
497 std::vector<const BookmarkNode*>* nodes) { 508 std::vector<const BookmarkNode*>* nodes) {
498 base::AutoLock url_lock(url_lock_); 509 base::AutoLock url_lock(url_lock_);
499 BookmarkNode tmp_node(url); 510 BookmarkNode tmp_node(url);
500 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(&tmp_node); 511 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(&tmp_node);
501 while (i != nodes_ordered_by_url_set_.end() && (*i)->url() == url) { 512 while (i != nodes_ordered_by_url_set_.end() && (*i)->url() == url) {
502 nodes->push_back(*i); 513 nodes->push_back(*i);
503 ++i; 514 ++i;
504 } 515 }
505 } 516 }
506 517
518 void BookmarkModel::GetNodesByIconURL(const GURL& icon_url,
519 std::vector<const BookmarkNode*>* nodes) {
520 // TODO: Do something more efficient if this gets called a lot
sky 2015/05/22 03:09:06 Any idea how often this will be called? Might a sy
pkotwicz 2015/05/22 16:00:39 Unfortunately, this is called more often than I ex
521 base::AutoLock url_lock(url_lock_);
522 for (const BookmarkNode* node : nodes_ordered_by_url_set_) {
523 if (node->icon_url() == icon_url)
524 nodes->push_back(node);
525 }
526 }
527
507 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedUserNodeForURL( 528 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedUserNodeForURL(
508 const GURL& url) { 529 const GURL& url) {
509 std::vector<const BookmarkNode*> nodes; 530 std::vector<const BookmarkNode*> nodes;
510 GetNodesByURL(url, &nodes); 531 GetNodesByURL(url, &nodes);
511 std::sort(nodes.begin(), nodes.end(), &MoreRecentlyAdded); 532 std::sort(nodes.begin(), nodes.end(), &MoreRecentlyAdded);
512 533
513 // Look for the first node that the user can edit. 534 // Look for the first node that the user can edit.
514 for (size_t i = 0; i < nodes.size(); ++i) { 535 for (size_t i = 0; i < nodes.size(); ++i) {
515 if (client_->CanBeEditedByUser(nodes[i])) 536 if (client_->CanBeEditedByUser(nodes[i]))
516 return nodes[i]; 537 return nodes[i];
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( 1070 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails(
1050 bb_node, 1071 bb_node,
1051 other_node, 1072 other_node,
1052 mobile_node, 1073 mobile_node,
1053 client_->GetLoadExtraNodesCallback(), 1074 client_->GetLoadExtraNodesCallback(),
1054 new BookmarkIndex(client_, accept_languages), 1075 new BookmarkIndex(client_, accept_languages),
1055 next_node_id_)); 1076 next_node_id_));
1056 } 1077 }
1057 1078
1058 } // namespace bookmarks 1079 } // namespace bookmarks
OLDNEW
« no previous file with comments | « components/bookmarks/browser/bookmark_model.h ('k') | components/history/core/browser/expire_history_backend_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698