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, replace it with the original url. |
jianli
2015/12/15 23:53:34
Update comment.
fgorski
2015/12/16 21:43:16
Done.
| |
777 const offline_pages::OfflinePageItem* offline_page = GetOfflinePage(url); | 777 int64_t candidate_bookmark_id = |
778 if (offline_page) | 778 offline_pages::android::GetBookmarkIdByOfflineURL(profile, url); |
779 url = offline_page->url; | |
780 | 779 |
781 // Get all the nodes for |url| and sort them by date added. | 780 // Get all the nodes for |url| and sort them by date added. |
782 std::vector<const bookmarks::BookmarkNode*> nodes; | 781 std::vector<const bookmarks::BookmarkNode*> nodes; |
783 bookmarks::ManagedBookmarkService* managed = | 782 bookmarks::ManagedBookmarkService* managed = |
784 ManagedBookmarkServiceFactory::GetForProfile(profile); | 783 ManagedBookmarkServiceFactory::GetForProfile(profile); |
785 bookmarks::BookmarkModel* model = | 784 bookmarks::BookmarkModel* model = |
786 BookmarkModelFactory::GetForProfile(profile); | 785 BookmarkModelFactory::GetForProfile(profile); |
786 | |
787 // If we have a candidate bookmark ID from the offline page model and that ID | |
788 // matches an existing bookmark, return it. | |
789 if (candidate_bookmark_id != -1 && | |
790 bookmarks::GetBookmarkNodeByID(model, candidate_bookmark_id) != nullptr) { | |
791 return candidate_bookmark_id; | |
792 } | |
793 | |
787 model->GetNodesByURL(url, &nodes); | 794 model->GetNodesByURL(url, &nodes); |
788 std::sort(nodes.begin(), nodes.end(), &bookmarks::MoreRecentlyAdded); | 795 std::sort(nodes.begin(), nodes.end(), &bookmarks::MoreRecentlyAdded); |
789 | 796 |
790 // Return the first node matching the search criteria. | 797 // Return the first node matching the search criteria. |
791 for (size_t i = 0; i < nodes.size(); ++i) { | 798 for (size_t i = 0; i < nodes.size(); ++i) { |
792 if (only_editable && !managed->CanBeEditedByUser(nodes[i])) | 799 if (only_editable && !managed->CanBeEditedByUser(nodes[i])) |
793 continue; | 800 continue; |
794 return nodes[i]->id(); | 801 return nodes[i]->id(); |
795 } | 802 } |
796 | 803 |
797 return -1; | 804 return -1; |
798 } | 805 } |
799 | 806 |
800 bool TabAndroid::HasOfflinePages() const { | 807 bool TabAndroid::HasOfflinePages() const { |
801 if (!offline_pages::IsOfflinePagesEnabled()) | 808 return offline_pages::android::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 } | 809 } |
808 | 810 |
809 void TabAndroid::ShowOfflinePages() { | 811 void TabAndroid::ShowOfflinePages() { |
810 JNIEnv* env = base::android::AttachCurrentThread(); | 812 JNIEnv* env = base::android::AttachCurrentThread(); |
811 Java_Tab_showOfflinePages(env, weak_java_tab_.get(env).obj()); | 813 Java_Tab_showOfflinePages(env, weak_java_tab_.get(env).obj()); |
812 } | 814 } |
813 | 815 |
814 void TabAndroid::LoadOfflineCopy(const GURL& url) { | 816 void TabAndroid::LoadOfflineCopy(const GURL& url) { |
815 if (!offline_pages::IsOfflinePagesEnabled()) | 817 GURL offline_url = |
816 return; | 818 offline_pages::android::GetOfflineURLByOnlineURL(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()) | 819 if (!offline_url.is_valid()) |
836 return; | 820 return; |
837 | 821 |
838 content::NavigationController::LoadURLParams load_params(offline_url); | 822 content::NavigationController::LoadURLParams load_params(offline_url); |
839 web_contents()->GetController().LoadURLWithParams(load_params); | 823 web_contents()->GetController().LoadURLWithParams(load_params); |
840 } | 824 } |
841 | 825 |
842 jboolean TabAndroid::HasOfflineCopy(JNIEnv* env, | 826 jboolean TabAndroid::HasOfflineCopy(JNIEnv* env, |
843 const JavaParamRef<jobject>& obj) { | 827 const JavaParamRef<jobject>& obj) { |
844 // Offline copy is only saved for a bookmarked page. | 828 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
845 int64_t bookmark_id = GetBookmarkIdHelper(true); | 829 web_contents()->GetURL()); |
846 if (bookmark_id == -1) | 830 return offline_pages::android::HasOfflinePageForOnlineURL(GetProfile(), url); |
847 return false; | |
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 } | 831 } |
858 | 832 |
859 jboolean TabAndroid::IsOfflinePage(JNIEnv* env, | 833 jboolean TabAndroid::IsOfflinePage(JNIEnv* env, |
860 const JavaParamRef<jobject>& obj) { | 834 const JavaParamRef<jobject>& obj) { |
861 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( | 835 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
862 web_contents()->GetURL()); | 836 web_contents()->GetURL()); |
863 return GetOfflinePage(url) != nullptr; | 837 return offline_pages::android::IsOfflinePage(GetProfile(), url); |
864 } | 838 } |
865 | 839 |
866 ScopedJavaLocalRef<jstring> TabAndroid::GetOfflinePageOriginalUrl( | 840 ScopedJavaLocalRef<jstring> TabAndroid::GetOfflinePageOriginalUrl( |
867 JNIEnv* env, | 841 JNIEnv* env, |
868 const JavaParamRef<jobject>& obj) { | 842 const JavaParamRef<jobject>& obj) { |
869 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( | 843 GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
870 web_contents()->GetURL()); | 844 web_contents()->GetURL()); |
871 const offline_pages::OfflinePageItem* offline_page = GetOfflinePage(url); | 845 GURL original_url = |
872 if (offline_page == nullptr) | 846 offline_pages::android::GetOnlineURLByOfflineURL(GetProfile(), url); |
847 if (!original_url.is_valid()) | |
873 return ScopedJavaLocalRef<jstring>(); | 848 return ScopedJavaLocalRef<jstring>(); |
874 | 849 |
875 return ScopedJavaLocalRef<jstring>( | 850 return ScopedJavaLocalRef<jstring>( |
876 ConvertUTF8ToJavaString(env, offline_page->url.spec())); | 851 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 } | 852 } |
895 | 853 |
896 bool TabAndroid::HasPrerenderedUrl(JNIEnv* env, | 854 bool TabAndroid::HasPrerenderedUrl(JNIEnv* env, |
897 const JavaParamRef<jobject>& obj, | 855 const JavaParamRef<jobject>& obj, |
898 const JavaParamRef<jstring>& url) { | 856 const JavaParamRef<jstring>& url) { |
899 GURL gurl(base::android::ConvertJavaStringToUTF8(env, url)); | 857 GURL gurl(base::android::ConvertJavaStringToUTF8(env, url)); |
900 return HasPrerenderedUrl(gurl); | 858 return HasPrerenderedUrl(gurl); |
901 } | 859 } |
902 | 860 |
903 namespace { | 861 namespace { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
975 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 933 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
976 TRACE_EVENT0("native", "TabAndroid::Init"); | 934 TRACE_EVENT0("native", "TabAndroid::Init"); |
977 // This will automatically bind to the Java object and pass ownership there. | 935 // This will automatically bind to the Java object and pass ownership there. |
978 new TabAndroid(env, obj); | 936 new TabAndroid(env, obj); |
979 } | 937 } |
980 | 938 |
981 // static | 939 // static |
982 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { | 940 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { |
983 return RegisterNativesImpl(env); | 941 return RegisterNativesImpl(env); |
984 } | 942 } |
OLD | NEW |