Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1705)

Side by Side Diff: chrome/browser/android/tab_android.cc

Issue 1521193002: [Offline pages] Refactor URL conversions from TabAndroid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing CR feedback Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698