Index: components/bookmarks/browser/bookmark_model.cc |
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc |
index 31bd316153276fd3cfda791afae4f1aa5a006219..c835f9b787aa577b3346cbe7e2ecf1465acd06d5 100644 |
--- a/components/bookmarks/browser/bookmark_model.cc |
+++ b/components/bookmarks/browser/bookmark_model.cc |
@@ -54,8 +54,8 @@ class VisibilityComparator |
// Returns true if |n1| preceeds |n2|. |
bool operator()(const BookmarkPermanentNode* n1, |
const BookmarkPermanentNode* n2) { |
- bool n1_visible = client_->IsPermanentNodeVisible(n1->type()); |
- bool n2_visible = client_->IsPermanentNodeVisible(n2->type()); |
+ bool n1_visible = client_->IsPermanentNodeVisible(n1); |
+ bool n2_visible = client_->IsPermanentNodeVisible(n2); |
return n1_visible != n2_visible && n1_visible; |
} |
@@ -212,6 +212,10 @@ void BookmarkModel::RemoveAll() { |
base::AutoLock url_lock(url_lock_); |
for (int i = 0; i < root_.child_count(); ++i) { |
BookmarkNode* permanent_node = root_.GetChild(i); |
+ |
+ if (!client_->CanRemoveNode(permanent_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); |
@@ -319,7 +323,7 @@ void BookmarkModel::SetTitle(const BookmarkNode* node, |
if (node->GetTitle() == title) |
return; |
- if (is_permanent_node(node)) { |
+ if (is_permanent_node(node) && !client_->CanSetTitle(node)) { |
NOTREACHED(); |
return; |
} |
@@ -431,6 +435,8 @@ void BookmarkModel::DeleteNodeMetaInfo(const BookmarkNode* node, |
void BookmarkModel::SetNodeSyncTransactionVersion( |
const BookmarkNode* node, |
int64 sync_transaction_version) { |
+ DCHECK(client_->CanSyncNode(node)); |
+ |
if (sync_transaction_version == node->sync_transaction_version()) |
return; |
@@ -614,6 +620,8 @@ const BookmarkNode* BookmarkModel::AddURLWithCreationTimeAndMetaInfo( |
} |
void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
+ DCHECK(client_->CanReorderChildren(parent)); |
+ |
if (!parent || !parent->is_folder() || is_root_node(parent) || |
parent->child_count() <= 1) { |
return; |
@@ -641,6 +649,8 @@ void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
void BookmarkModel::ReorderChildren( |
const BookmarkNode* parent, |
const std::vector<const BookmarkNode*>& ordered_nodes) { |
+ DCHECK(client_->CanReorderChildren(parent)); |
+ |
// 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) |
@@ -688,8 +698,8 @@ void BookmarkModel::ClearStore() { |
void BookmarkModel::SetPermanentNodeVisible(BookmarkNode::Type type, |
bool value) { |
- AsMutable(PermanentNode(type))->set_visible( |
- value || client_->IsPermanentNodeVisible(type)); |
+ BookmarkPermanentNode* node = AsMutable(PermanentNode(type)); |
+ node->set_visible(value || client_->IsPermanentNodeVisible(node)); |
} |
const BookmarkPermanentNode* BookmarkModel::PermanentNode( |
@@ -758,18 +768,27 @@ void BookmarkModel::DoneLoading(scoped_ptr<BookmarkLoadDetails> details) { |
mobile_node_ = details->release_mobile_folder_node(); |
index_.reset(details->release_index()); |
+ // Get any extra nodes and take ownership of them at the |root_|. |
+ std::vector<BookmarkPermanentNode*> extra_nodes; |
+ details->release_extra_nodes(&extra_nodes); |
+ |
+ // Let the client get handles to the extra permanent nodes on the main thread. |
+ client_->ExtraNodesLoaded(extra_nodes); |
sky
2014/06/04 20:39:52
Can this be nuked and instead use BookmarkModelLoa
Joao da Silva
2014/06/04 22:35:58
BookmarkModelLoaded() comes a tad too late, becaus
|
+ |
// 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_, |
- }; |
- std::stable_sort(root_children, |
- root_children + arraysize(root_children), |
+ std::vector<BookmarkPermanentNode*> root_children; |
+ root_children.push_back(bookmark_bar_node_); |
+ root_children.push_back(other_node_); |
+ root_children.push_back(mobile_node_); |
+ for (size_t i = 0; i < extra_nodes.size(); ++i) |
+ root_children.push_back(extra_nodes[i]); |
+ std::stable_sort(root_children.begin(), |
+ root_children.end(), |
VisibilityComparator(client_)); |
- for (size_t i = 0; i < arraysize(root_children); ++i) { |
+ for (size_t i = 0; i < root_children.size(); ++i) |
root_.Add(root_children[i], static_cast<int>(i)); |
- } |
root_.SetMetaInfoMap(details->model_meta_info_map()); |
root_.set_sync_transaction_version(details->model_sync_transaction_version()); |
@@ -883,7 +902,8 @@ BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( |
type == BookmarkNode::MOBILE); |
BookmarkPermanentNode* node = |
new BookmarkPermanentNode(generate_next_node_id()); |
- node->set_visible(client_->IsPermanentNodeVisible(type)); |
+ node->set_type(type); |
+ node->set_visible(client_->IsPermanentNodeVisible(node)); |
int title_id; |
switch (type) { |
@@ -902,7 +922,6 @@ BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( |
break; |
} |
node->SetTitle(l10n_util::GetStringUTF16(title_id)); |
- node->set_type(type); |
return node; |
} |
@@ -984,6 +1003,7 @@ scoped_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails( |
bb_node, |
other_node, |
mobile_node, |
+ client_->GetLoadExtraNodesCallback(), |
new BookmarkIndex(client_, index_urls_, accept_languages), |
next_node_id_)); |
} |