Chromium Code Reviews| 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 28 matching lines...) Expand all Loading... | |
| 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 |
| 886 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 880 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 887 BookmarkNodeAdded(this, parent, index)); | 881 BookmarkNodeAdded(this, parent, index)); |
| 888 | 882 |
| 889 index_->Add(node); | 883 if (node->type() == BookmarkNode::URL) { |
|
danduong
2014/11/04 01:48:06
Is this right? It seems to match the previous logi
sky
2014/11/04 03:41:45
I don't think there is a good reason why this is a
danduong
2014/11/04 03:52:48
Done.
| |
| 884 base::AutoLock url_lock(url_lock_); | |
| 885 AddNodeToInternalMaps(node); | |
|
danduong
2014/11/04 01:48:05
Moving this here actually makes you hold on to url
sky
2014/11/04 03:41:45
I don't think it'll make much of a difference.
| |
| 886 } else { | |
| 887 index_->Add(node); | |
| 888 } | |
| 890 | 889 |
| 891 return node; | 890 return node; |
| 892 } | 891 } |
| 893 | 892 |
| 893 void BookmarkModel::AddNodeToInternalMaps(BookmarkNode* node) { | |
| 894 index_->Add(node); | |
| 895 nodes_ordered_by_url_set_.insert(node); | |
| 896 } | |
| 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 |
| 902 BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( | 906 BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( |
| 903 BookmarkNode::Type type) { | 907 BookmarkNode::Type type) { |
| (...skipping 100 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 |