blob: 2d89750ea55fee14d8470ab973341548ec17200c [file] [log] [blame]
[email protected]155c7f22013-12-09 17:07:181// Copyright 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 "content/browser/frame_host/navigation_controller_android.h"
6
avib7348942015-12-25 20:57:107#include <stdint.h>
8
[email protected]155c7f22013-12-09 17:07:189#include "base/android/jni_android.h"
ajith.v4502cc62014-09-05 17:41:3910#include "base/android/jni_string.h"
aelias5252baa2016-04-10 01:18:0211#include "content/browser/frame_host/navigation_controller_impl.h"
ajith.v4502cc62014-09-05 17:41:3912#include "content/browser/frame_host/navigation_entry_impl.h"
13#include "content/public/browser/browser_context.h"
ajith.v4502cc62014-09-05 17:41:3914#include "content/public/browser/ssl_host_state_delegate.h"
lukasza477a5a22016-06-16 18:28:4315#include "content/public/common/resource_request_body.h"
[email protected]155c7f22013-12-09 17:07:1816#include "jni/NavigationControllerImpl_jni.h"
mnaganovbf087422015-12-16 05:10:0317#include "net/base/data_url.h"
ajith.v4502cc62014-09-05 17:41:3918#include "ui/gfx/android/java_bitmap.h"
[email protected]155c7f22013-12-09 17:07:1819
20using base::android::AttachCurrentThread;
ajith.v4502cc62014-09-05 17:41:3921using base::android::ConvertJavaStringToUTF16;
22using base::android::ConvertJavaStringToUTF8;
23using base::android::ConvertUTF16ToJavaString;
24using base::android::ConvertUTF8ToJavaString;
torne86560112016-08-04 15:59:0425using base::android::JavaParamRef;
26using base::android::ScopedJavaLocalRef;
ajith.v4502cc62014-09-05 17:41:3927namespace {
28
29// static
dtrainorb316e9272014-09-19 23:30:5530static base::android::ScopedJavaLocalRef<jobject> CreateJavaNavigationEntry(
31 JNIEnv* env,
32 content::NavigationEntry* entry,
33 int index) {
34 DCHECK(entry);
35
ajith.v4502cc62014-09-05 17:41:3936 // Get the details of the current entry
37 ScopedJavaLocalRef<jstring> j_url(
38 ConvertUTF8ToJavaString(env, entry->GetURL().spec()));
39 ScopedJavaLocalRef<jstring> j_virtual_url(
40 ConvertUTF8ToJavaString(env, entry->GetVirtualURL().spec()));
41 ScopedJavaLocalRef<jstring> j_original_url(
42 ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec()));
43 ScopedJavaLocalRef<jstring> j_title(
44 ConvertUTF16ToJavaString(env, entry->GetTitle()));
45 ScopedJavaLocalRef<jobject> j_bitmap;
46 const content::FaviconStatus& status = entry->GetFavicon();
47 if (status.valid && status.image.ToSkBitmap()->getSize() > 0)
48 j_bitmap = gfx::ConvertToJavaBitmap(status.image.ToSkBitmap());
49
dtrainorb316e9272014-09-19 23:30:5550 return content::Java_NavigationControllerImpl_createNavigationEntry(
ajith.v4502cc62014-09-05 17:41:3951 env,
ajith.v4502cc62014-09-05 17:41:3952 index,
53 j_url.obj(),
54 j_virtual_url.obj(),
55 j_original_url.obj(),
56 j_title.obj(),
mnaganov7a3234c2015-03-23 21:28:5957 j_bitmap.obj(),
58 entry->GetTransitionType());
ajith.v4502cc62014-09-05 17:41:3959}
60
dtrainorb316e9272014-09-19 23:30:5561static void AddNavigationEntryToHistory(JNIEnv* env,
62 jobject history,
63 content::NavigationEntry* entry,
64 int index) {
65 content::Java_NavigationControllerImpl_addToNavigationHistory(
66 env,
67 history,
68 CreateJavaNavigationEntry(env, entry, index).obj());
69}
70
ajith.v4502cc62014-09-05 17:41:3971} // namespace
[email protected]155c7f22013-12-09 17:07:1872
73namespace content {
74
75// static
76bool NavigationControllerAndroid::Register(JNIEnv* env) {
77 return RegisterNativesImpl(env);
78}
79
80NavigationControllerAndroid::NavigationControllerAndroid(
aelias5252baa2016-04-10 01:18:0281 NavigationControllerImpl* navigation_controller)
[email protected]155c7f22013-12-09 17:07:1882 : navigation_controller_(navigation_controller) {
83 JNIEnv* env = AttachCurrentThread();
84 obj_.Reset(env,
85 Java_NavigationControllerImpl_create(
86 env, reinterpret_cast<intptr_t>(this)).obj());
87}
88
89NavigationControllerAndroid::~NavigationControllerAndroid() {
90 Java_NavigationControllerImpl_destroy(AttachCurrentThread(), obj_.obj());
91}
92
93base::android::ScopedJavaLocalRef<jobject>
94NavigationControllerAndroid::GetJavaObject() {
95 return base::android::ScopedJavaLocalRef<jobject>(obj_);
96}
97
tornee1bfee92015-12-01 14:05:0198jboolean NavigationControllerAndroid::CanGoBack(
99 JNIEnv* env,
100 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18101 return navigation_controller_->CanGoBack();
102}
103
tornee1bfee92015-12-01 14:05:01104jboolean NavigationControllerAndroid::CanGoForward(
105 JNIEnv* env,
106 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18107 return navigation_controller_->CanGoForward();
108}
109
tornee1bfee92015-12-01 14:05:01110jboolean NavigationControllerAndroid::CanGoToOffset(
111 JNIEnv* env,
112 const JavaParamRef<jobject>& obj,
113 jint offset) {
[email protected]155c7f22013-12-09 17:07:18114 return navigation_controller_->CanGoToOffset(offset);
115}
116
tornee1bfee92015-12-01 14:05:01117void NavigationControllerAndroid::GoBack(JNIEnv* env,
118 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18119 navigation_controller_->GoBack();
120}
121
tornee1bfee92015-12-01 14:05:01122void NavigationControllerAndroid::GoForward(JNIEnv* env,
123 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18124 navigation_controller_->GoForward();
125}
126
127void NavigationControllerAndroid::GoToOffset(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01128 const JavaParamRef<jobject>& obj,
[email protected]155c7f22013-12-09 17:07:18129 jint offset) {
130 navigation_controller_->GoToOffset(offset);
131}
132
tornee1bfee92015-12-01 14:05:01133jboolean NavigationControllerAndroid::IsInitialNavigation(
134 JNIEnv* env,
135 const JavaParamRef<jobject>& obj) {
dfalcantara0d314d522015-01-05 22:56:43136 return navigation_controller_->IsInitialNavigation();
137}
138
tornee1bfee92015-12-01 14:05:01139void NavigationControllerAndroid::LoadIfNecessary(
140 JNIEnv* env,
141 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29142 navigation_controller_->LoadIfNecessary();
143}
144
tornee1bfee92015-12-01 14:05:01145void NavigationControllerAndroid::ContinuePendingReload(
146 JNIEnv* env,
147 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29148 navigation_controller_->ContinuePendingReload();
149}
150
151void NavigationControllerAndroid::Reload(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01152 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29153 jboolean check_for_repost) {
154 navigation_controller_->Reload(check_for_repost);
155}
156
kinuko1be5023c2015-12-16 02:31:57157void NavigationControllerAndroid::ReloadToRefreshContent(
158 JNIEnv* env,
159 jobject obj,
160 jboolean check_for_repost) {
161 navigation_controller_->ReloadToRefreshContent(check_for_repost);
162}
163
toyoshim7dad4b1182016-04-01 14:28:05164void NavigationControllerAndroid::ReloadBypassingCache(
[email protected]6d3f32f2014-07-08 08:23:29165 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01166 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29167 jboolean check_for_repost) {
toyoshim7dad4b1182016-04-01 14:28:05168 navigation_controller_->ReloadBypassingCache(check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29169}
170
megjablon39a903082015-10-26 23:36:29171void NavigationControllerAndroid::ReloadDisableLoFi(
172 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01173 const JavaParamRef<jobject>& obj,
megjablon39a903082015-10-26 23:36:29174 jboolean check_for_repost) {
175 navigation_controller_->ReloadDisableLoFi(check_for_repost);
176}
177
tornee1bfee92015-12-01 14:05:01178void NavigationControllerAndroid::RequestRestoreLoad(
179 JNIEnv* env,
180 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29181 navigation_controller_->SetNeedsReload();
182}
183
tornee1bfee92015-12-01 14:05:01184void NavigationControllerAndroid::CancelPendingReload(
185 JNIEnv* env,
186 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29187 navigation_controller_->CancelPendingReload();
188}
189
tornee1bfee92015-12-01 14:05:01190void NavigationControllerAndroid::GoToNavigationIndex(
191 JNIEnv* env,
192 const JavaParamRef<jobject>& obj,
193 jint index) {
[email protected]155c7f22013-12-09 17:07:18194 navigation_controller_->GoToIndex(index);
195}
196
lizebe8adeb82015-08-20 12:18:10197void NavigationControllerAndroid::LoadUrl(
198 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01199 const JavaParamRef<jobject>& obj,
200 const JavaParamRef<jstring>& url,
lizebe8adeb82015-08-20 12:18:10201 jint load_url_type,
202 jint transition_type,
tornee1bfee92015-12-01 14:05:01203 const JavaParamRef<jstring>& j_referrer_url,
lizebe8adeb82015-08-20 12:18:10204 jint referrer_policy,
205 jint ua_override_option,
tornee1bfee92015-12-01 14:05:01206 const JavaParamRef<jstring>& extra_headers,
lukasza477a5a22016-06-16 18:28:43207 const JavaParamRef<jobject>& j_post_data,
tornee1bfee92015-12-01 14:05:01208 const JavaParamRef<jstring>& base_url_for_data_url,
209 const JavaParamRef<jstring>& virtual_url_for_data_url,
mnaganovbf087422015-12-16 05:10:03210 const JavaParamRef<jstring>& data_url_as_string,
lizebe8adeb82015-08-20 12:18:10211 jboolean can_load_local_resources,
212 jboolean is_renderer_initiated,
213 jboolean should_replace_current_entry) {
ajith.v4502cc62014-09-05 17:41:39214 DCHECK(url);
215 NavigationController::LoadURLParams params(
216 GURL(ConvertJavaStringToUTF8(env, url)));
217
218 params.load_type =
219 static_cast<NavigationController::LoadURLType>(load_url_type);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35220 params.transition_type = ui::PageTransitionFromInt(transition_type);
ajith.v4502cc62014-09-05 17:41:39221 params.override_user_agent =
222 static_cast<NavigationController::UserAgentOverrideOption>(
223 ua_override_option);
224 params.can_load_local_resources = can_load_local_resources;
225 params.is_renderer_initiated = is_renderer_initiated;
lizebe8adeb82015-08-20 12:18:10226 params.should_replace_current_entry = should_replace_current_entry;
ajith.v4502cc62014-09-05 17:41:39227
228 if (extra_headers)
229 params.extra_headers = ConvertJavaStringToUTF8(env, extra_headers);
230
lukasza477a5a22016-06-16 18:28:43231 params.post_data = ResourceRequestBody::FromJavaObject(env, j_post_data);
ajith.v4502cc62014-09-05 17:41:39232
233 if (base_url_for_data_url) {
234 params.base_url_for_data_url =
235 GURL(ConvertJavaStringToUTF8(env, base_url_for_data_url));
236 }
237
238 if (virtual_url_for_data_url) {
239 params.virtual_url_for_data_url =
240 GURL(ConvertJavaStringToUTF8(env, virtual_url_for_data_url));
241 }
242
mnaganovbf087422015-12-16 05:10:03243 if (data_url_as_string) {
244 // Treat |data_url_as_string| as if we were intending to put it into a GURL
245 // field. Note that kMaxURLChars is only enforced when serializing URLs
246 // for IPC.
247 GURL data_url = GURL(ConvertJavaStringToUTF8(env, data_url_as_string));
248 DCHECK(data_url.SchemeIs(url::kDataScheme));
249 DCHECK(params.url.SchemeIs(url::kDataScheme));
250#if DCHECK_IS_ON()
251 {
252 std::string mime_type, charset, data;
253 DCHECK(net::DataURL::Parse(params.url, &mime_type, &charset, &data));
254 DCHECK(data.empty());
255 }
256#endif
257 std::string s = data_url.spec();
258 params.data_url_as_string = base::RefCountedString::TakeString(&s);
259 }
260
ajith.v4502cc62014-09-05 17:41:39261 if (j_referrer_url) {
262 params.referrer = content::Referrer(
263 GURL(ConvertJavaStringToUTF8(env, j_referrer_url)),
264 static_cast<blink::WebReferrerPolicy>(referrer_policy));
265 }
266
267 navigation_controller_->LoadURLWithParams(params);
268}
269
tornee1bfee92015-12-01 14:05:01270void NavigationControllerAndroid::ClearHistory(
271 JNIEnv* env,
272 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39273 // TODO(creis): Do callers of this need to know if it fails?
274 if (navigation_controller_->CanPruneAllButLastCommitted())
275 navigation_controller_->PruneAllButLastCommitted();
276}
277
tornee1bfee92015-12-01 14:05:01278jint NavigationControllerAndroid::GetNavigationHistory(
279 JNIEnv* env,
280 const JavaParamRef<jobject>& obj,
281 const JavaParamRef<jobject>& history) {
ajith.v4502cc62014-09-05 17:41:39282 // Iterate through navigation entries to populate the list
283 int count = navigation_controller_->GetEntryCount();
284 for (int i = 0; i < count; ++i) {
285 AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55286 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39287 }
288
289 return navigation_controller_->GetCurrentEntryIndex();
290}
291
292void NavigationControllerAndroid::GetDirectedNavigationHistory(
293 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01294 const JavaParamRef<jobject>& obj,
295 const JavaParamRef<jobject>& history,
ajith.v4502cc62014-09-05 17:41:39296 jboolean is_forward,
297 jint max_entries) {
298 // Iterate through navigation entries to populate the list
299 int count = navigation_controller_->GetEntryCount();
300 int num_added = 0;
301 int increment_value = is_forward ? 1 : -1;
302 for (int i = navigation_controller_->GetCurrentEntryIndex() + increment_value;
303 i >= 0 && i < count;
304 i += increment_value) {
305 if (num_added >= max_entries)
306 break;
307
308 AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55309 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39310 num_added++;
311 }
312}
313
314ScopedJavaLocalRef<jstring>
315NavigationControllerAndroid::GetOriginalUrlForVisibleNavigationEntry(
316 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01317 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39318 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
319 if (entry == NULL)
320 return ScopedJavaLocalRef<jstring>(env, NULL);
321 return ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec());
322}
323
tornee1bfee92015-12-01 14:05:01324void NavigationControllerAndroid::ClearSslPreferences(
325 JNIEnv* env,
326 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39327 content::SSLHostStateDelegate* delegate =
328 navigation_controller_->GetBrowserContext()->GetSSLHostStateDelegate();
329 if (delegate)
330 delegate->Clear();
331}
332
tornee1bfee92015-12-01 14:05:01333bool NavigationControllerAndroid::GetUseDesktopUserAgent(
334 JNIEnv* env,
335 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39336 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
337 return entry && entry->GetIsOverridingUserAgent();
338}
339
340void NavigationControllerAndroid::SetUseDesktopUserAgent(
341 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01342 const JavaParamRef<jobject>& obj,
ajith.v4502cc62014-09-05 17:41:39343 jboolean enabled,
344 jboolean reload_on_state_change) {
345 if (GetUseDesktopUserAgent(env, obj) == enabled)
346 return;
347
348 // Make sure the navigation entry actually exists.
349 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
350 if (!entry)
351 return;
352
353 // Set the flag in the NavigationEntry.
354 entry->SetIsOverridingUserAgent(enabled);
aelias5252baa2016-04-10 01:18:02355 navigation_controller_->delegate()->UpdateOverridingUserAgent();
ajith.v4502cc62014-09-05 17:41:39356
357 // Send the override to the renderer.
358 if (reload_on_state_change) {
359 // Reloading the page will send the override down as part of the
360 // navigation IPC message.
361 navigation_controller_->ReloadOriginalRequestURL(false);
362 }
363}
364
dtrainorb316e9272014-09-19 23:30:55365base::android::ScopedJavaLocalRef<jobject>
dfalcantaraf5d7ff812015-01-16 22:58:03366NavigationControllerAndroid::GetEntryAtIndex(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01367 const JavaParamRef<jobject>& obj,
dfalcantaraf5d7ff812015-01-16 22:58:03368 int index) {
369 if (index < 0 || index >= navigation_controller_->GetEntryCount())
370 return base::android::ScopedJavaLocalRef<jobject>();
371
372 content::NavigationEntry* entry =
373 navigation_controller_->GetEntryAtIndex(index);
374 return CreateJavaNavigationEntry(env, entry, index);
375}
376
377base::android::ScopedJavaLocalRef<jobject>
tornee1bfee92015-12-01 14:05:01378NavigationControllerAndroid::GetPendingEntry(JNIEnv* env,
379 const JavaParamRef<jobject>& obj) {
dtrainorb316e9272014-09-19 23:30:55380 content::NavigationEntry* entry = navigation_controller_->GetPendingEntry();
381
382 if (!entry)
383 return base::android::ScopedJavaLocalRef<jobject>();
384
385 return CreateJavaNavigationEntry(
386 env, entry, navigation_controller_->GetPendingEntryIndex());
387}
388
tornee1bfee92015-12-01 14:05:01389jint NavigationControllerAndroid::GetLastCommittedEntryIndex(
390 JNIEnv* env,
391 const JavaParamRef<jobject>& obj) {
jaekyun45bc8c52014-11-03 01:00:21392 return navigation_controller_->GetLastCommittedEntryIndex();
393}
394
tornee1bfee92015-12-01 14:05:01395jboolean NavigationControllerAndroid::RemoveEntryAtIndex(
396 JNIEnv* env,
397 const JavaParamRef<jobject>& obj,
398 jint index) {
jaekyun45bc8c52014-11-03 01:00:21399 return navigation_controller_->RemoveEntryAtIndex(index);
400}
401
tornee1bfee92015-12-01 14:05:01402jboolean NavigationControllerAndroid::CanCopyStateOver(
403 JNIEnv* env,
404 const JavaParamRef<jobject>& obj) {
aruslanb47a7a32015-06-04 03:11:08405 return navigation_controller_->GetEntryCount() == 0 &&
406 !navigation_controller_->GetPendingEntry();
407}
408
tornee1bfee92015-12-01 14:05:01409jboolean NavigationControllerAndroid::CanPruneAllButLastCommitted(
410 JNIEnv* env,
411 const JavaParamRef<jobject>& obj) {
aruslanb47a7a32015-06-04 03:11:08412 return navigation_controller_->CanPruneAllButLastCommitted();
413}
414
415void NavigationControllerAndroid::CopyStateFrom(
416 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01417 const JavaParamRef<jobject>& obj,
aruslanb47a7a32015-06-04 03:11:08418 jlong source_navigation_controller_android) {
419 navigation_controller_->CopyStateFrom(
420 *(reinterpret_cast<NavigationControllerAndroid*>(
421 source_navigation_controller_android)->navigation_controller_));
422}
423
424void NavigationControllerAndroid::CopyStateFromAndPrune(
425 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01426 const JavaParamRef<jobject>& obj,
aruslanb47a7a32015-06-04 03:11:08427 jlong source_navigation_controller_android,
428 jboolean replace_entry) {
429 navigation_controller_->CopyStateFromAndPrune(
430 reinterpret_cast<NavigationControllerAndroid*>(
431 source_navigation_controller_android)->navigation_controller_,
432 replace_entry);
433}
434
[email protected]155c7f22013-12-09 17:07:18435} // namespace content