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 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_->CanRemovePermanentNodeChildren(permanent_node)) | 216 if (!client_->CanBeEditedByUser(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::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])) |
| 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); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 { | 617 { |
614 // Only hold the lock for the duration of the insert. | 618 // Only hold the lock for the duration of the insert. |
615 base::AutoLock url_lock(url_lock_); | 619 base::AutoLock url_lock(url_lock_); |
616 nodes_ordered_by_url_set_.insert(new_node); | 620 nodes_ordered_by_url_set_.insert(new_node); |
617 } | 621 } |
618 | 622 |
619 return AddNode(AsMutable(parent), index, new_node); | 623 return AddNode(AsMutable(parent), index, new_node); |
620 } | 624 } |
621 | 625 |
622 void BookmarkModel::SortChildren(const BookmarkNode* parent) { | 626 void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
623 DCHECK(client_->CanReorderChildren(parent)); | 627 DCHECK(client_->CanBeEditedByUser(parent)); |
624 | 628 |
625 if (!parent || !parent->is_folder() || is_root_node(parent) || | 629 if (!parent || !parent->is_folder() || is_root_node(parent) || |
626 parent->child_count() <= 1) { | 630 parent->child_count() <= 1) { |
627 return; | 631 return; |
628 } | 632 } |
629 | 633 |
630 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 634 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
631 OnWillReorderBookmarkNode(this, parent)); | 635 OnWillReorderBookmarkNode(this, parent)); |
632 | 636 |
633 UErrorCode error = U_ZERO_ERROR; | 637 UErrorCode error = U_ZERO_ERROR; |
634 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); | 638 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); |
635 if (U_FAILURE(error)) | 639 if (U_FAILURE(error)) |
636 collator.reset(NULL); | 640 collator.reset(NULL); |
637 BookmarkNode* mutable_parent = AsMutable(parent); | 641 BookmarkNode* mutable_parent = AsMutable(parent); |
638 std::sort(mutable_parent->children().begin(), | 642 std::sort(mutable_parent->children().begin(), |
639 mutable_parent->children().end(), | 643 mutable_parent->children().end(), |
640 SortComparator(collator.get())); | 644 SortComparator(collator.get())); |
641 | 645 |
642 if (store_.get()) | 646 if (store_.get()) |
643 store_->ScheduleSave(); | 647 store_->ScheduleSave(); |
644 | 648 |
645 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 649 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
646 BookmarkNodeChildrenReordered(this, parent)); | 650 BookmarkNodeChildrenReordered(this, parent)); |
647 } | 651 } |
648 | 652 |
649 void BookmarkModel::ReorderChildren( | 653 void BookmarkModel::ReorderChildren( |
650 const BookmarkNode* parent, | 654 const BookmarkNode* parent, |
651 const std::vector<const BookmarkNode*>& ordered_nodes) { | 655 const std::vector<const BookmarkNode*>& ordered_nodes) { |
652 DCHECK(client_->CanReorderChildren(parent)); | 656 DCHECK(client_->CanBeEditedByUser(parent)); |
653 | 657 |
654 // Ensure that all children in |parent| are in |ordered_nodes|. | 658 // Ensure that all children in |parent| are in |ordered_nodes|. |
655 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); | 659 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); |
656 for (size_t i = 0; i < ordered_nodes.size(); ++i) | 660 for (size_t i = 0; i < ordered_nodes.size(); ++i) |
657 DCHECK_EQ(parent, ordered_nodes[i]->parent()); | 661 DCHECK_EQ(parent, ordered_nodes[i]->parent()); |
658 | 662 |
659 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 663 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
660 OnWillReorderBookmarkNode(this, parent)); | 664 OnWillReorderBookmarkNode(this, parent)); |
661 | 665 |
662 AsMutable(parent)->SetChildren( | 666 AsMutable(parent)->SetChildren( |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
997 BookmarkPermanentNode* mobile_node = | 1001 BookmarkPermanentNode* mobile_node = |
998 CreatePermanentNode(BookmarkNode::MOBILE); | 1002 CreatePermanentNode(BookmarkNode::MOBILE); |
999 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( | 1003 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( |
1000 bb_node, | 1004 bb_node, |
1001 other_node, | 1005 other_node, |
1002 mobile_node, | 1006 mobile_node, |
1003 client_->GetLoadExtraNodesCallback(), | 1007 client_->GetLoadExtraNodesCallback(), |
1004 new BookmarkIndex(client_, index_urls_, accept_languages), | 1008 new BookmarkIndex(client_, index_urls_, accept_languages), |
1005 next_node_id_)); | 1009 next_node_id_)); |
1006 } | 1010 } |
OLD | NEW |