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::GetMostRecentlyModifiedUserFolders(this, 1); | 153 bookmark_utils::GetMostRecentlyModifiedFolders(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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 | 206 |
207 BeginExtensiveChanges(); | 207 BeginExtensiveChanges(); |
208 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and | 208 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and |
209 // its immediate children. For removing all non permanent nodes just remove | 209 // its immediate children. For removing all non permanent nodes just remove |
210 // all children of non-root permanent nodes. | 210 // all children of non-root permanent nodes. |
211 { | 211 { |
212 base::AutoLock url_lock(url_lock_); | 212 base::AutoLock url_lock(url_lock_); |
213 for (int i = 0; i < root_.child_count(); ++i) { | 213 for (int i = 0; i < root_.child_count(); ++i) { |
214 BookmarkNode* permanent_node = root_.GetChild(i); | 214 BookmarkNode* permanent_node = root_.GetChild(i); |
215 | 215 |
216 if (!client_->CanBeEditedByUser(permanent_node)) | 216 if (!client_->CanRemovePermanentNodeChildren(permanent_node)) |
217 continue; | 217 continue; |
218 | 218 |
219 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { | 219 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { |
220 BookmarkNode* child_node = permanent_node->GetChild(j); | 220 BookmarkNode* child_node = permanent_node->GetChild(j); |
221 removed_nodes.push_back(child_node); | 221 removed_nodes.push_back(child_node); |
222 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); | 222 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); |
223 } | 223 } |
224 } | 224 } |
225 } | 225 } |
226 EndExtensiveChanges(); | 226 EndExtensiveChanges(); |
(...skipping 269 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::GetMostRecentlyAddedUserNodeForURL( | 506 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedNodeForURL( |
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()) |
| 511 return NULL; |
| 512 |
510 std::sort(nodes.begin(), nodes.end(), &bookmark_utils::MoreRecentlyAdded); | 513 std::sort(nodes.begin(), nodes.end(), &bookmark_utils::MoreRecentlyAdded); |
511 | 514 return nodes.front(); |
512 // Look for the first node that the user can edit. | |
513 for (size_t i = 0; i < nodes.size(); ++i) { | |
514 if (client_->CanBeEditedByUser(nodes[i])) | |
515 return nodes[i]; | |
516 } | |
517 | |
518 return NULL; | |
519 } | 515 } |
520 | 516 |
521 bool BookmarkModel::HasBookmarks() { | 517 bool BookmarkModel::HasBookmarks() { |
522 base::AutoLock url_lock(url_lock_); | 518 base::AutoLock url_lock(url_lock_); |
523 return !nodes_ordered_by_url_set_.empty(); | 519 return !nodes_ordered_by_url_set_.empty(); |
524 } | 520 } |
525 | 521 |
526 bool BookmarkModel::IsBookmarked(const GURL& url) { | 522 bool BookmarkModel::IsBookmarked(const GURL& url) { |
527 base::AutoLock url_lock(url_lock_); | 523 base::AutoLock url_lock(url_lock_); |
528 return IsBookmarkedNoLock(url); | 524 return IsBookmarkedNoLock(url); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 { | 613 { |
618 // Only hold the lock for the duration of the insert. | 614 // Only hold the lock for the duration of the insert. |
619 base::AutoLock url_lock(url_lock_); | 615 base::AutoLock url_lock(url_lock_); |
620 nodes_ordered_by_url_set_.insert(new_node); | 616 nodes_ordered_by_url_set_.insert(new_node); |
621 } | 617 } |
622 | 618 |
623 return AddNode(AsMutable(parent), index, new_node); | 619 return AddNode(AsMutable(parent), index, new_node); |
624 } | 620 } |
625 | 621 |
626 void BookmarkModel::SortChildren(const BookmarkNode* parent) { | 622 void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
627 DCHECK(client_->CanBeEditedByUser(parent)); | 623 DCHECK(client_->CanReorderChildren(parent)); |
628 | 624 |
629 if (!parent || !parent->is_folder() || is_root_node(parent) || | 625 if (!parent || !parent->is_folder() || is_root_node(parent) || |
630 parent->child_count() <= 1) { | 626 parent->child_count() <= 1) { |
631 return; | 627 return; |
632 } | 628 } |
633 | 629 |
634 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 630 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
635 OnWillReorderBookmarkNode(this, parent)); | 631 OnWillReorderBookmarkNode(this, parent)); |
636 | 632 |
637 UErrorCode error = U_ZERO_ERROR; | 633 UErrorCode error = U_ZERO_ERROR; |
638 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); | 634 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); |
639 if (U_FAILURE(error)) | 635 if (U_FAILURE(error)) |
640 collator.reset(NULL); | 636 collator.reset(NULL); |
641 BookmarkNode* mutable_parent = AsMutable(parent); | 637 BookmarkNode* mutable_parent = AsMutable(parent); |
642 std::sort(mutable_parent->children().begin(), | 638 std::sort(mutable_parent->children().begin(), |
643 mutable_parent->children().end(), | 639 mutable_parent->children().end(), |
644 SortComparator(collator.get())); | 640 SortComparator(collator.get())); |
645 | 641 |
646 if (store_.get()) | 642 if (store_.get()) |
647 store_->ScheduleSave(); | 643 store_->ScheduleSave(); |
648 | 644 |
649 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 645 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
650 BookmarkNodeChildrenReordered(this, parent)); | 646 BookmarkNodeChildrenReordered(this, parent)); |
651 } | 647 } |
652 | 648 |
653 void BookmarkModel::ReorderChildren( | 649 void BookmarkModel::ReorderChildren( |
654 const BookmarkNode* parent, | 650 const BookmarkNode* parent, |
655 const std::vector<const BookmarkNode*>& ordered_nodes) { | 651 const std::vector<const BookmarkNode*>& ordered_nodes) { |
656 DCHECK(client_->CanBeEditedByUser(parent)); | 652 DCHECK(client_->CanReorderChildren(parent)); |
657 | 653 |
658 // Ensure that all children in |parent| are in |ordered_nodes|. | 654 // Ensure that all children in |parent| are in |ordered_nodes|. |
659 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); | 655 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); |
660 for (size_t i = 0; i < ordered_nodes.size(); ++i) | 656 for (size_t i = 0; i < ordered_nodes.size(); ++i) |
661 DCHECK_EQ(parent, ordered_nodes[i]->parent()); | 657 DCHECK_EQ(parent, ordered_nodes[i]->parent()); |
662 | 658 |
663 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 659 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
664 OnWillReorderBookmarkNode(this, parent)); | 660 OnWillReorderBookmarkNode(this, parent)); |
665 | 661 |
666 AsMutable(parent)->SetChildren( | 662 AsMutable(parent)->SetChildren( |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 BookmarkPermanentNode* mobile_node = | 997 BookmarkPermanentNode* mobile_node = |
1002 CreatePermanentNode(BookmarkNode::MOBILE); | 998 CreatePermanentNode(BookmarkNode::MOBILE); |
1003 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( | 999 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( |
1004 bb_node, | 1000 bb_node, |
1005 other_node, | 1001 other_node, |
1006 mobile_node, | 1002 mobile_node, |
1007 client_->GetLoadExtraNodesCallback(), | 1003 client_->GetLoadExtraNodesCallback(), |
1008 new BookmarkIndex(client_, index_urls_, accept_languages), | 1004 new BookmarkIndex(client_, index_urls_, accept_languages), |
1009 next_node_id_)); | 1005 next_node_id_)); |
1010 } | 1006 } |
OLD | NEW |