| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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/tab_android.h" | 5 #include "chrome/browser/android/tab_android.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_array.h" | 8 #include "base/android/jni_array.h" |
| 9 #include "base/android/jni_string.h" | 9 #include "base/android/jni_string.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 11 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
| 12 #include "cc/layers/layer.h" | 12 #include "cc/layers/layer.h" |
| 13 #include "chrome/browser/android/compositor/tab_content_manager.h" | 13 #include "chrome/browser/android/compositor/tab_content_manager.h" |
| 14 #include "chrome/browser/android/metrics/uma_utils.h" | 14 #include "chrome/browser/android/metrics/uma_utils.h" |
| 15 #include "chrome/browser/android/offline_pages/offline_page_bridge.h" | |
| 16 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" | 15 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
| 16 #include "chrome/browser/android/offline_pages/offline_page_utils.h" |
| 17 #include "chrome/browser/android/tab_web_contents_delegate_android.h" | 17 #include "chrome/browser/android/tab_web_contents_delegate_android.h" |
| 18 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 18 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 19 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" | 19 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" |
| 20 #include "chrome/browser/browser_about_handler.h" | 20 #include "chrome/browser/browser_about_handler.h" |
| 21 #include "chrome/browser/chrome_notification_types.h" | 21 #include "chrome/browser/chrome_notification_types.h" |
| 22 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 22 #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
| 23 #include "chrome/browser/infobars/infobar_service.h" | 23 #include "chrome/browser/infobars/infobar_service.h" |
| 24 #include "chrome/browser/prerender/prerender_contents.h" | 24 #include "chrome/browser/prerender/prerender_contents.h" |
| 25 #include "chrome/browser/prerender/prerender_manager.h" | 25 #include "chrome/browser/prerender/prerender_manager.h" |
| 26 #include "chrome/browser/prerender/prerender_manager_factory.h" | 26 #include "chrome/browser/prerender/prerender_manager_factory.h" |
| (...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 const JavaParamRef<jobject>& obj, | 766 const JavaParamRef<jobject>& obj, |
| 767 jboolean only_editable) { | 767 jboolean only_editable) { |
| 768 return GetBookmarkIdHelper(only_editable); | 768 return GetBookmarkIdHelper(only_editable); |
| 769 } | 769 } |
| 770 | 770 |
| 771 int64_t TabAndroid::GetBookmarkIdHelper(bool only_editable) const { | 771 int64_t TabAndroid::GetBookmarkIdHelper(bool only_editable) const { |
| 772 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( | 772 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
| 773 web_contents()->GetURL()); | 773 web_contents()->GetURL()); |
| 774 Profile* profile = GetProfile(); | 774 Profile* profile = GetProfile(); |
| 775 | 775 |
| 776 // If the url points to an offline page, replace it with the original url. | 776 // If the url points to an offline page, it already has a bookmark ID that it |
| 777 const offline_pages::OfflinePageItem* offline_page = GetOfflinePage(url); | 777 // is related to. |
| 778 if (offline_page) | 778 int64_t candidate_bookmark_id = |
| 779 url = offline_page->url; | 779 offline_pages::OfflinePageUtils::GetBookmarkIdByOfflineURL(profile, url); |
| 780 | 780 |
| 781 // Get all the nodes for |url| and sort them by date added. | 781 // Get all the nodes for |url| and sort them by date added. |
| 782 std::vector<const bookmarks::BookmarkNode*> nodes; | 782 std::vector<const bookmarks::BookmarkNode*> nodes; |
| 783 bookmarks::ManagedBookmarkService* managed = | 783 bookmarks::ManagedBookmarkService* managed = |
| 784 ManagedBookmarkServiceFactory::GetForProfile(profile); | 784 ManagedBookmarkServiceFactory::GetForProfile(profile); |
| 785 bookmarks::BookmarkModel* model = | 785 bookmarks::BookmarkModel* model = |
| 786 BookmarkModelFactory::GetForProfile(profile); | 786 BookmarkModelFactory::GetForProfile(profile); |
| 787 |
| 788 // If we have a candidate bookmark ID from the offline page model and that ID |
| 789 // matches an existing bookmark, return it. |
| 790 if (candidate_bookmark_id != -1 && |
| 791 bookmarks::GetBookmarkNodeByID(model, candidate_bookmark_id) != nullptr) { |
| 792 return candidate_bookmark_id; |
| 793 } |
| 794 |
| 787 model->GetNodesByURL(url, &nodes); | 795 model->GetNodesByURL(url, &nodes); |
| 788 std::sort(nodes.begin(), nodes.end(), &bookmarks::MoreRecentlyAdded); | 796 std::sort(nodes.begin(), nodes.end(), &bookmarks::MoreRecentlyAdded); |
| 789 | 797 |
| 790 // Return the first node matching the search criteria. | 798 // Return the first node matching the search criteria. |
| 791 for (size_t i = 0; i < nodes.size(); ++i) { | 799 for (size_t i = 0; i < nodes.size(); ++i) { |
| 792 if (only_editable && !managed->CanBeEditedByUser(nodes[i])) | 800 if (only_editable && !managed->CanBeEditedByUser(nodes[i])) |
| 793 continue; | 801 continue; |
| 794 return nodes[i]->id(); | 802 return nodes[i]->id(); |
| 795 } | 803 } |
| 796 | 804 |
| 797 return -1; | 805 return -1; |
| 798 } | 806 } |
| 799 | 807 |
| 800 bool TabAndroid::HasOfflinePages() const { | 808 bool TabAndroid::HasOfflinePages() const { |
| 801 if (!offline_pages::IsOfflinePagesEnabled()) | 809 return offline_pages::OfflinePageUtils::HasOfflinePages(GetProfile()); |
| 802 return false; | |
| 803 offline_pages::OfflinePageModel* offline_page_model = | |
| 804 offline_pages::OfflinePageModelFactory::GetForBrowserContext( | |
| 805 GetProfile()); | |
| 806 return !offline_page_model->GetAllPages().empty(); | |
| 807 } | 810 } |
| 808 | 811 |
| 809 void TabAndroid::ShowOfflinePages() { | 812 void TabAndroid::ShowOfflinePages() { |
| 810 JNIEnv* env = base::android::AttachCurrentThread(); | 813 JNIEnv* env = base::android::AttachCurrentThread(); |
| 811 Java_Tab_showOfflinePages(env, weak_java_tab_.get(env).obj()); | 814 Java_Tab_showOfflinePages(env, weak_java_tab_.get(env).obj()); |
| 812 } | 815 } |
| 813 | 816 |
| 814 void TabAndroid::LoadOfflineCopy(const GURL& url) { | 817 void TabAndroid::LoadOfflineCopy(const GURL& url) { |
| 815 if (!offline_pages::IsOfflinePagesEnabled()) | 818 GURL offline_url = offline_pages::OfflinePageUtils::GetOfflineURLByOnlineURL( |
| 816 return; | 819 GetProfile(), url); |
| 817 | |
| 818 // Offline copy is only saved for a bookmarked page. | |
| 819 int64_t bookmark_id = GetBookmarkIdHelper(true); | |
| 820 if (bookmark_id == -1) | |
| 821 return; | |
| 822 | |
| 823 offline_pages::OfflinePageModel* offline_page_model = | |
| 824 offline_pages::OfflinePageModelFactory::GetForBrowserContext( | |
| 825 GetProfile()); | |
| 826 if (!offline_page_model) | |
| 827 return; | |
| 828 | |
| 829 const offline_pages::OfflinePageItem* offline_page = | |
| 830 offline_page_model->GetPageByBookmarkId(bookmark_id); | |
| 831 if (!offline_page || offline_page->url != url) | |
| 832 return; | |
| 833 | |
| 834 GURL offline_url = offline_page->GetOfflineURL(); | |
| 835 if (!offline_url.is_valid()) | 820 if (!offline_url.is_valid()) |
| 836 return; | 821 return; |
| 837 | 822 |
| 838 content::NavigationController::LoadURLParams load_params(offline_url); | 823 content::NavigationController::LoadURLParams load_params(offline_url); |
| 839 web_contents()->GetController().LoadURLWithParams(load_params); | 824 web_contents()->GetController().LoadURLWithParams(load_params); |
| 840 } | 825 } |
| 841 | 826 |
| 842 jboolean TabAndroid::HasOfflineCopy(JNIEnv* env, | 827 jboolean TabAndroid::HasOfflineCopy(JNIEnv* env, |
| 843 const JavaParamRef<jobject>& obj) { | 828 const JavaParamRef<jobject>& obj) { |
| 844 // Offline copy is only saved for a bookmarked page. | 829 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
| 845 int64_t bookmark_id = GetBookmarkIdHelper(true); | 830 web_contents()->GetURL()); |
| 846 if (bookmark_id == -1) | 831 return offline_pages::OfflinePageUtils::HasOfflinePageForOnlineURL( |
| 847 return false; | 832 GetProfile(), url); |
| 848 | |
| 849 offline_pages::OfflinePageModel* offline_page_model = | |
| 850 offline_pages::OfflinePageModelFactory::GetForBrowserContext( | |
| 851 GetProfile()); | |
| 852 if (!offline_page_model) | |
| 853 return false; | |
| 854 const offline_pages::OfflinePageItem* offline_page = | |
| 855 offline_page_model->GetPageByBookmarkId(bookmark_id); | |
| 856 return offline_page && !offline_page->file_path.empty(); | |
| 857 } | 833 } |
| 858 | 834 |
| 859 jboolean TabAndroid::IsOfflinePage(JNIEnv* env, | 835 jboolean TabAndroid::IsOfflinePage(JNIEnv* env, |
| 860 const JavaParamRef<jobject>& obj) { | 836 const JavaParamRef<jobject>& obj) { |
| 861 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( | 837 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
| 862 web_contents()->GetURL()); | 838 web_contents()->GetURL()); |
| 863 return GetOfflinePage(url) != nullptr; | 839 return offline_pages::OfflinePageUtils::IsOfflinePage(GetProfile(), url); |
| 864 } | 840 } |
| 865 | 841 |
| 866 ScopedJavaLocalRef<jstring> TabAndroid::GetOfflinePageOriginalUrl( | 842 ScopedJavaLocalRef<jstring> TabAndroid::GetOfflinePageOriginalUrl( |
| 867 JNIEnv* env, | 843 JNIEnv* env, |
| 868 const JavaParamRef<jobject>& obj) { | 844 const JavaParamRef<jobject>& obj) { |
| 869 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( | 845 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
| 870 web_contents()->GetURL()); | 846 web_contents()->GetURL()); |
| 871 const offline_pages::OfflinePageItem* offline_page = GetOfflinePage(url); | 847 GURL original_url = offline_pages::OfflinePageUtils::GetOnlineURLByOfflineURL( |
| 872 if (offline_page == nullptr) | 848 GetProfile(), url); |
| 849 if (!original_url.is_valid()) |
| 873 return ScopedJavaLocalRef<jstring>(); | 850 return ScopedJavaLocalRef<jstring>(); |
| 874 | 851 |
| 875 return ScopedJavaLocalRef<jstring>( | 852 return ScopedJavaLocalRef<jstring>( |
| 876 ConvertUTF8ToJavaString(env, offline_page->url.spec())); | 853 ConvertUTF8ToJavaString(env, original_url.spec())); |
| 877 } | |
| 878 | |
| 879 const offline_pages::OfflinePageItem* TabAndroid::GetOfflinePage( | |
| 880 const GURL& url) const { | |
| 881 if (!offline_pages::IsOfflinePagesEnabled()) | |
| 882 return nullptr; | |
| 883 | |
| 884 // Note that we first check if the url likely points to an offline page | |
| 885 // before calling GetPageByOfflineURL in order to avoid unnecessary lookup | |
| 886 // cost. | |
| 887 if (!offline_pages::android::OfflinePageBridge::MightBeOfflineURL(url)) | |
| 888 return nullptr; | |
| 889 | |
| 890 offline_pages::OfflinePageModel* offline_page_model = | |
| 891 offline_pages::OfflinePageModelFactory::GetForBrowserContext( | |
| 892 GetProfile()); | |
| 893 return offline_page_model->GetPageByOfflineURL(url); | |
| 894 } | 854 } |
| 895 | 855 |
| 896 bool TabAndroid::HasPrerenderedUrl(JNIEnv* env, | 856 bool TabAndroid::HasPrerenderedUrl(JNIEnv* env, |
| 897 const JavaParamRef<jobject>& obj, | 857 const JavaParamRef<jobject>& obj, |
| 898 const JavaParamRef<jstring>& url) { | 858 const JavaParamRef<jstring>& url) { |
| 899 GURL gurl(base::android::ConvertJavaStringToUTF8(env, url)); | 859 GURL gurl(base::android::ConvertJavaStringToUTF8(env, url)); |
| 900 return HasPrerenderedUrl(gurl); | 860 return HasPrerenderedUrl(gurl); |
| 901 } | 861 } |
| 902 | 862 |
| 903 namespace { | 863 namespace { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 935 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| 976 TRACE_EVENT0("native", "TabAndroid::Init"); | 936 TRACE_EVENT0("native", "TabAndroid::Init"); |
| 977 // This will automatically bind to the Java object and pass ownership there. | 937 // This will automatically bind to the Java object and pass ownership there. |
| 978 new TabAndroid(env, obj); | 938 new TabAndroid(env, obj); |
| 979 } | 939 } |
| 980 | 940 |
| 981 // static | 941 // static |
| 982 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { | 942 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { |
| 983 return RegisterNativesImpl(env); | 943 return RegisterNativesImpl(env); |
| 984 } | 944 } |
| OLD | NEW |