Chromium Code Reviews| Index: chrome/browser/android/bookmarks/bookmarks_bridge.cc |
| diff --git a/chrome/browser/android/bookmarks/bookmarks_bridge.cc b/chrome/browser/android/bookmarks/bookmarks_bridge.cc |
| index 71f1c2795801484c3de8722062d2f81855786407..9646aa1fdcdd7063b1d66a7b125a12a8ab5769a6 100644 |
| --- a/chrome/browser/android/bookmarks/bookmarks_bridge.cc |
| +++ b/chrome/browser/android/bookmarks/bookmarks_bridge.cc |
| @@ -245,6 +245,76 @@ void BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env, |
| } |
| } |
| +void BookmarksBridge::GetAllFoldersWithDepths(JNIEnv* env, |
| + jobject obj, |
| + jobject j_folder_obj, |
| + jobject j_depth_obj) { |
| + DCHECK(IsLoaded()); |
| + |
| + const BookmarkNode* desktop = bookmark_model_->bookmark_bar_node(); |
| + const BookmarkNode* mobile = bookmark_model_->mobile_node(); |
| + const BookmarkNode* other = bookmark_model_->other_node(); |
| + |
| + scoped_ptr<icu::Collator> collator = GetICUCollator(); |
| + |
| + // Vector to temporarily contain all child bookmarks at same level for sorting |
| + std::vector<const BookmarkNode*> vct; |
|
Yaron
2014/09/05 03:30:58
nit: prefer meaningful names over abbreviated name
Ian Wen
2014/09/05 21:17:32
Done.
|
| + // Stack for Depth-First Search of bookmark model. It stores nodes and their |
| + // heights. |
| + std::stack<std::pair<const BookmarkNode*, int> > stk; |
|
Yaron
2014/09/05 03:30:59
stack/bookmarkDepth?
Ian Wen
2014/09/05 21:17:32
Stack is the symbolic sign of depth first traversa
|
| + |
| + for (int i = 0; i < mobile->child_count(); ++i) { |
| + vct.push_back(mobile->GetChild(i)); |
| + } |
| + for (int i = 0; i < other->child_count(); ++i) { |
| + vct.push_back(other->GetChild(i)); |
|
Yaron
2014/09/05 03:30:59
as new bookmarks by default are added to "other" a
Ian Wen
2014/09/05 21:17:32
Done.
|
| + } |
| + vct.push_back(desktop); |
| + std::stable_sort( |
| + vct.begin(), vct.end(), BookmarkTitleComparer(collator.get())); |
| + |
| + // Push all sorted top folders in stack and give them depth of 0. |
| + for (std::vector<const BookmarkNode*>::reverse_iterator it = vct.rbegin(); |
|
Yaron
2014/09/05 03:30:58
why reverse_iterator? also, why not use const_iter
Ian Wen
2014/09/05 21:17:32
Changed to const_reverse_iterator.
In vector, fol
|
| + it != vct.rend(); |
| + ++it) { |
| + stk.push(std::make_pair(*it, 0)); |
| + } |
| + |
| + while (!stk.empty()) { |
| + const BookmarkNode* node = stk.top().first; |
| + int depth = stk.top().second; |
| + stk.pop(); |
| + if (!node->is_folder() || !client_->CanBeEditedByUser(node)) |
| + continue; |
| + Java_BookmarksBridge_addToBookmarkIdListWithDepth(env, |
| + j_folder_obj, |
| + node->id(), |
| + GetBookmarkType(node), |
| + j_depth_obj, |
| + depth); |
| + vct.clear(); |
| + for (int i = 0; i < node->child_count(); ++i) { |
| + vct.push_back(node->GetChild(i)); |
|
Yaron
2014/09/05 03:30:59
same comment about effeciency
Ian Wen
2014/09/05 21:17:32
Done.
|
| + } |
| + std::stable_sort( |
| + vct.begin(), vct.end(), BookmarkTitleComparer(collator.get())); |
| + for (std::vector<const BookmarkNode*>::reverse_iterator it = vct.rbegin(); |
| + it != vct.rend(); |
| + ++it) { |
| + stk.push(std::make_pair(*it, depth + 1)); |
| + } |
| + } |
| +} |
| + |
| +ScopedJavaLocalRef<jobject> BookmarksBridge::GetMobileFolderId(JNIEnv* env, |
| + jobject obj) { |
| + const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); |
| + ScopedJavaLocalRef<jobject> folder_id_obj = |
| + Java_BookmarksBridge_createBookmarkId( |
| + env, mobileNode->id(), GetBookmarkType(mobileNode)); |
| + return folder_id_obj; |
| +} |
| + |
| void BookmarksBridge::GetChildIDs(JNIEnv* env, |
| jobject obj, |
| jlong id, |