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

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

Issue 688473005: Make sure to update the BookmarkIndex on a URL Change (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « components/bookmarks/browser/bookmark_model.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 364
365 BookmarkNode* mutable_node = AsMutable(node); 365 BookmarkNode* mutable_node = AsMutable(node);
366 mutable_node->InvalidateFavicon(); 366 mutable_node->InvalidateFavicon();
367 CancelPendingFaviconLoadRequests(mutable_node); 367 CancelPendingFaviconLoadRequests(mutable_node);
368 368
369 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 369 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
370 OnWillChangeBookmarkNode(this, node)); 370 OnWillChangeBookmarkNode(this, node));
371 371
372 { 372 {
373 base::AutoLock url_lock(url_lock_); 373 base::AutoLock url_lock(url_lock_);
374 RemoveNodeFromURLSet(mutable_node); 374 RemoveNodeFromInternalMaps(mutable_node);
375 mutable_node->set_url(url); 375 mutable_node->set_url(url);
376 nodes_ordered_by_url_set_.insert(mutable_node); 376 AddNodeToInternalMaps(mutable_node);
377 } 377 }
378 378
379 if (store_.get()) 379 if (store_.get())
380 store_->ScheduleSave(); 380 store_->ScheduleSave();
381 381
382 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 382 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
383 BookmarkNodeChanged(this, node)); 383 BookmarkNodeChanged(this, node));
384 } 384 }
385 385
386 void BookmarkModel::SetNodeMetaInfo(const BookmarkNode* node, 386 void BookmarkModel::SetNodeMetaInfo(const BookmarkNode* node,
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 if (creation_time > parent->date_folder_modified()) 610 if (creation_time > parent->date_folder_modified())
611 SetDateFolderModified(parent, creation_time); 611 SetDateFolderModified(parent, creation_time);
612 612
613 BookmarkNode* new_node = new BookmarkNode(generate_next_node_id(), url); 613 BookmarkNode* new_node = new BookmarkNode(generate_next_node_id(), url);
614 new_node->SetTitle(title); 614 new_node->SetTitle(title);
615 new_node->set_date_added(creation_time); 615 new_node->set_date_added(creation_time);
616 new_node->set_type(BookmarkNode::URL); 616 new_node->set_type(BookmarkNode::URL);
617 if (meta_info) 617 if (meta_info)
618 new_node->SetMetaInfoMap(*meta_info); 618 new_node->SetMetaInfoMap(*meta_info);
619 619
620 {
621 // Only hold the lock for the duration of the insert.
622 base::AutoLock url_lock(url_lock_);
623 nodes_ordered_by_url_set_.insert(new_node);
624 }
625
626 return AddNode(AsMutable(parent), index, new_node); 620 return AddNode(AsMutable(parent), index, new_node);
627 } 621 }
628 622
629 void BookmarkModel::SortChildren(const BookmarkNode* parent) { 623 void BookmarkModel::SortChildren(const BookmarkNode* parent) {
630 DCHECK(client_->CanBeEditedByUser(parent)); 624 DCHECK(client_->CanBeEditedByUser(parent));
631 625
632 if (!parent || !parent->is_folder() || is_root_node(parent) || 626 if (!parent || !parent->is_folder() || is_root_node(parent) ||
633 parent->child_count() <= 1) { 627 parent->child_count() <= 1) {
634 return; 628 return;
635 } 629 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 727
734 void BookmarkModel::RemoveNode(BookmarkNode* node, 728 void BookmarkModel::RemoveNode(BookmarkNode* node,
735 std::set<GURL>* removed_urls) { 729 std::set<GURL>* removed_urls) {
736 if (!loaded_ || !node || is_permanent_node(node)) { 730 if (!loaded_ || !node || is_permanent_node(node)) {
737 NOTREACHED(); 731 NOTREACHED();
738 return; 732 return;
739 } 733 }
740 734
741 url_lock_.AssertAcquired(); 735 url_lock_.AssertAcquired();
742 if (node->is_url()) { 736 if (node->is_url()) {
743 RemoveNodeFromURLSet(node); 737 RemoveNodeFromInternalMaps(node);
744 removed_urls->insert(node->url()); 738 removed_urls->insert(node->url());
745 index_->Remove(node);
746 } 739 }
747 740
748 CancelPendingFaviconLoadRequests(node); 741 CancelPendingFaviconLoadRequests(node);
749 742
750 // Recurse through children. 743 // Recurse through children.
751 for (int i = node->child_count() - 1; i >= 0; --i) 744 for (int i = node->child_count() - 1; i >= 0; --i)
752 RemoveNode(node->GetChild(i), removed_urls); 745 RemoveNode(node->GetChild(i), removed_urls);
753 } 746 }
754 747
755 void BookmarkModel::DoneLoading(scoped_ptr<BookmarkLoadDetails> details) { 748 void BookmarkModel::DoneLoading(scoped_ptr<BookmarkLoadDetails> details) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 823
831 if (store_.get()) 824 if (store_.get())
832 store_->ScheduleSave(); 825 store_->ScheduleSave();
833 826
834 FOR_EACH_OBSERVER( 827 FOR_EACH_OBSERVER(
835 BookmarkModelObserver, 828 BookmarkModelObserver,
836 observers_, 829 observers_,
837 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls)); 830 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls));
838 } 831 }
839 832
840 void BookmarkModel::RemoveNodeFromURLSet(BookmarkNode* node) { 833 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) {
834 index_->Remove(node);
841 // NOTE: this is called in such a way that url_lock_ is already held. As 835 // NOTE: this is called in such a way that url_lock_ is already held. As
842 // such, this doesn't explicitly grab the lock. 836 // such, this doesn't explicitly grab the lock.
843 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); 837 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node);
844 DCHECK(i != nodes_ordered_by_url_set_.end()); 838 DCHECK(i != nodes_ordered_by_url_set_.end());
845 // i points to the first node with the URL, advance until we find the 839 // i points to the first node with the URL, advance until we find the
846 // node we're removing. 840 // node we're removing.
847 while (*i != node) 841 while (*i != node)
848 ++i; 842 ++i;
849 nodes_ordered_by_url_set_.erase(i); 843 nodes_ordered_by_url_set_.erase(i);
850 } 844 }
(...skipping 25 matching lines...) Expand all
876 } 870 }
877 871
878 BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent, 872 BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent,
879 int index, 873 int index,
880 BookmarkNode* node) { 874 BookmarkNode* node) {
881 parent->Add(node, index); 875 parent->Add(node, index);
882 876
883 if (store_.get()) 877 if (store_.get())
884 store_->ScheduleSave(); 878 store_->ScheduleSave();
885 879
880 if (node->type() == BookmarkNode::URL) {
881 base::AutoLock url_lock(url_lock_);
882 AddNodeToInternalMaps(node);
883 } else {
884 index_->Add(node);
885 }
886
886 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 887 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
887 BookmarkNodeAdded(this, parent, index)); 888 BookmarkNodeAdded(this, parent, index));
888 889
890 return node;
891 }
892
893 void BookmarkModel::AddNodeToInternalMaps(BookmarkNode* node) {
889 index_->Add(node); 894 index_->Add(node);
sky 2014/11/04 14:21:00 Can you DCHECK here that the lock is held? I'm pre
danduong 2014/11/04 14:41:42 Done.
890 895 nodes_ordered_by_url_set_.insert(node);
891 return node;
892 } 896 }
893 897
894 bool BookmarkModel::IsValidIndex(const BookmarkNode* parent, 898 bool BookmarkModel::IsValidIndex(const BookmarkNode* parent,
895 int index, 899 int index,
896 bool allow_end) { 900 bool allow_end) {
897 return (parent && parent->is_folder() && 901 return (parent && parent->is_folder() &&
898 (index >= 0 && (index < parent->child_count() || 902 (index >= 0 && (index < parent->child_count() ||
899 (allow_end && index == parent->child_count())))); 903 (allow_end && index == parent->child_count()))));
900 } 904 }
901 905
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 BookmarkPermanentNode* mobile_node = 1008 BookmarkPermanentNode* mobile_node =
1005 CreatePermanentNode(BookmarkNode::MOBILE); 1009 CreatePermanentNode(BookmarkNode::MOBILE);
1006 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( 1010 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails(
1007 bb_node, 1011 bb_node,
1008 other_node, 1012 other_node,
1009 mobile_node, 1013 mobile_node,
1010 client_->GetLoadExtraNodesCallback(), 1014 client_->GetLoadExtraNodesCallback(),
1011 new BookmarkIndex(client_, accept_languages), 1015 new BookmarkIndex(client_, accept_languages),
1012 next_node_id_)); 1016 next_node_id_));
1013 } 1017 }
OLDNEW
« no previous file with comments | « components/bookmarks/browser/bookmark_model.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698