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

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 final 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, 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::GetBookmarkIdForOfflineURL(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::GetOfflineURLForOnlineURL(
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 =
872 if (offline_page == nullptr) 848 offline_pages::OfflinePageUtils::GetOnlineURLForOfflineURL(GetProfile(),
849 url);
850 if (!original_url.is_valid())
873 return ScopedJavaLocalRef<jstring>(); 851 return ScopedJavaLocalRef<jstring>();
874 852
875 return ScopedJavaLocalRef<jstring>( 853 return ScopedJavaLocalRef<jstring>(
876 ConvertUTF8ToJavaString(env, offline_page->url.spec())); 854 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 } 855 }
895 856
896 bool TabAndroid::HasPrerenderedUrl(JNIEnv* env, 857 bool TabAndroid::HasPrerenderedUrl(JNIEnv* env,
897 const JavaParamRef<jobject>& obj, 858 const JavaParamRef<jobject>& obj,
898 const JavaParamRef<jstring>& url) { 859 const JavaParamRef<jstring>& url) {
899 GURL gurl(base::android::ConvertJavaStringToUTF8(env, url)); 860 GURL gurl(base::android::ConvertJavaStringToUTF8(env, url));
900 return HasPrerenderedUrl(gurl); 861 return HasPrerenderedUrl(gurl);
901 } 862 }
902 863
903 namespace { 864 namespace {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { 936 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
976 TRACE_EVENT0("native", "TabAndroid::Init"); 937 TRACE_EVENT0("native", "TabAndroid::Init");
977 // This will automatically bind to the Java object and pass ownership there. 938 // This will automatically bind to the Java object and pass ownership there.
978 new TabAndroid(env, obj); 939 new TabAndroid(env, obj);
979 } 940 }
980 941
981 // static 942 // static
982 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { 943 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) {
983 return RegisterNativesImpl(env); 944 return RegisterNativesImpl(env);
984 } 945 }
OLDNEW
« no previous file with comments | « chrome/browser/android/tab_android.h ('k') | chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698