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

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

Issue 45693002: Add ExternalPrerenderRequestHandler and related API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Styling fixes and added other API Created 7 years, 2 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/external_prerender_request_handler.cc
diff --git a/chrome/browser/android/external_prerender_request_handler.cc b/chrome/browser/android/external_prerender_request_handler.cc
new file mode 100644
index 0000000000000000000000000000000000000000..cd6b9a73d85ede2cf511bb3b1b0165195bebbd53
--- /dev/null
+++ b/chrome/browser/android/external_prerender_request_handler.cc
@@ -0,0 +1,123 @@
+// Copyright (c) 2013 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.
+
+#include "chrome/browser/android/external_prerender_request_handler.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/prerender/prerender_handle.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "content/public/browser/web_contents.h"
+
+#include "jni/ExternalPrerenderRequestHandler_jni.h"
+
+using base::android::ConvertJavaStringToUTF16;
+
+namespace prerender {
+
+int ExternalPrerenderRequestHandler::AddPrerender(JNIEnv* env,
+ jobject obj,
+ jobject jprofile,
+ jstring jurl,
+ jstring jreferrer,
+ jint width,
+ jint height) {
+ Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
+
+ GURL url = GURL(ConvertJavaStringToUTF16(env, jurl));
+ if (!url.is_valid())
+ return 0;
+
+ GURL referrer_url = GURL(ConvertJavaStringToUTF16(env, jreferrer));
+ content::Referrer referrer = referrer_url.is_valid() ?
+ content::Referrer(referrer_url, WebKit::WebReferrerPolicyDefault) :
+ content::Referrer();
+
+ PrerenderManager* prerender_manager =
+ prerender::PrerenderManagerFactory::GetForProfile(profile);
cbentzel 2013/10/30 14:40:33 Note: It's possible for PrerenderManager to be NUL
Yusuf 2013/10/31 00:44:18 Done.
+ content::WebContents* web_contents =
+ content::WebContents::Create(content::WebContents::CreateParams(profile));
cbentzel 2013/10/30 14:40:33 So is this going to always create a new tab/webcon
Yusuf 2013/10/31 00:44:18 Done.
+ if (prerender_handle_.get()) {
+ prerender_handle_->OnNavigateAway();
+ // The PrerenderHandle is now owned by the PrerenderManager.
+ ignore_result(prerender_handle_.release());
cbentzel 2013/10/30 14:40:33 TODO(cbentzel): Understand this.
cbentzel 2013/10/30 14:40:33 TODO(cbentzel): Understand this.
+ }
+ prerender_handle_.reset(
+ prerender_manager->AddPrerenderFromExternalRequest(
+ url,
+ referrer,
+ web_contents->GetController().GetDefaultSessionStorageNamespace(),
+ gfx::Size(width, height)));
+ if (!prerender_handle_)
+ return 0;
+ return reinterpret_cast<jint>(web_contents);
cbentzel 2013/10/30 14:40:33 If you are going this route definitely want reinte
Yusuf 2013/10/31 00:44:18 Done.
+}
+
+void ExternalPrerenderRequestHandler::CancelCurrentPrerender(JNIEnv* env,
+ jobject object) {
+ if(prerender_handle_)
+ prerender_handle_->OnCancel();
+}
+
+// static
+bool ExternalPrerenderRequestHandler::HasPrerenderedUrl(
+ Profile* profile,
+ GURL url,
+ content::WebContents* web_contents) {
+ prerender::PrerenderManager* prerender_manager =
+ prerender::PrerenderManagerFactory::GetForProfile(profile);
cbentzel 2013/10/30 14:40:33 Again - probably good to check for NULL prerender_
+ content::SessionStorageNamespace* session_storage_namespace = web_contents->
+ GetController().GetDefaultSessionStorageNamespace();
+
+ std::vector<content::WebContents*> contents =
cbentzel 2013/10/30 14:40:33 I'm surprised that we don't have a method like thi
Yusuf 2013/10/30 17:28:55 I did check and I agree that it would be nice to h
cbentzel 2013/10/30 18:45:59 Yes.
+ prerender_manager->GetAllPrerenderingContents();
+ for (size_t i = 0; i < contents.size(); ++i) {
+ prerender::PrerenderContents* prerender_contents = prerender_manager->
+ GetPrerenderContents(contents.at(i));
+ if (prerender_contents->Matches(url, session_storage_namespace))
+ return true;
+ }
+ return false;
+}
+
+static jboolean HasPrerenderedUrl(JNIEnv* env,
cbentzel 2013/10/30 14:40:33 Is this being used at all? I didn't see it declare
Yusuf 2013/10/30 17:28:55 Calls with JNIEnv as first argument, jclass as sec
cbentzel 2013/10/30 18:45:59 Thanks for clarifying that.
+ jclass clazz,
+ jobject jprofile,
+ jstring jurl,
+ jint web_contents_ptr) {
+ Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
+ GURL url;
+ if (jurl != NULL)
+ url = GURL(ConvertJavaStringToUTF16(env, jurl));
+ if (!url.is_valid())
+ return false;
+
+ content::WebContents* web_contents =
+ reinterpret_cast<content::WebContents*>(web_contents_ptr);
+ return ExternalPrerenderRequestHandler::HasPrerenderedUrl(
+ profile, url, web_contents);
+}
+
+ExternalPrerenderRequestHandler::ExternalPrerenderRequestHandler() {
+}
+
+static jint Init(JNIEnv* env,
cbentzel 2013/10/30 14:40:33 Is Init being used at all?
Yusuf 2013/10/30 17:28:55 See above. On 2013/10/30 14:40:33, cbentzel wrote
+ jclass clazz) {
+ ExternalPrerenderRequestHandler* external_handler =
+ new ExternalPrerenderRequestHandler();
+ return reinterpret_cast<jint>(external_handler);
+}
+
+bool ExternalPrerenderRequestHandler::RegisterExternalPrerenderRequestHandler(
+ JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace prerender

Powered by Google App Engine
This is Rietveld 408576698