Chromium Code Reviews| 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, ¶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); |
|
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. |