Chromium Code Reviews| Index: components/bookmarks/browser/bookmark_model.cc |
| diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc |
| index cbf7a6a07fb24d2686cf6c471882a021a975d63d..7fd9ea507e032ff81a3cf3c463af96877cc2f6a7 100644 |
| --- a/components/bookmarks/browser/bookmark_model.cc |
| +++ b/components/bookmarks/browser/bookmark_model.cc |
| @@ -13,6 +13,7 @@ |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/strings/string_util.h" |
| +#include "base/values.h" |
| #include "components/bookmarks/browser/bookmark_expanded_state_tracker.h" |
| #include "components/bookmarks/browser/bookmark_index.h" |
| #include "components/bookmarks/browser/bookmark_match.h" |
| @@ -20,6 +21,7 @@ |
| #include "components/bookmarks/browser/bookmark_node_data.h" |
| #include "components/bookmarks/browser/bookmark_storage.h" |
| #include "components/bookmarks/browser/bookmark_utils.h" |
| +#include "components/bookmarks/browser/managed_bookmarks_tracker.h" |
| #include "components/favicon_base/favicon_types.h" |
| #include "grit/components_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -98,6 +100,7 @@ BookmarkModel::BookmarkModel(BookmarkClient* client, bool index_urls) |
| bookmark_bar_node_(NULL), |
| other_node_(NULL), |
| mobile_node_(NULL), |
| + managed_node_(NULL), |
| next_node_id_(1), |
| observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), |
| index_urls_(index_urls), |
| @@ -141,10 +144,22 @@ void BookmarkModel::Load( |
| expanded_state_tracker_.reset( |
| new BookmarkExpandedStateTracker(this, pref_service)); |
| + managed_bookmarks_tracker_.reset( |
| + new ManagedBookmarksTracker(this, pref_service)); |
| // Load the bookmarks. BookmarkStorage notifies us when done. |
| store_ = new BookmarkStorage(this, profile_path, io_task_runner.get()); |
| - store_->LoadBookmarks(CreateLoadDetails(accept_languages), ui_task_runner); |
| + store_->LoadBookmarks( |
| + CreateLoadDetails(accept_languages), |
| + managed_bookmarks_tracker_->GetInitialManagedBookmarks(), |
| + ui_task_runner); |
| +} |
| + |
| +bool BookmarkModel::IsManaged(const BookmarkNode* node) const { |
| + DCHECK(loaded_); |
| + while (node && node != managed_node()) |
| + node = node->parent(); |
| + return node == managed_node(); |
| } |
| const BookmarkNode* BookmarkModel::GetParentForNewNodes() { |
| @@ -211,6 +226,11 @@ void BookmarkModel::RemoveAll() { |
| base::AutoLock url_lock(url_lock_); |
| for (int i = 0; i < root_.child_count(); ++i) { |
| BookmarkNode* permanent_node = root_.GetChild(i); |
| + |
| + // The managed bookmarks can't be removed. |
|
sky
2014/05/30 22:31:37
Not removing managed bookmarks makes this function
Joao da Silva
2014/06/01 13:32:07
Agreed, I'll rename in a subsequent CL.
|
| + if (permanent_node == managed_node()) |
| + continue; |
| + |
| for (int j = permanent_node->child_count() - 1; j >= 0; --j) { |
| BookmarkNode* child_node = permanent_node->GetChild(j); |
| removed_nodes.push_back(child_node); |
| @@ -318,7 +338,8 @@ void BookmarkModel::SetTitle(const BookmarkNode* node, |
| if (node->GetTitle() == title) |
| return; |
| - if (is_permanent_node(node)) { |
| + // The managed node can change its title. |
|
sky
2014/05/30 22:31:37
Why do we want to allow the managed nodes title to
Joao da Silva
2014/06/01 13:32:07
This was the UX decision when we first introduced
|
| + if (is_permanent_node(node) && node != managed_node()) { |
| NOTREACHED(); |
| return; |
| } |
| @@ -430,6 +451,10 @@ void BookmarkModel::DeleteNodeMetaInfo(const BookmarkNode* node, |
| void BookmarkModel::SetNodeSyncTransactionVersion( |
| const BookmarkNode* node, |
| int64 sync_transaction_version) { |
| + if (IsManaged(node)) { |
| + NOTREACHED(); |
| + return; |
| + } |
| if (sync_transaction_version == node->sync_transaction_version()) |
| return; |
| @@ -618,6 +643,11 @@ void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
| return; |
| } |
| + if (IsManaged(parent)) { |
|
sky
2014/05/30 22:31:37
Should this be a DCHECK? Same with 673 and 454.
Joao da Silva
2014/06/01 13:32:07
Done.
|
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| OnWillReorderBookmarkNode(this, parent)); |
| @@ -640,6 +670,11 @@ void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
| void BookmarkModel::ReorderChildren( |
| const BookmarkNode* parent, |
| const std::vector<const BookmarkNode*>& ordered_nodes) { |
| + if (IsManaged(parent)) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| // Ensure that all children in |parent| are in |ordered_nodes|. |
| DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); |
| for (size_t i = 0; i < ordered_nodes.size(); ++i) |
| @@ -701,6 +736,8 @@ const BookmarkPermanentNode* BookmarkModel::PermanentNode( |
| return other_node_; |
| case BookmarkNode::MOBILE: |
| return mobile_node_; |
| + case BookmarkNode::MANAGED: |
| + return managed_node_; |
| default: |
| NOTREACHED(); |
| return NULL; |
| @@ -755,13 +792,14 @@ void BookmarkModel::DoneLoading(scoped_ptr<BookmarkLoadDetails> details) { |
| bookmark_bar_node_ = details->release_bb_node(); |
| other_node_ = details->release_other_folder_node(); |
| mobile_node_ = details->release_mobile_folder_node(); |
| + managed_node_ = details->release_managed_node(); |
| index_.reset(details->release_index()); |
| // WARNING: order is important here, various places assume the order is |
| // constant (but can vary between embedders with the initial visibility |
| // of permanent nodes). |
| BookmarkPermanentNode* root_children[] = { |
| - bookmark_bar_node_, other_node_, mobile_node_, |
| + bookmark_bar_node_, other_node_, mobile_node_, managed_node_, |
| }; |
| std::stable_sort(root_children, |
| root_children + arraysize(root_children), |
| @@ -786,6 +824,12 @@ void BookmarkModel::DoneLoading(scoped_ptr<BookmarkLoadDetails> details) { |
| // Notify our direct observers. |
| FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| BookmarkModelLoaded(this, details->ids_reassigned())); |
| + |
| + // Start tracking the managed bookmarks. This will detect any changes that |
| + // may have occurred while the |store_| loaded the initial managed bookmarks. |
| + // May be NULL in unit tests. |
| + if (managed_bookmarks_tracker_) |
| + managed_bookmarks_tracker_->Init(); |
| } |
| void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) { |
| @@ -879,7 +923,8 @@ BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( |
| BookmarkNode::Type type) { |
| DCHECK(type == BookmarkNode::BOOKMARK_BAR || |
| type == BookmarkNode::OTHER_NODE || |
| - type == BookmarkNode::MOBILE); |
| + type == BookmarkNode::MOBILE || |
| + type == BookmarkNode::MANAGED); |
| BookmarkPermanentNode* node = |
| new BookmarkPermanentNode(generate_next_node_id()); |
| node->set_visible(client_->IsPermanentNodeVisible(type)); |
| @@ -895,6 +940,9 @@ BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( |
| case BookmarkNode::MOBILE: |
| title_id = IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME; |
| break; |
| + case BookmarkNode::MANAGED: |
| + title_id = IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME; |
| + break; |
| default: |
| NOTREACHED(); |
| title_id = IDS_BOOKMARK_BAR_FOLDER_NAME; |
| @@ -979,10 +1027,13 @@ scoped_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails( |
| CreatePermanentNode(BookmarkNode::OTHER_NODE); |
| BookmarkPermanentNode* mobile_node = |
| CreatePermanentNode(BookmarkNode::MOBILE); |
| + BookmarkPermanentNode* managed_node = |
| + CreatePermanentNode(BookmarkNode::MANAGED); |
| return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( |
| bb_node, |
| other_node, |
| mobile_node, |
| + managed_node, |
| new BookmarkIndex(client_, index_urls_, accept_languages), |
| next_node_id_)); |
| } |