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

Unified Diff: chrome/browser/android/tab_android.cc

Issue 177013006: [Android] Move LoadUrl from Tab upstream. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add java method Created 6 years, 9 months 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/tab_android.cc
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index 7410dde72b60061ed30e2da1cb1549b5f3914c9b..1ed29d2aa0700f54688dbfc7042d71f313fccc80 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -5,11 +5,18 @@
#include "chrome/browser/android/tab_android.h"
#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/debug/trace_event.h"
#include "chrome/browser/android/chrome_web_contents_delegate_android.h"
+#include "chrome/browser/browser_about_handler.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
+#include "chrome/browser/google/google_url_tracker.h"
+#include "chrome/browser/google/google_util.h"
+#include "chrome/browser/prerender/prerender_contents.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/printing/print_view_manager_basic.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
@@ -25,11 +32,15 @@
#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
#include "chrome/browser/ui/tab_helpers.h"
#include "chrome/browser/ui/toolbar/toolbar_model_impl.h"
+#include "chrome/common/net/url_fixer_upper.h"
+#include "chrome/common/url_constants.h"
#include "content/public/browser/android/content_view_core.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents.h"
#include "jni/Tab_jni.h"
+#include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
TabAndroid* TabAndroid::FromWebContents(content::WebContents* web_contents) {
CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents);
@@ -181,6 +192,24 @@ bool TabAndroid::ShouldWelcomePageLinkToTermsOfService() {
return false;
}
+bool TabAndroid::HasPrerenderedUrl(GURL gurl) {
+ prerender::PrerenderManager* prerender_manager = GetPrerenderManager();
+ if (!prerender_manager) return false;
+
+ std::vector<content::WebContents*> contents =
+ prerender_manager->GetAllPrerenderingContents();
+ prerender::PrerenderContents* prerender_contents;
+ for (size_t i = 0; i < contents.size(); ++i) {
+ prerender_contents = prerender_manager->
+ GetPrerenderContents(contents.at(i));
+ if (prerender_contents->prerender_url() ==
+ gurl && prerender_contents->has_finished_loading()) {
David Trainor- moved to gerrit 2014/03/06 22:21:32 gurl on line above?
Ted C 2014/03/06 22:30:43 Done.
+ return true;
+ }
+ }
+ return false;
+}
+
void TabAndroid::SwapTabContents(content::WebContents* old_contents,
content::WebContents* new_contents,
bool did_start_load,
@@ -343,6 +372,84 @@ base::android::ScopedJavaLocalRef<jobject> TabAndroid::GetProfileAndroid(
return profile_android->GetJavaObject();
}
+TabAndroid::TabLoadStatus TabAndroid::LoadUrl(JNIEnv* env,
+ jobject obj,
+ jstring url,
+ jstring j_extra_headers,
+ jbyteArray j_post_data,
+ jint page_transition,
+ jstring j_referrer_url,
+ jint referrer_policy) {
+ content::ContentViewCore* content_view = GetContentViewCore();
+ if (!content_view)
+ return PAGE_LOAD_FAILED;
+
+ GURL gurl(base::android::ConvertJavaStringToUTF8(env, url));
+ if (gurl.is_empty())
+ return PAGE_LOAD_FAILED;
+
+ // If the page was prerendered, use it.
+ // Note in incognito mode, we don't have a PrerenderManager.
+
+ prerender::PrerenderManager* prerender_manager =
+ prerender::PrerenderManagerFactory::GetForProfile(GetProfile());
+ if (prerender_manager) {
+ bool prefetched_page_loaded = HasPrerenderedUrl(gurl);
+ // Getting the load status before MaybeUsePrerenderedPage() b/c it resets.
+ chrome::NavigateParams params(NULL, web_contents());
+ if (prerender_manager->MaybeUsePrerenderedPage(gurl, &params)) {
+ return prefetched_page_loaded ?
+ FULL_PRERENDERED_PAGE_LOAD : PARTIAL_PRERENDERED_PAGE_LOAD;
+ }
+ }
+
+ GURL fixed_url(URLFixerUpper::FixupURL(gurl.possibly_invalid_spec(),
+ std::string()));
+ if (!fixed_url.is_valid())
+ return PAGE_LOAD_FAILED;
+
+ if (!HandleNonNavigationAboutURL(fixed_url)) {
+ // Notify the GoogleURLTracker of searches, it might want to change the
+ // actual Google site used (for instance when in the UK, google.co.uk, when
+ // in the US google.com).
+ // Note that this needs to happen before we initiate the navigation as the
+ // GoogleURLTracker uses the navigation pending notification to trigger the
+ // infobar.
+ if (google_util::IsGoogleSearchUrl(fixed_url) &&
+ (page_transition & content::PAGE_TRANSITION_GENERATED)) {
+ GoogleURLTracker::GoogleURLSearchCommitted(GetProfile());
+ }
+
+ // Record UMA "ShowHistory" here. That way it'll pick up both user
+ // typing chrome://history as well as selecting from the drop down menu.
+ if (fixed_url.spec() == chrome::kChromeUIHistoryURL) {
+ content::RecordAction(base::UserMetricsAction("ShowHistory"));
+ }
+
+ content::NavigationController::LoadURLParams load_params(fixed_url);
+ if (j_extra_headers)
+ load_params.extra_headers = base::android::ConvertJavaStringToUTF8(
+ env, j_extra_headers);
David Trainor- moved to gerrit 2014/03/06 22:21:32 new line before j_extra_headers?
Ted C 2014/03/06 22:30:43 Done.
+ if (j_post_data) {
+ load_params.load_type =
+ content::NavigationController::LOAD_TYPE_BROWSER_INITIATED_HTTP_POST;
+ std::vector<uint8> post_data;
+ base::android::JavaByteArrayToByteVector(env, j_post_data, &post_data);
+ load_params.browser_initiated_post_data =
+ base::RefCountedBytes::TakeVector(&post_data);
+ }
+ load_params.transition_type =
+ content::PageTransitionFromInt(page_transition);
+ if (j_referrer_url) {
+ load_params.referrer = content::Referrer(
+ GURL(base::android::ConvertJavaStringToUTF8(env, j_referrer_url)),
+ static_cast<blink::WebReferrerPolicy>(referrer_policy));
+ }
+ content_view->LoadUrl(load_params);
+ }
+ return DEFAULT_PAGE_LOAD;
+}
+
ToolbarModel::SecurityLevel TabAndroid::GetSecurityLevel(JNIEnv* env,
jobject obj) {
return ToolbarModelImpl::GetSecurityLevelForWebContents(web_contents());
@@ -382,6 +489,13 @@ bool TabAndroid::Print(JNIEnv* env, jobject obj) {
return true;
}
+prerender::PrerenderManager* TabAndroid::GetPrerenderManager() const {
+ Profile* profile = GetProfile();
+ if (!profile)
+ return NULL;
+ return prerender::PrerenderManagerFactory::GetForProfile(profile);
+}
+
static void Init(JNIEnv* env, jobject obj) {
TRACE_EVENT0("native", "TabAndroid::Init");
// This will automatically bind to the Java object and pass ownership there.

Powered by Google App Engine
This is Rietveld 408576698