diff options
author | tedchoc@chromium.org <tedchoc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-07 16:47:33 +0000 |
---|---|---|
committer | tedchoc@chromium.org <tedchoc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-07 16:47:33 +0000 |
commit | 85bd656d3817628cfccb1f0883c1d25dcf644140 (patch) | |
tree | b883273d0b351f4c9e9da465cd7dcecb7bd09b1a /chrome | |
parent | eb2d2abc0efb866baaf15c254713758f04c71b08 (diff) | |
download | chromium_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.template | 11 | ||||
-rw-r--r-- | chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java | 3 | ||||
-rw-r--r-- | chrome/android/java/src/org/chromium/chrome/browser/Tab.java | 37 | ||||
-rw-r--r-- | chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java | 13 | ||||
-rw-r--r-- | chrome/browser/android/tab_android.cc | 117 | ||||
-rw-r--r-- | chrome/browser/android/tab_android.h | 26 | ||||
-rw-r--r-- | chrome/browser/android/tab_load_status.h | 15 | ||||
-rw-r--r-- | chrome/chrome.gyp | 1 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 13 |
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, ¶ms)) { + 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' ], + }, ], }, ], |