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