Index: ios/chrome/browser/bookmarks/bookmarks_utils.cc |
diff --git a/ios/chrome/browser/bookmarks/bookmarks_utils.cc b/ios/chrome/browser/bookmarks/bookmarks_utils.cc |
index 97dc51aade11e82a7bfb9dd41f0321e5c7ad07a1..9d4f3785003623b0c3216fc0fcf08140ff6a494f 100644 |
--- a/ios/chrome/browser/bookmarks/bookmarks_utils.cc |
+++ b/ios/chrome/browser/bookmarks/bookmarks_utils.cc |
@@ -12,6 +12,9 @@ |
#include "ios/chrome/browser/pref_names.h" |
#include "ios/public/provider/chrome/browser/browser_state/chrome_browser_state.h" |
+using bookmarks::BookmarkModel; |
+using bookmarks::BookmarkNode; |
+ |
void RecordBookmarkLaunch(BookmarkLaunchLocation launch_location) { |
DCHECK(launch_location < BOOKMARK_LAUNCH_LOCATION_COUNT); |
UMA_HISTOGRAM_ENUMERATION("Stars.LaunchLocation", launch_location, |
@@ -19,7 +22,7 @@ void RecordBookmarkLaunch(BookmarkLaunchLocation launch_location) { |
} |
bool RemoveAllUserBookmarksIOS(ios::ChromeBrowserState* browser_state) { |
- bookmarks::BookmarkModel* bookmark_model = |
+ BookmarkModel* bookmark_model = |
ios::BookmarkModelFactory::GetForBrowserState(browser_state); |
if (!bookmark_model->loaded()) |
@@ -40,3 +43,55 @@ bool RemoveAllUserBookmarksIOS(ios::ChromeBrowserState* browser_state) { |
return true; |
} |
+ |
+std::vector<const BookmarkNode*> PrimaryPermanentNodes(BookmarkModel* model) { |
+ DCHECK(model->loaded()); |
+ std::vector<const BookmarkNode*> nodes; |
+ nodes.push_back(model->mobile_node()); |
+ nodes.push_back(model->bookmark_bar_node()); |
+ nodes.push_back(model->other_node()); |
+ return nodes; |
+} |
+ |
+std::vector<const BookmarkNode*> RootLevelFolders(BookmarkModel* model) { |
+ std::vector<const BookmarkNode*> root_level_folders; |
+ |
+ // Find the direct folder children of the primary permanent nodes. |
+ std::vector<const BookmarkNode*> primary_permanent_nodes = |
+ PrimaryPermanentNodes(model); |
+ for (const BookmarkNode* parent : primary_permanent_nodes) { |
+ int child_count = parent->child_count(); |
+ for (int i = 0; i < child_count; ++i) { |
+ const BookmarkNode* node = parent->GetChild(i); |
+ if (node->is_folder() && node->IsVisible()) |
+ root_level_folders.push_back(node); |
+ } |
+ } |
+ return root_level_folders; |
+} |
+ |
+bool IsPrimaryPermanentNode(const BookmarkNode* node, BookmarkModel* model) { |
+ std::vector<const BookmarkNode*> primary_nodes(PrimaryPermanentNodes(model)); |
+ if (std::find(primary_nodes.begin(), primary_nodes.end(), node) != |
+ primary_nodes.end()) { |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+const BookmarkNode* RootLevelFolderForNode(const BookmarkNode* node, |
+ BookmarkModel* model) { |
+ // This helper function doesn't work for managed bookmarks. This checks that |
+ // |node| is editable by the user, which currently covers all the other |
+ // bookmarks except the managed bookmarks. |
+ DCHECK(model->client()->CanBeEditedByUser(node)); |
+ |
+ const std::vector<const BookmarkNode*> root_folders(RootLevelFolders(model)); |
+ const BookmarkNode* top = node; |
+ while (top && |
+ std::find(root_folders.begin(), root_folders.end(), top) == |
+ root_folders.end()) { |
+ top = top->parent(); |
+ } |
+ return top; |
+} |