OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/provider/chrome_browser_provider.h" | 5 #include "chrome/browser/android/provider/chrome_browser_provider.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <list> | 8 #include <list> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/android/jni_android.h" | 11 #include "base/android/jni_android.h" |
12 #include "base/android/jni_array.h" | 12 #include "base/android/jni_array.h" |
13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/memory/ref_counted_memory.h" | 15 #include "base/memory/ref_counted_memory.h" |
16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
17 #include "base/task/cancelable_task_tracker.h" | 17 #include "base/task/cancelable_task_tracker.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
19 #include "chrome/browser/android/provider/blocking_ui_thread_async_request.h" | 19 #include "chrome/browser/android/provider/blocking_ui_thread_async_request.h" |
20 #include "chrome/browser/android/provider/bookmark_model_observer_task.h" | 20 #include "chrome/browser/android/provider/bookmark_model_observer_task.h" |
21 #include "chrome/browser/android/provider/run_on_ui_thread_blocking.h" | 21 #include "chrome/browser/android/provider/run_on_ui_thread_blocking.h" |
22 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 22 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
23 #include "chrome/browser/bookmarks/chrome_bookmark_client.h" | 23 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" |
24 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h" | |
25 #include "chrome/browser/browser_process.h" | 24 #include "chrome/browser/browser_process.h" |
26 #include "chrome/browser/favicon/favicon_service_factory.h" | 25 #include "chrome/browser/favicon/favicon_service_factory.h" |
27 #include "chrome/browser/history/android/sqlite_cursor.h" | 26 #include "chrome/browser/history/android/sqlite_cursor.h" |
28 #include "chrome/browser/history/history_service_factory.h" | 27 #include "chrome/browser/history/history_service_factory.h" |
29 #include "chrome/browser/history/top_sites_factory.h" | 28 #include "chrome/browser/history/top_sites_factory.h" |
30 #include "chrome/browser/profiles/profile.h" | 29 #include "chrome/browser/profiles/profile.h" |
31 #include "chrome/browser/profiles/profile_manager.h" | 30 #include "chrome/browser/profiles/profile_manager.h" |
32 #include "chrome/browser/search_engines/template_url_service_factory.h" | 31 #include "chrome/browser/search_engines/template_url_service_factory.h" |
33 #include "components/bookmarks/browser/bookmark_model.h" | 32 #include "components/bookmarks/browser/bookmark_model.h" |
34 #include "components/bookmarks/browser/bookmark_utils.h" | 33 #include "components/bookmarks/browser/bookmark_utils.h" |
| 34 #include "components/bookmarks/managed/managed_bookmark_service.h" |
35 #include "components/favicon/core/favicon_service.h" | 35 #include "components/favicon/core/favicon_service.h" |
36 #include "components/history/core/browser/android/android_history_types.h" | 36 #include "components/history/core/browser/android/android_history_types.h" |
37 #include "components/history/core/browser/history_service.h" | 37 #include "components/history/core/browser/history_service.h" |
38 #include "components/history/core/browser/top_sites.h" | 38 #include "components/history/core/browser/top_sites.h" |
39 #include "components/search_engines/template_url.h" | 39 #include "components/search_engines/template_url.h" |
40 #include "components/search_engines/template_url_service.h" | 40 #include "components/search_engines/template_url_service.h" |
41 #include "content/public/browser/browser_thread.h" | 41 #include "content/public/browser/browser_thread.h" |
42 #include "jni/ChromeBrowserProvider_jni.h" | 42 #include "jni/ChromeBrowserProvider_jni.h" |
43 #include "ui/base/layout.h" | 43 #include "ui/base/layout.h" |
44 #include "ui/base/resource/resource_bundle.h" | 44 #include "ui/base/resource/resource_bundle.h" |
45 #include "ui/gfx/favicon_size.h" | 45 #include "ui/gfx/favicon_size.h" |
46 | 46 |
47 using base::android::AttachCurrentThread; | 47 using base::android::AttachCurrentThread; |
48 using base::android::CheckException; | 48 using base::android::CheckException; |
49 using base::android::ClearException; | 49 using base::android::ClearException; |
50 using base::android::ConvertJavaStringToUTF16; | 50 using base::android::ConvertJavaStringToUTF16; |
51 using base::android::ConvertJavaStringToUTF8; | 51 using base::android::ConvertJavaStringToUTF8; |
52 using base::android::ConvertUTF8ToJavaString; | 52 using base::android::ConvertUTF8ToJavaString; |
53 using base::android::ConvertUTF16ToJavaString; | 53 using base::android::ConvertUTF16ToJavaString; |
54 using base::android::GetClass; | 54 using base::android::GetClass; |
55 using base::android::MethodID; | 55 using base::android::MethodID; |
56 using base::android::JavaRef; | 56 using base::android::JavaRef; |
57 using base::android::ScopedJavaGlobalRef; | 57 using base::android::ScopedJavaGlobalRef; |
58 using base::android::ScopedJavaLocalRef; | 58 using base::android::ScopedJavaLocalRef; |
59 using bookmarks::BookmarkModel; | 59 using bookmarks::BookmarkModel; |
60 using bookmarks::BookmarkNode; | 60 using bookmarks::BookmarkNode; |
| 61 using bookmarks::ManagedBookmarkService; |
61 using content::BrowserThread; | 62 using content::BrowserThread; |
62 | 63 |
63 // After refactoring the following class hierarchy has been created in order | 64 // After refactoring the following class hierarchy has been created in order |
64 // to avoid repeating code again for the same basic kind of tasks, to enforce | 65 // to avoid repeating code again for the same basic kind of tasks, to enforce |
65 // the correct thread usage and to prevent known race conditions and deadlocks. | 66 // the correct thread usage and to prevent known race conditions and deadlocks. |
66 // | 67 // |
67 // - RunOnUIThreadBlocking: auxiliary class to run methods in the UI thread | 68 // - RunOnUIThreadBlocking: auxiliary class to run methods in the UI thread |
68 // blocking the current one until finished. Because of the provider threading | 69 // blocking the current one until finished. Because of the provider threading |
69 // expectations this cannot be used from the UI thread. | 70 // expectations this cannot be used from the UI thread. |
70 // | 71 // |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 parent->id(), result); | 474 parent->id(), result); |
474 } | 475 } |
475 | 476 |
476 private: | 477 private: |
477 DISALLOW_COPY_AND_ASSIGN(CreateBookmarksFolderOnceTask); | 478 DISALLOW_COPY_AND_ASSIGN(CreateBookmarksFolderOnceTask); |
478 }; | 479 }; |
479 | 480 |
480 // Creates a Java BookmarkNode object for a node given its id. | 481 // Creates a Java BookmarkNode object for a node given its id. |
481 class GetEditableBookmarkFoldersTask : public BookmarkModelTask { | 482 class GetEditableBookmarkFoldersTask : public BookmarkModelTask { |
482 public: | 483 public: |
483 GetEditableBookmarkFoldersTask(ChromeBookmarkClient* client, | 484 GetEditableBookmarkFoldersTask( |
484 BookmarkModel* model) | 485 ManagedBookmarkService* managed_bookmark_service, |
485 : BookmarkModelTask(model), client_(client) {} | 486 BookmarkModel* model) |
| 487 : BookmarkModelTask(model), |
| 488 managed_bookmark_service_(managed_bookmark_service) {} |
486 | 489 |
487 void Run(ScopedJavaGlobalRef<jobject>* jroot) { | 490 void Run(ScopedJavaGlobalRef<jobject>* jroot) { |
488 RunOnUIThreadBlocking::Run( | 491 RunOnUIThreadBlocking::Run( |
489 base::Bind(&GetEditableBookmarkFoldersTask::RunOnUIThread, | 492 base::Bind(&GetEditableBookmarkFoldersTask::RunOnUIThread, |
490 client_, model(), jroot)); | 493 managed_bookmark_service_, model(), jroot)); |
491 } | 494 } |
492 | 495 |
493 static void RunOnUIThread(ChromeBookmarkClient* client, | 496 static void RunOnUIThread(ManagedBookmarkService* managed, |
494 BookmarkModel* model, | 497 BookmarkModel* model, |
495 ScopedJavaGlobalRef<jobject>* jroot) { | 498 ScopedJavaGlobalRef<jobject>* jroot) { |
496 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 499 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
497 const BookmarkNode* root = model->root_node(); | 500 const BookmarkNode* root = model->root_node(); |
498 if (!root || !root->is_folder()) | 501 if (!root || !root->is_folder()) |
499 return; | 502 return; |
500 | 503 |
501 // The iterative approach is not possible because ScopedGlobalJavaRefs | 504 // The iterative approach is not possible because ScopedGlobalJavaRefs |
502 // cannot be copy-constructed, and therefore not used in STL containers. | 505 // cannot be copy-constructed, and therefore not used in STL containers. |
503 ConvertFolderSubtree(client, AttachCurrentThread(), root, | 506 ConvertFolderSubtree(managed, AttachCurrentThread(), root, |
504 ScopedJavaLocalRef<jobject>(), jroot); | 507 ScopedJavaLocalRef<jobject>(), jroot); |
505 } | 508 } |
506 | 509 |
507 private: | 510 private: |
508 static void ConvertFolderSubtree(ChromeBookmarkClient* client, | 511 static void ConvertFolderSubtree(ManagedBookmarkService* managed, |
509 JNIEnv* env, | 512 JNIEnv* env, |
510 const BookmarkNode* node, | 513 const BookmarkNode* node, |
511 const JavaRef<jobject>& parent_folder, | 514 const JavaRef<jobject>& parent_folder, |
512 ScopedJavaGlobalRef<jobject>* jfolder) { | 515 ScopedJavaGlobalRef<jobject>* jfolder) { |
513 DCHECK(node); | 516 DCHECK(node); |
514 DCHECK(node->is_folder()); | 517 DCHECK(node->is_folder()); |
515 DCHECK(jfolder); | 518 DCHECK(jfolder); |
516 | 519 |
517 // Global refs should be used here for thread-safety reasons as this task | 520 // Global refs should be used here for thread-safety reasons as this task |
518 // might be invoked from a thread other than UI. All refs are scoped. | 521 // might be invoked from a thread other than UI. All refs are scoped. |
519 ConvertBookmarkNode(node, parent_folder, jfolder); | 522 ConvertBookmarkNode(node, parent_folder, jfolder); |
520 | 523 |
521 for (int i = 0; i < node->child_count(); ++i) { | 524 for (int i = 0; i < node->child_count(); ++i) { |
522 const BookmarkNode* child = node->GetChild(i); | 525 const BookmarkNode* child = node->GetChild(i); |
523 if (child->is_folder() && client->CanBeEditedByUser(child)) { | 526 if (child->is_folder() && managed->CanBeEditedByUser(child)) { |
524 ScopedJavaGlobalRef<jobject> jchild; | 527 ScopedJavaGlobalRef<jobject> jchild; |
525 ConvertFolderSubtree(client, env, child, *jfolder, &jchild); | 528 ConvertFolderSubtree(managed, env, child, *jfolder, &jchild); |
526 | 529 |
527 Java_BookmarkNode_addChild(env, jfolder->obj(), jchild.obj()); | 530 Java_BookmarkNode_addChild(env, jfolder->obj(), jchild.obj()); |
528 if (ClearException(env)) { | 531 if (ClearException(env)) { |
529 LOG(WARNING) << "Java exception while adding child node."; | 532 LOG(WARNING) << "Java exception while adding child node."; |
530 return; | 533 return; |
531 } | 534 } |
532 } | 535 } |
533 } | 536 } |
534 } | 537 } |
535 | 538 |
536 ChromeBookmarkClient* client_; | 539 ManagedBookmarkService* managed_bookmark_service_; |
537 | 540 |
538 DISALLOW_COPY_AND_ASSIGN(GetEditableBookmarkFoldersTask); | 541 DISALLOW_COPY_AND_ASSIGN(GetEditableBookmarkFoldersTask); |
539 }; | 542 }; |
540 | 543 |
541 // Creates a Java BookmarkNode object for a node given its id. | 544 // Creates a Java BookmarkNode object for a node given its id. |
542 class GetBookmarkNodeTask : public BookmarkModelTask { | 545 class GetBookmarkNodeTask : public BookmarkModelTask { |
543 public: | 546 public: |
544 explicit GetBookmarkNodeTask(BookmarkModel* model) | 547 explicit GetBookmarkNodeTask(BookmarkModel* model) |
545 : BookmarkModelTask(model) { | 548 : BookmarkModelTask(model) { |
546 } | 549 } |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 return kInvalidBookmarkId; | 1500 return kInvalidBookmarkId; |
1498 | 1501 |
1499 CreateBookmarksFolderOnceTask task(bookmark_model_); | 1502 CreateBookmarksFolderOnceTask task(bookmark_model_); |
1500 return task.Run(title, parent_id); | 1503 return task.Run(title, parent_id); |
1501 } | 1504 } |
1502 | 1505 |
1503 ScopedJavaLocalRef<jobject> ChromeBrowserProvider::GetEditableBookmarkFolders( | 1506 ScopedJavaLocalRef<jobject> ChromeBrowserProvider::GetEditableBookmarkFolders( |
1504 JNIEnv* env, | 1507 JNIEnv* env, |
1505 jobject obj) { | 1508 jobject obj) { |
1506 ScopedJavaGlobalRef<jobject> jroot; | 1509 ScopedJavaGlobalRef<jobject> jroot; |
1507 ChromeBookmarkClient* client = | 1510 ManagedBookmarkService* managed = |
1508 ChromeBookmarkClientFactory::GetForProfile(profile_); | 1511 ManagedBookmarkServiceFactory::GetForProfile(profile_); |
1509 BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile_); | 1512 BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile_); |
1510 GetEditableBookmarkFoldersTask task(client, model); | 1513 GetEditableBookmarkFoldersTask task(managed, model); |
1511 task.Run(&jroot); | 1514 task.Run(&jroot); |
1512 return ScopedJavaLocalRef<jobject>(jroot); | 1515 return ScopedJavaLocalRef<jobject>(jroot); |
1513 } | 1516 } |
1514 | 1517 |
1515 void ChromeBrowserProvider::RemoveAllUserBookmarks(JNIEnv* env, jobject obj) { | 1518 void ChromeBrowserProvider::RemoveAllUserBookmarks(JNIEnv* env, jobject obj) { |
1516 LOG(ERROR) << "begin ChromeBrowserProvider::RemoveAllUserBookmarks"; | 1519 LOG(ERROR) << "begin ChromeBrowserProvider::RemoveAllUserBookmarks"; |
1517 RemoveAllUserBookmarksTask task(bookmark_model_); | 1520 RemoveAllUserBookmarksTask task(bookmark_model_); |
1518 task.Run(); | 1521 task.Run(); |
1519 LOG(ERROR) << "end ChromeBrowserProvider::RemoveAllUserBookmarks"; | 1522 LOG(ERROR) << "end ChromeBrowserProvider::RemoveAllUserBookmarks"; |
1520 } | 1523 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1641 ScopedJavaLocalRef<jobject> obj = weak_java_provider_.get(env); | 1644 ScopedJavaLocalRef<jobject> obj = weak_java_provider_.get(env); |
1642 if (obj.is_null()) | 1645 if (obj.is_null()) |
1643 return; | 1646 return; |
1644 Java_ChromeBrowserProvider_onSearchTermChanged(env, obj.obj()); | 1647 Java_ChromeBrowserProvider_onSearchTermChanged(env, obj.obj()); |
1645 } | 1648 } |
1646 | 1649 |
1647 void ChromeBrowserProvider::OnKeywordSearchTermDeleted( | 1650 void ChromeBrowserProvider::OnKeywordSearchTermDeleted( |
1648 history::HistoryService* history_service, | 1651 history::HistoryService* history_service, |
1649 history::URLID url_id) { | 1652 history::URLID url_id) { |
1650 } | 1653 } |
OLD | NEW |