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

Side by Side 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, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/android/external_prerender_request_handler.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/strings/string16.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/prerender/prerender_handle.h"
13 #include "chrome/browser/prerender/prerender_manager.h"
14 #include "chrome/browser/prerender/prerender_manager_factory.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/profiles/profile_android.h"
17 #include "content/public/browser/web_contents.h"
18
19 #include "jni/ExternalPrerenderRequestHandler_jni.h"
20
21 using base::android::ConvertJavaStringToUTF16;
22
23 namespace prerender {
24
25 int ExternalPrerenderRequestHandler::AddPrerender(JNIEnv* env,
26 jobject obj,
27 jobject jprofile,
28 jstring jurl,
29 jstring jreferrer,
30 jint width,
31 jint height) {
32 Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
33
34 GURL url = GURL(ConvertJavaStringToUTF16(env, jurl));
35 if (!url.is_valid())
36 return 0;
37
38 GURL referrer_url = GURL(ConvertJavaStringToUTF16(env, jreferrer));
39 content::Referrer referrer = referrer_url.is_valid() ?
40 content::Referrer(referrer_url, WebKit::WebReferrerPolicyDefault) :
41 content::Referrer();
42
43 PrerenderManager* prerender_manager =
44 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.
45 content::WebContents* web_contents =
46 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.
47 if (prerender_handle_.get()) {
48 prerender_handle_->OnNavigateAway();
49 // The PrerenderHandle is now owned by the PrerenderManager.
50 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.
51 }
52 prerender_handle_.reset(
53 prerender_manager->AddPrerenderFromExternalRequest(
54 url,
55 referrer,
56 web_contents->GetController().GetDefaultSessionStorageNamespace(),
57 gfx::Size(width, height)));
58 if (!prerender_handle_)
59 return 0;
60 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.
61 }
62
63 void ExternalPrerenderRequestHandler::CancelCurrentPrerender(JNIEnv* env,
64 jobject object) {
65 if(prerender_handle_)
66 prerender_handle_->OnCancel();
67 }
68
69 // static
70 bool ExternalPrerenderRequestHandler::HasPrerenderedUrl(
71 Profile* profile,
72 GURL url,
73 content::WebContents* web_contents) {
74 prerender::PrerenderManager* prerender_manager =
75 prerender::PrerenderManagerFactory::GetForProfile(profile);
cbentzel 2013/10/30 14:40:33 Again - probably good to check for NULL prerender_
76 content::SessionStorageNamespace* session_storage_namespace = web_contents->
77 GetController().GetDefaultSessionStorageNamespace();
78
79 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.
80 prerender_manager->GetAllPrerenderingContents();
81 for (size_t i = 0; i < contents.size(); ++i) {
82 prerender::PrerenderContents* prerender_contents = prerender_manager->
83 GetPrerenderContents(contents.at(i));
84 if (prerender_contents->Matches(url, session_storage_namespace))
85 return true;
86 }
87 return false;
88 }
89
90 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.
91 jclass clazz,
92 jobject jprofile,
93 jstring jurl,
94 jint web_contents_ptr) {
95 Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
96 GURL url;
97 if (jurl != NULL)
98 url = GURL(ConvertJavaStringToUTF16(env, jurl));
99 if (!url.is_valid())
100 return false;
101
102 content::WebContents* web_contents =
103 reinterpret_cast<content::WebContents*>(web_contents_ptr);
104 return ExternalPrerenderRequestHandler::HasPrerenderedUrl(
105 profile, url, web_contents);
106 }
107
108 ExternalPrerenderRequestHandler::ExternalPrerenderRequestHandler() {
109 }
110
111 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
112 jclass clazz) {
113 ExternalPrerenderRequestHandler* external_handler =
114 new ExternalPrerenderRequestHandler();
115 return reinterpret_cast<jint>(external_handler);
116 }
117
118 bool ExternalPrerenderRequestHandler::RegisterExternalPrerenderRequestHandler(
119 JNIEnv* env) {
120 return RegisterNativesImpl(env);
121 }
122
123 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698