OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/android/bookmarks/bookmarks_bridge.h" | 5 #include "chrome/browser/android/bookmarks/bookmarks_bridge.h" |
6 | 6 |
7 #include "base/android/jni_array.h" | 7 #include "base/android/jni_array.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/containers/stack_container.h" | 9 #include "base/containers/stack_container.h" |
10 #include "base/i18n/string_compare.h" | 10 #include "base/i18n/string_compare.h" |
11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
12 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 12 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
13 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h" | |
14 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" | 13 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" |
15 #include "chrome/browser/profiles/incognito_helpers.h" | 14 #include "chrome/browser/profiles/incognito_helpers.h" |
16 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
17 #include "chrome/browser/profiles/profile_android.h" | 16 #include "chrome/browser/profiles/profile_android.h" |
18 #include "chrome/browser/signin/signin_manager_factory.h" | 17 #include "chrome/browser/signin/signin_manager_factory.h" |
19 #include "chrome/browser/undo/bookmark_undo_service_factory.h" | 18 #include "chrome/browser/undo/bookmark_undo_service_factory.h" |
20 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
21 #include "components/bookmarks/browser/bookmark_match.h" | 20 #include "components/bookmarks/browser/bookmark_match.h" |
22 #include "components/bookmarks/browser/bookmark_model.h" | 21 #include "components/bookmarks/browser/bookmark_model.h" |
23 #include "components/bookmarks/browser/bookmark_utils.h" | 22 #include "components/bookmarks/browser/bookmark_utils.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 return collator_.Pass(); | 87 return collator_.Pass(); |
89 } | 88 } |
90 | 89 |
91 } // namespace | 90 } // namespace |
92 | 91 |
93 BookmarksBridge::BookmarksBridge(JNIEnv* env, | 92 BookmarksBridge::BookmarksBridge(JNIEnv* env, |
94 jobject obj, | 93 jobject obj, |
95 jobject j_profile) | 94 jobject j_profile) |
96 : weak_java_ref_(env, obj), | 95 : weak_java_ref_(env, obj), |
97 bookmark_model_(NULL), | 96 bookmark_model_(NULL), |
98 client_(NULL), | |
99 partner_bookmarks_shim_(NULL) { | 97 partner_bookmarks_shim_(NULL) { |
100 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 98 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
101 profile_ = ProfileAndroid::FromProfileAndroid(j_profile); | 99 profile_ = ProfileAndroid::FromProfileAndroid(j_profile); |
102 bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_); | 100 bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_); |
103 client_ = ChromeBookmarkClientFactory::GetForProfile(profile_); | |
104 | 101 |
105 // Registers the notifications we are interested. | 102 // Registers the notifications we are interested. |
106 bookmark_model_->AddObserver(this); | 103 bookmark_model_->AddObserver(this); |
107 | 104 |
108 // Create the partner Bookmarks shim as early as possible (but don't attach). | 105 // Create the partner Bookmarks shim as early as possible (but don't attach). |
109 partner_bookmarks_shim_ = PartnerBookmarksShim::BuildForBrowserContext( | 106 partner_bookmarks_shim_ = PartnerBookmarksShim::BuildForBrowserContext( |
110 chrome::GetBrowserContextRedirectedInIncognito(profile_)); | 107 chrome::GetBrowserContextRedirectedInIncognito(profile_)); |
111 partner_bookmarks_shim_->AddObserver(this); | 108 partner_bookmarks_shim_->AddObserver(this); |
112 | 109 |
113 NotifyIfDoneLoading(); | 110 NotifyIfDoneLoading(); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 | 214 |
218 void BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env, | 215 void BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env, |
219 jobject obj, | 216 jobject obj, |
220 jboolean get_special, | 217 jboolean get_special, |
221 jboolean get_normal, | 218 jboolean get_normal, |
222 jobject j_result_obj) { | 219 jobject j_result_obj) { |
223 DCHECK(IsLoaded()); | 220 DCHECK(IsLoaded()); |
224 std::vector<const BookmarkNode*> top_level_folders; | 221 std::vector<const BookmarkNode*> top_level_folders; |
225 | 222 |
226 if (get_special) { | 223 if (get_special) { |
227 if (client_->managed_node() && | 224 if (bookmark_model_->managed_node() && |
228 client_->managed_node()->child_count() > 0) { | 225 bookmark_model_->managed_node()->child_count() > 0) { |
229 top_level_folders.push_back(client_->managed_node()); | 226 top_level_folders.push_back(bookmark_model_->managed_node()); |
230 } | 227 } |
231 if (client_->supervised_node() && | 228 if (bookmark_model_->supervised_node() && |
232 client_->supervised_node()->child_count() > 0) { | 229 bookmark_model_->supervised_node()->child_count() > 0) { |
233 top_level_folders.push_back(client_->supervised_node()); | 230 top_level_folders.push_back(bookmark_model_->supervised_node()); |
234 } | 231 } |
235 if (partner_bookmarks_shim_->HasPartnerBookmarks() | 232 if (partner_bookmarks_shim_->HasPartnerBookmarks() |
236 && IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { | 233 && IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { |
237 top_level_folders.push_back( | 234 top_level_folders.push_back( |
238 partner_bookmarks_shim_->GetPartnerBookmarksRoot()); | 235 partner_bookmarks_shim_->GetPartnerBookmarksRoot()); |
239 } | 236 } |
240 } | 237 } |
241 std::size_t special_count = top_level_folders.size(); | 238 std::size_t special_count = top_level_folders.size(); |
242 | 239 |
243 if (get_normal) { | 240 if (get_normal) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 stk.pop(); | 315 stk.pop(); |
319 Java_BookmarksBridge_addToBookmarkIdListWithDepth(env, | 316 Java_BookmarksBridge_addToBookmarkIdListWithDepth(env, |
320 j_folders_obj, | 317 j_folders_obj, |
321 node->id(), | 318 node->id(), |
322 GetBookmarkType(node), | 319 GetBookmarkType(node), |
323 j_depths_obj, | 320 j_depths_obj, |
324 depth); | 321 depth); |
325 bookmarkList.clear(); | 322 bookmarkList.clear(); |
326 for (int i = 0; i < node->child_count(); ++i) { | 323 for (int i = 0; i < node->child_count(); ++i) { |
327 const BookmarkNode* child = node->GetChild(i); | 324 const BookmarkNode* child = node->GetChild(i); |
328 if (child->is_folder() && client_->CanBeEditedByUser(child)) | 325 if (child->is_folder() && bookmark_model_->CanBeEditedByUser(child)) |
329 bookmarkList.push_back(node->GetChild(i)); | 326 bookmarkList.push_back(node->GetChild(i)); |
330 } | 327 } |
331 std::stable_sort(bookmarkList.begin(), | 328 std::stable_sort(bookmarkList.begin(), |
332 bookmarkList.end(), | 329 bookmarkList.end(), |
333 BookmarkTitleComparer(this, collator.get())); | 330 BookmarkTitleComparer(this, collator.get())); |
334 for (std::vector<const BookmarkNode*>::reverse_iterator it = | 331 for (std::vector<const BookmarkNode*>::reverse_iterator it = |
335 bookmarkList.rbegin(); | 332 bookmarkList.rbegin(); |
336 it != bookmarkList.rend(); | 333 it != bookmarkList.rend(); |
337 ++it) { | 334 ++it) { |
338 stk.push(std::make_pair(*it, depth + 1)); | 335 stk.push(std::make_pair(*it, depth + 1)); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 folder_iter != folders.end(); ++folder_iter) { | 438 folder_iter != folders.end(); ++folder_iter) { |
442 if (*folder_iter == NULL) | 439 if (*folder_iter == NULL) |
443 continue; | 440 continue; |
444 | 441 |
445 std::list<const BookmarkNode*>::iterator insert_iter = folder_iter; | 442 std::list<const BookmarkNode*>::iterator insert_iter = folder_iter; |
446 ++insert_iter; | 443 ++insert_iter; |
447 | 444 |
448 for (int i = 0; i < (*folder_iter)->child_count(); ++i) { | 445 for (int i = 0; i < (*folder_iter)->child_count(); ++i) { |
449 const BookmarkNode* child = (*folder_iter)->GetChild(i); | 446 const BookmarkNode* child = (*folder_iter)->GetChild(i); |
450 if (!IsReachable(child) || | 447 if (!IsReachable(child) || |
451 bookmarks::IsDescendantOf(child, client_->managed_node()) || | 448 bookmarks::IsDescendantOf(child, bookmark_model_->managed_node()) || |
452 bookmarks::IsDescendantOf(child, client_->supervised_node())) { | 449 bookmarks::IsDescendantOf(child, |
| 450 bookmark_model_->supervised_node())) { |
453 continue; | 451 continue; |
454 } | 452 } |
455 | 453 |
456 if (child->is_folder()) { | 454 if (child->is_folder()) { |
457 insert_iter = folders.insert(insert_iter, child); | 455 insert_iter = folders.insert(insert_iter, child); |
458 } else { | 456 } else { |
459 result.push_back(child); | 457 result.push_back(child); |
460 } | 458 } |
461 } | 459 } |
462 } | 460 } |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 static_cast<int64>(node_id)); | 761 static_cast<int64>(node_id)); |
764 } | 762 } |
765 return node; | 763 return node; |
766 } | 764 } |
767 | 765 |
768 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, | 766 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, |
769 int type) { | 767 int type) { |
770 const BookmarkNode* folder = GetNodeByID(folder_id, type); | 768 const BookmarkNode* folder = GetNodeByID(folder_id, type); |
771 if (!folder || folder->type() == BookmarkNode::URL || | 769 if (!folder || folder->type() == BookmarkNode::URL || |
772 !IsFolderAvailable(folder)) { | 770 !IsFolderAvailable(folder)) { |
773 if (!client_->managed_node()->empty()) | 771 if (!bookmark_model_->managed_node()->empty()) |
774 folder = client_->managed_node(); | 772 folder = bookmark_model_->managed_node(); |
775 else | 773 else |
776 folder = bookmark_model_->mobile_node(); | 774 folder = bookmark_model_->mobile_node(); |
777 } | 775 } |
778 return folder; | 776 return folder; |
779 } | 777 } |
780 | 778 |
781 bool BookmarksBridge::IsEditable(const BookmarkNode* node) const { | 779 bool BookmarksBridge::IsEditable(const BookmarkNode* node) const { |
782 if (!node || (node->type() != BookmarkNode::FOLDER && | 780 if (!node || (node->type() != BookmarkNode::FOLDER && |
783 node->type() != BookmarkNode::URL)) { | 781 node->type() != BookmarkNode::URL)) { |
784 return false; | 782 return false; |
785 } | 783 } |
786 if (!IsEditBookmarksEnabled(profile_)) | 784 if (!IsEditBookmarksEnabled(profile_)) |
787 return false; | 785 return false; |
788 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) | 786 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) |
789 return partner_bookmarks_shim_->IsEditable(node); | 787 return partner_bookmarks_shim_->IsEditable(node); |
790 return client_->CanBeEditedByUser(node); | 788 return bookmark_model_->CanBeEditedByUser(node); |
791 } | 789 } |
792 | 790 |
793 bool BookmarksBridge::IsManaged(const BookmarkNode* node) const { | 791 bool BookmarksBridge::IsManaged(const BookmarkNode* node) const { |
794 return bookmarks::IsDescendantOf(node, client_->managed_node()); | 792 return bookmarks::IsDescendantOf(node, bookmark_model_->managed_node()); |
795 } | 793 } |
796 | 794 |
797 const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) { | 795 const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) { |
798 DCHECK(IsLoaded()); | 796 DCHECK(IsLoaded()); |
799 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { | 797 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { |
800 return bookmark_model_->mobile_node(); | 798 return bookmark_model_->mobile_node(); |
801 } else { | 799 } else { |
802 return node->parent(); | 800 return node->parent(); |
803 } | 801 } |
804 } | 802 } |
(...skipping 12 matching lines...) Expand all Loading... |
817 } | 815 } |
818 | 816 |
819 bool BookmarksBridge::IsLoaded() const { | 817 bool BookmarksBridge::IsLoaded() const { |
820 return (bookmark_model_->loaded() && partner_bookmarks_shim_->IsLoaded()); | 818 return (bookmark_model_->loaded() && partner_bookmarks_shim_->IsLoaded()); |
821 } | 819 } |
822 | 820 |
823 bool BookmarksBridge::IsFolderAvailable( | 821 bool BookmarksBridge::IsFolderAvailable( |
824 const BookmarkNode* folder) const { | 822 const BookmarkNode* folder) const { |
825 // The managed bookmarks folder is not shown if there are no bookmarks | 823 // The managed bookmarks folder is not shown if there are no bookmarks |
826 // configured via policy. | 824 // configured via policy. |
827 if (folder == client_->managed_node() && folder->empty()) | 825 if (folder == bookmark_model_->managed_node() && folder->empty()) |
828 return false; | 826 return false; |
829 // Similarly, the supervised bookmarks folder is not shown if there are no | 827 // Similarly, the supervised bookmarks folder is not shown if there are no |
830 // bookmarks configured by the custodian. | 828 // bookmarks configured by the custodian. |
831 if (folder == client_->supervised_node() && folder->empty()) | 829 if (folder == bookmark_model_->supervised_node() && folder->empty()) |
832 return false; | 830 return false; |
833 | 831 |
834 SigninManager* signin = SigninManagerFactory::GetForProfile( | 832 SigninManager* signin = SigninManagerFactory::GetForProfile( |
835 profile_->GetOriginalProfile()); | 833 profile_->GetOriginalProfile()); |
836 return (folder->type() != BookmarkNode::BOOKMARK_BAR && | 834 return (folder->type() != BookmarkNode::BOOKMARK_BAR && |
837 folder->type() != BookmarkNode::OTHER_NODE) || | 835 folder->type() != BookmarkNode::OTHER_NODE) || |
838 (signin && signin->IsAuthenticated()); | 836 (signin && signin->IsAuthenticated()); |
839 } | 837 } |
840 | 838 |
841 void BookmarksBridge::NotifyIfDoneLoading() { | 839 void BookmarksBridge::NotifyIfDoneLoading() { |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 BookmarkModelChanged(); | 1007 BookmarkModelChanged(); |
1010 } | 1008 } |
1011 | 1009 |
1012 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { | 1010 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { |
1013 NotifyIfDoneLoading(); | 1011 NotifyIfDoneLoading(); |
1014 } | 1012 } |
1015 | 1013 |
1016 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { | 1014 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { |
1017 partner_bookmarks_shim_ = NULL; | 1015 partner_bookmarks_shim_ = NULL; |
1018 } | 1016 } |
OLD | NEW |