summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authortedchoc@chromium.org <tedchoc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-07 16:47:33 +0000
committertedchoc@chromium.org <tedchoc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-07 16:47:33 +0000
commit85bd656d3817628cfccb1f0883c1d25dcf644140 (patch)
treeb883273d0b351f4c9e9da465cd7dcecb7bd09b1a /chrome
parenteb2d2abc0efb866baaf15c254713758f04c71b08 (diff)
downloadchromium_src-85bd656d3817628cfccb1f0883c1d25dcf644140.zip
chromium_src-85bd656d3817628cfccb1f0883c1d25dcf644140.tar.gz
chromium_src-85bd656d3817628cfccb1f0883c1d25dcf644140.tar.bz2
[Android] Move LoadUrl from Tab upstream.
BUG=350016 TBR=thakis@chromium.org Review URL: https://codereview.chromium.org/177013006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255636 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/android/java/TabLoadStatus.template11
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java3
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/Tab.java37
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java13
-rw-r--r--chrome/browser/android/tab_android.cc117
-rw-r--r--chrome/browser/android/tab_android.h26
-rw-r--r--chrome/browser/android/tab_load_status.h15
-rw-r--r--chrome/chrome.gyp1
-rw-r--r--chrome/chrome_browser.gypi13
9 files changed, 234 insertions, 2 deletions
diff --git a/chrome/android/java/TabLoadStatus.template b/chrome/android/java/TabLoadStatus.template
new file mode 100644
index 0000000..e004489
--- /dev/null
+++ b/chrome/android/java/TabLoadStatus.template
@@ -0,0 +1,11 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser;
+
+public class TabLoadStatus {
+#define DEFINE_TAB_LOAD_STATUS(name,value) \
+ public static final int name = value;
+#include "chrome/browser/android/tab_load_status.h"
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java
index adbfcf6..ec4ab95 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java
@@ -18,6 +18,9 @@ public class EmptyTabObserver implements TabObserver {
public void onContentChanged(Tab tab) { }
@Override
+ public void onLoadUrl(Tab tab, String url, int loadType) { }
+
+ @Override
public void onFaviconUpdated(Tab tab) { }
@Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/Tab.java
index 637f30a..c205b29 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/Tab.java
@@ -13,6 +13,7 @@ import android.view.View;
import org.chromium.base.CalledByNative;
import org.chromium.base.ObserverList;
+import org.chromium.base.TraceEvent;
import org.chromium.chrome.browser.banners.AppBannerManager;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItemDelegate;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
@@ -27,6 +28,7 @@ import org.chromium.chrome.browser.ui.toolbar.ToolbarModelSecurityLevel;
import org.chromium.content.browser.ContentView;
import org.chromium.content.browser.ContentViewClient;
import org.chromium.content.browser.ContentViewCore;
+import org.chromium.content.browser.LoadUrlParams;
import org.chromium.content.browser.NavigationClient;
import org.chromium.content.browser.NavigationHistory;
import org.chromium.content.browser.PageInfo;
@@ -343,6 +345,39 @@ public class Tab implements NavigationClient {
}
/**
+ * Causes this tab to navigate to the specified URL.
+ * @param params parameters describing the url load. Note that it is important to set correct
+ * page transition as it is used for ranking URLs in the history so the omnibox
+ * can report suggestions correctly.
+ * @return FULL_PRERENDERED_PAGE_LOAD or PARTIAL_PRERENDERED_PAGE_LOAD if the page has been
+ * prerendered. DEFAULT_PAGE_LOAD if it had not.
+ */
+ public int loadUrl(LoadUrlParams params) {
+ TraceEvent.begin();
+
+ // We load the URL from the tab rather than directly from the ContentView so the tab has a
+ // chance of using a prerenderer page is any.
+ int loadType = nativeLoadUrl(
+ mNativeTabAndroid,
+ params.getUrl(),
+ params.getVerbatimHeaders(),
+ params.getPostData(),
+ params.getTransitionType(),
+ params.getReferrer() != null ? params.getReferrer().getUrl() : null,
+ // Policy will be ignored for null referrer url, 0 is just a placeholder.
+ // TODO(ppi): Should we pass Referrer jobject and add JNI methods to read it from
+ // the native?
+ params.getReferrer() != null ? params.getReferrer().getPolicy() : 0);
+
+ TraceEvent.end();
+
+ for (TabObserver observer : mObservers) {
+ observer.onLoadUrl(this, params.getUrl(), loadType);
+ }
+ return loadType;
+ }
+
+ /**
* @return Whether or not the {@link Tab} is currently showing an interstitial page, such as
* a bad HTTPS page.
*/
@@ -975,6 +1010,8 @@ public class Tab implements NavigationClient {
private native void nativeDestroyWebContents(long nativeTabAndroid, boolean deleteNative);
private native WebContents nativeGetWebContents(long nativeTabAndroid);
private native Profile nativeGetProfileAndroid(long nativeTabAndroid);
+ private native int nativeLoadUrl(long nativeTabAndroid, String url, String extraHeaders,
+ byte[] postData, int transition, String referrerUrl, int referrerPolicy);
private native int nativeGetSecurityLevel(long nativeTabAndroid);
private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url,
String title);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java
index ad96d03..f8df8e6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java
@@ -26,6 +26,19 @@ public interface TabObserver {
void onContentChanged(Tab tab);
/**
+ * Called when loadUrl is triggered on a a {@link Tab}.
+ * @param tab The notifying {@link Tab}.
+ * @param url The url that is being loaded.
+ * @param loadType The type of load that was performed.
+ *
+ * @see TabLoadStatus#PAGE_LOAD_FAILED
+ * @see TabLoadStatus#DEFAULT_PAGE_LOAD
+ * @see TabLoadStatus#PARTIAL_PRERENDERED_PAGE_LOAD
+ * @see TabLoadStatus#FULL_PRERENDERED_PAGE_LOAD
+ */
+ void onLoadUrl(Tab tab, String url, int loadType);
+
+ /**
* Called when the favicon of a {@link Tab} has been updated.
* @param tab The notifying {@link Tab}.
*/
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index 7410dde..cf4f344 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,25 @@ 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()) {
+ return true;
+ }
+ }
+ return false;
+}
+
void TabAndroid::SwapTabContents(content::WebContents* old_contents,
content::WebContents* new_contents,
bool did_start_load,
@@ -343,6 +373,86 @@ 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);
+ }
+ 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 +492,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.
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h
index 821c14c..db02c30 100644
--- a/chrome/browser/android/tab_android.h
+++ b/chrome/browser/android/tab_android.h
@@ -37,9 +37,19 @@ class ContentViewCore;
class WebContents;
}
+namespace prerender {
+class PrerenderManager;
+}
+
class TabAndroid : public CoreTabHelperDelegate,
public content::NotificationObserver {
public:
+ enum TabLoadStatus {
+#define DEFINE_TAB_LOAD_STATUS(name, value) name = value,
+#include "chrome/browser/android/tab_load_status.h"
+#undef DEFINE_TAB_LOAD_STATUS
+ };
+
// Convenience method to retrieve the Tab associated with the passed
// WebContents. Can return NULL.
static TabAndroid* FromWebContents(content::WebContents* web_contents);
@@ -107,8 +117,7 @@ class TabAndroid : public CoreTabHelperDelegate,
// of service and the privacy notice.
virtual bool ShouldWelcomePageLinkToTermsOfService();
- // Register the Tab's native methods through JNI.
- static bool RegisterTabAndroid(JNIEnv* env);
+ bool HasPrerenderedUrl(GURL gurl);
// CoreTabHelperDelegate ----------------------------------------------------
@@ -138,6 +147,14 @@ class TabAndroid : public CoreTabHelperDelegate,
jobject obj);
base::android::ScopedJavaLocalRef<jobject> GetProfileAndroid(JNIEnv* env,
jobject obj);
+ virtual TabLoadStatus 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);
ToolbarModel::SecurityLevel GetSecurityLevel(JNIEnv* env, jobject obj);
void SetActiveNavigationEntryTitleForUrl(JNIEnv* env,
jobject obj,
@@ -145,7 +162,12 @@ class TabAndroid : public CoreTabHelperDelegate,
jstring jtitle);
bool Print(JNIEnv* env, jobject obj);
+ // Register the Tab's native methods through JNI.
+ static bool RegisterTabAndroid(JNIEnv* env);
+
private:
+ prerender::PrerenderManager* GetPrerenderManager() const;
+
JavaObjectWeakGlobalRef weak_java_tab_;
// The identifier used by session restore for this tab.
diff --git a/chrome/browser/android/tab_load_status.h b/chrome/browser/android/tab_load_status.h
new file mode 100644
index 0000000..3707b75
--- /dev/null
+++ b/chrome/browser/android/tab_load_status.h
@@ -0,0 +1,15 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Intentionally no include guards because this file is meant to be included
+// inside a macro to generate enum values.
+
+#ifndef DEFINE_TAB_LOAD_STATUS
+#error "Please define DEFINE_TAB_LOAD_STATUS before including this file."
+#endif
+
+DEFINE_TAB_LOAD_STATUS(PAGE_LOAD_FAILED, 0)
+DEFINE_TAB_LOAD_STATUS(DEFAULT_PAGE_LOAD, 1)
+DEFINE_TAB_LOAD_STATUS(PARTIAL_PRERENDERED_PAGE_LOAD, 2)
+DEFINE_TAB_LOAD_STATUS(FULL_PRERENDERED_PAGE_LOAD, 3)
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index e1aa0cd..7504fcc 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -993,6 +993,7 @@
'profile_sync_service_model_type_selection_java',
'resource_id_java',
'toolbar_model_security_levels_java',
+ 'tab_load_status_java',
'../base/base.gyp:base',
'../components/components.gyp:autofill_java',
'../components/components.gyp:dom_distiller_core_java',
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 62cb6d7..b2bdb9b 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -184,6 +184,7 @@
'browser/android/signin/signin_manager_android.h',
'browser/android/tab_android.cc',
'browser/android/tab_android.h',
+ 'browser/android/tab_load_status.h',
'browser/android/uma_bridge.cc',
'browser/android/uma_bridge.h',
'browser/android/uma_utils.cc',
@@ -3787,6 +3788,18 @@
},
'includes': [ '../build/android/java_cpp_template.gypi' ],
},
+ {
+ 'target_name': 'tab_load_status_java',
+ 'type': 'none',
+ 'sources': [
+ 'android/java/TabLoadStatus.template',
+ ],
+ 'variables': {
+ 'package_name': 'org/chromium/chrome/browser',
+ 'template_deps': ['browser/android/tab_load_status.h'],
+ },
+ 'includes': [ '../build/android/java_cpp_template.gypi' ],
+ },
],
},
],