OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |