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 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 |