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 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
143 expanded_state_tracker_.reset( | 143 expanded_state_tracker_.reset( |
144 new BookmarkExpandedStateTracker(this, pref_service)); | 144 new BookmarkExpandedStateTracker(this, pref_service)); |
145 | 145 |
146 // Load the bookmarks. BookmarkStorage notifies us when done. | 146 // Load the bookmarks. BookmarkStorage notifies us when done. |
147 store_ = new BookmarkStorage(this, profile_path, io_task_runner.get()); | 147 store_ = new BookmarkStorage(this, profile_path, io_task_runner.get()); |
148 store_->LoadBookmarks(CreateLoadDetails(accept_languages), ui_task_runner); | 148 store_->LoadBookmarks(CreateLoadDetails(accept_languages), ui_task_runner); |
149 } | 149 } |
150 | 150 |
151 const BookmarkNode* BookmarkModel::GetParentForNewNodes() { | 151 const BookmarkNode* BookmarkModel::GetParentForNewNodes() { |
152 std::vector<const BookmarkNode*> nodes = | 152 std::vector<const BookmarkNode*> nodes = |
153 bookmark_utils::GetMostRecentlyModifiedFolders(this, 1); | 153 bookmark_utils::GetMostRecentlyModifiedUserFolders(this, 1); |
154 DCHECK(!nodes.empty()); // This list is always padded with default folders. | 154 DCHECK(!nodes.empty()); // This list is always padded with default folders. |
155 return nodes[0]; | 155 return nodes[0]; |
156 } | 156 } |
157 | 157 |
158 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { | 158 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { |
159 observers_.AddObserver(observer); | 159 observers_.AddObserver(observer); |
160 } | 160 } |
161 | 161 |
162 void BookmarkModel::RemoveObserver(BookmarkModelObserver* observer) { | 162 void BookmarkModel::RemoveObserver(BookmarkModelObserver* observer) { |
163 observers_.RemoveObserver(observer); | 163 observers_.RemoveObserver(observer); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
496 std::vector<const BookmarkNode*>* nodes) { | 496 std::vector<const BookmarkNode*>* nodes) { |
497 base::AutoLock url_lock(url_lock_); | 497 base::AutoLock url_lock(url_lock_); |
498 BookmarkNode tmp_node(url); | 498 BookmarkNode tmp_node(url); |
499 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(&tmp_node); | 499 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(&tmp_node); |
500 while (i != nodes_ordered_by_url_set_.end() && (*i)->url() == url) { | 500 while (i != nodes_ordered_by_url_set_.end() && (*i)->url() == url) { |
501 nodes->push_back(*i); | 501 nodes->push_back(*i); |
502 ++i; | 502 ++i; |
503 } | 503 } |
504 } | 504 } |
505 | 505 |
506 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedNodeForURL( | 506 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedUserNodeForURL( |
507 const GURL& url) { | 507 const GURL& url) { |
508 std::vector<const BookmarkNode*> nodes; | 508 std::vector<const BookmarkNode*> nodes; |
509 GetNodesByURL(url, &nodes); | 509 GetNodesByURL(url, &nodes); |
510 if (nodes.empty()) | 510 std::sort(nodes.begin(), nodes.end(), &bookmark_utils::MoreRecentlyAdded); |
511 return NULL; | |
512 | 511 |
513 std::sort(nodes.begin(), nodes.end(), &bookmark_utils::MoreRecentlyAdded); | 512 // Look for the first node that the user can edit. |
514 return nodes.front(); | 513 for (size_t i = 0; i < nodes.size(); ++i) { |
514 if (client_->CanBeEditedByUser(nodes[i])) | |
sky
2014/06/05 23:46:47
Add test coverage for this.
Joao da Silva
2014/06/06 15:41:03
Done.
| |
515 return nodes[i]; | |
516 } | |
517 | |
518 return NULL; | |
515 } | 519 } |
516 | 520 |
517 bool BookmarkModel::HasBookmarks() { | 521 bool BookmarkModel::HasBookmarks() { |
518 base::AutoLock url_lock(url_lock_); | 522 base::AutoLock url_lock(url_lock_); |
519 return !nodes_ordered_by_url_set_.empty(); | 523 return !nodes_ordered_by_url_set_.empty(); |
520 } | 524 } |
521 | 525 |
522 bool BookmarkModel::IsBookmarked(const GURL& url) { | 526 bool BookmarkModel::IsBookmarked(const GURL& url) { |
523 base::AutoLock url_lock(url_lock_); | 527 base::AutoLock url_lock(url_lock_); |
524 return IsBookmarkedNoLock(url); | 528 return IsBookmarkedNoLock(url, false); |
529 } | |
530 | |
531 bool BookmarkModel::IsBookmarkedByUser(const GURL& url) { | |
532 base::AutoLock url_lock(url_lock_); | |
533 return IsBookmarkedNoLock(url, true); | |
525 } | 534 } |
526 | 535 |
527 void BookmarkModel::GetBookmarks( | 536 void BookmarkModel::GetBookmarks( |
528 std::vector<BookmarkService::URLAndTitle>* bookmarks) { | 537 std::vector<BookmarkService::URLAndTitle>* bookmarks) { |
529 base::AutoLock url_lock(url_lock_); | 538 base::AutoLock url_lock(url_lock_); |
530 const GURL* last_url = NULL; | 539 const GURL* last_url = NULL; |
531 for (NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.begin(); | 540 for (NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.begin(); |
532 i != nodes_ordered_by_url_set_.end(); ++i) { | 541 i != nodes_ordered_by_url_set_.end(); ++i) { |
533 const GURL* url = &((*i)->url()); | 542 const GURL* url = &((*i)->url()); |
534 // Only add unique URLs. | 543 // Only add unique URLs. |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
711 case BookmarkNode::OTHER_NODE: | 720 case BookmarkNode::OTHER_NODE: |
712 return other_node_; | 721 return other_node_; |
713 case BookmarkNode::MOBILE: | 722 case BookmarkNode::MOBILE: |
714 return mobile_node_; | 723 return mobile_node_; |
715 default: | 724 default: |
716 NOTREACHED(); | 725 NOTREACHED(); |
717 return NULL; | 726 return NULL; |
718 } | 727 } |
719 } | 728 } |
720 | 729 |
721 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) { | 730 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url, |
731 bool only_by_editable_nodes) { | |
722 BookmarkNode tmp_node(url); | 732 BookmarkNode tmp_node(url); |
723 return (nodes_ordered_by_url_set_.find(&tmp_node) != | 733 typedef NodesOrderedByURLSet::const_iterator Iterator; |
724 nodes_ordered_by_url_set_.end()); | 734 std::pair<Iterator, Iterator> range = |
735 nodes_ordered_by_url_set_.equal_range(&tmp_node); | |
736 for (Iterator it = range.first; it != range.second; ++it) { | |
737 if (!only_by_editable_nodes || client_->CanBeEditedByUser(*it)) | |
738 return true; | |
739 } | |
740 return false; | |
725 } | 741 } |
726 | 742 |
727 void BookmarkModel::RemoveNode(BookmarkNode* node, | 743 void BookmarkModel::RemoveNode(BookmarkNode* node, |
728 std::set<GURL>* removed_urls) { | 744 std::set<GURL>* removed_urls) { |
729 if (!loaded_ || !node || is_permanent_node(node)) { | 745 if (!loaded_ || !node || is_permanent_node(node)) { |
730 NOTREACHED(); | 746 NOTREACHED(); |
731 return; | 747 return; |
732 } | 748 } |
733 | 749 |
734 url_lock_.AssertAcquired(); | 750 url_lock_.AssertAcquired(); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
849 url_lock_.AssertAcquired(); | 865 url_lock_.AssertAcquired(); |
850 DCHECK(removed_urls); | 866 DCHECK(removed_urls); |
851 BookmarkNode* parent = AsMutable(node->parent()); | 867 BookmarkNode* parent = AsMutable(node->parent()); |
852 DCHECK(parent); | 868 DCHECK(parent); |
853 parent->Remove(node); | 869 parent->Remove(node); |
854 RemoveNode(node, removed_urls); | 870 RemoveNode(node, removed_urls); |
855 // RemoveNode adds an entry to removed_urls for each node of type URL. As we | 871 // RemoveNode adds an entry to removed_urls for each node of type URL. As we |
856 // allow duplicates we need to remove any entries that are still bookmarked. | 872 // allow duplicates we need to remove any entries that are still bookmarked. |
857 for (std::set<GURL>::iterator i = removed_urls->begin(); | 873 for (std::set<GURL>::iterator i = removed_urls->begin(); |
858 i != removed_urls->end();) { | 874 i != removed_urls->end();) { |
859 if (IsBookmarkedNoLock(*i)) { | 875 if (IsBookmarkedNoLock(*i, false)) { |
860 // When we erase the iterator pointing at the erasee is | 876 // When we erase the iterator pointing at the erasee is |
861 // invalidated, so using i++ here within the "erase" call is | 877 // invalidated, so using i++ here within the "erase" call is |
862 // important as it advances the iterator before passing the | 878 // important as it advances the iterator before passing the |
863 // old value through to erase. | 879 // old value through to erase. |
864 removed_urls->erase(i++); | 880 removed_urls->erase(i++); |
865 } else { | 881 } else { |
866 ++i; | 882 ++i; |
867 } | 883 } |
868 } | 884 } |
869 } | 885 } |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
997 BookmarkPermanentNode* mobile_node = | 1013 BookmarkPermanentNode* mobile_node = |
998 CreatePermanentNode(BookmarkNode::MOBILE); | 1014 CreatePermanentNode(BookmarkNode::MOBILE); |
999 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( | 1015 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( |
1000 bb_node, | 1016 bb_node, |
1001 other_node, | 1017 other_node, |
1002 mobile_node, | 1018 mobile_node, |
1003 client_->GetLoadExtraNodesCallback(), | 1019 client_->GetLoadExtraNodesCallback(), |
1004 new BookmarkIndex(client_, index_urls_, accept_languages), | 1020 new BookmarkIndex(client_, index_urls_, accept_languages), |
1005 next_node_id_)); | 1021 next_node_id_)); |
1006 } | 1022 } |
OLD | NEW |