blob: aa634064b095ec3d2b99934aacf30a2b2c035470 [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
danakjc492bf82020-09-09 20:02:445#include "content/browser/renderer_host/navigation_controller_android.h"
[email protected]155c7f22013-12-09 17:07:186
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"
Gabriel Charette9f60dd12020-03-06 20:48:0411#include "base/bind_helpers.h"
msrameke7da2982016-09-07 09:58:0812#include "base/callback.h"
Scott Violetf4eec902019-04-04 21:20:3413#include "base/containers/flat_map.h"
mvanouwerkerk5b1519e2016-09-27 15:47:4614#include "base/strings/string16.h"
danakjc492bf82020-09-09 20:02:4415#include "content/browser/renderer_host/navigation_controller_impl.h"
16#include "content/browser/renderer_host/navigation_entry_impl.h"
Mohamed Heikalc09e1012019-06-21 14:47:2617#include "content/public/android/content_jni_headers/NavigationControllerImpl_jni.h"
ajith.v4502cc62014-09-05 17:41:3918#include "content/public/browser/browser_context.h"
ajith.v4502cc62014-09-05 17:41:3919#include "content/public/browser/ssl_host_state_delegate.h"
Lukasz Anforowicza192eb952019-10-15 19:22:2220#include "content/public/common/referrer.h"
John Abd-El-Maleka59411632018-01-10 20:08:2821#include "content/public/common/resource_request_body_android.h"
mnaganovbf087422015-12-16 05:10:0322#include "net/base/data_url.h"
ajith.v4502cc62014-09-05 17:41:3923#include "ui/gfx/android/java_bitmap.h"
[email protected]155c7f22013-12-09 17:07:1824
25using base::android::AttachCurrentThread;
ajith.v4502cc62014-09-05 17:41:3926using base::android::ConvertJavaStringToUTF16;
27using base::android::ConvertJavaStringToUTF8;
28using base::android::ConvertUTF16ToJavaString;
29using base::android::ConvertUTF8ToJavaString;
torne86560112016-08-04 15:59:0430using base::android::JavaParamRef;
torne660061cd2016-09-07 17:47:5431using base::android::JavaRef;
torne86560112016-08-04 15:59:0432using base::android::ScopedJavaLocalRef;
torne660061cd2016-09-07 17:47:5433
ajith.v4502cc62014-09-05 17:41:3934namespace {
35
Scott Violetf4eec902019-04-04 21:20:3436const char kMapDataKey[] = "map_data_key";
37
ajith.v4502cc62014-09-05 17:41:3938// static
Daniel Bratell7aacf952017-11-21 17:51:2539static base::android::ScopedJavaLocalRef<jobject>
40JNI_NavigationControllerImpl_CreateJavaNavigationEntry(
dtrainorb316e9272014-09-19 23:30:5541 JNIEnv* env,
42 content::NavigationEntry* entry,
43 int index) {
44 DCHECK(entry);
45
ajith.v4502cc62014-09-05 17:41:3946 // Get the details of the current entry
47 ScopedJavaLocalRef<jstring> j_url(
48 ConvertUTF8ToJavaString(env, entry->GetURL().spec()));
49 ScopedJavaLocalRef<jstring> j_virtual_url(
50 ConvertUTF8ToJavaString(env, entry->GetVirtualURL().spec()));
51 ScopedJavaLocalRef<jstring> j_original_url(
52 ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec()));
53 ScopedJavaLocalRef<jstring> j_title(
54 ConvertUTF16ToJavaString(env, entry->GetTitle()));
Brandon Wylie7844e1b2018-08-22 20:32:2055 ScopedJavaLocalRef<jstring> j_referrer_url(
56 ConvertUTF8ToJavaString(env, entry->GetReferrer().url.spec()));
ajith.v4502cc62014-09-05 17:41:3957 ScopedJavaLocalRef<jobject> j_bitmap;
58 const content::FaviconStatus& status = entry->GetFavicon();
Rulong Chen(陈汝龙)61e3cc822020-08-29 03:29:2559 if (status.valid && status.image.ToSkBitmap()->computeByteSize() > 0) {
60 j_bitmap = gfx::ConvertToJavaBitmap(status.image.ToSkBitmap(),
61 gfx::OomBehavior::kReturnNullOnOom);
62 }
Jeffrey Cohen23f8cd772019-03-19 17:17:2863 jlong j_timestamp = entry->GetTimestamp().ToJavaTime();
ajith.v4502cc62014-09-05 17:41:3964
dtrainorb316e9272014-09-19 23:30:5565 return content::Java_NavigationControllerImpl_createNavigationEntry(
Brandon Wylie7844e1b2018-08-22 20:32:2066 env, index, j_url, j_virtual_url, j_original_url, j_referrer_url, j_title,
Jeffrey Cohen23f8cd772019-03-19 17:17:2867 j_bitmap, entry->GetTransitionType(), j_timestamp);
ajith.v4502cc62014-09-05 17:41:3968}
69
Daniel Bratell7aacf952017-11-21 17:51:2570static void JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
71 JNIEnv* env,
72 const JavaRef<jobject>& history,
73 content::NavigationEntry* entry,
74 int index) {
dtrainorb316e9272014-09-19 23:30:5575 content::Java_NavigationControllerImpl_addToNavigationHistory(
Daniel Bratell7aacf952017-11-21 17:51:2576 env, history,
77 JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
78 index));
dtrainorb316e9272014-09-19 23:30:5579}
80
Scott Violetf4eec902019-04-04 21:20:3481class MapData : public base::SupportsUserData::Data {
82 public:
83 MapData() = default;
84 ~MapData() override = default;
85
86 static MapData* Get(content::NavigationEntry* entry) {
87 MapData* map_data = static_cast<MapData*>(entry->GetUserData(kMapDataKey));
88 if (map_data)
89 return map_data;
90 auto map_data_ptr = std::make_unique<MapData>();
91 map_data = map_data_ptr.get();
92 entry->SetUserData(kMapDataKey, std::move(map_data_ptr));
93 return map_data;
94 }
95
96 base::flat_map<std::string, base::string16>& map() { return map_; }
97
98 // base::SupportsUserData::Data:
99 std::unique_ptr<Data> Clone() override {
100 std::unique_ptr<MapData> clone = std::make_unique<MapData>();
101 clone->map_ = map_;
102 return clone;
103 }
104
105 private:
106 base::flat_map<std::string, base::string16> map_;
107
108 DISALLOW_COPY_AND_ASSIGN(MapData);
109};
110
ajith.v4502cc62014-09-05 17:41:39111} // namespace
[email protected]155c7f22013-12-09 17:07:18112
113namespace content {
114
[email protected]155c7f22013-12-09 17:07:18115NavigationControllerAndroid::NavigationControllerAndroid(
aelias5252baa2016-04-10 01:18:02116 NavigationControllerImpl* navigation_controller)
[email protected]155c7f22013-12-09 17:07:18117 : navigation_controller_(navigation_controller) {
118 JNIEnv* env = AttachCurrentThread();
Aran Gilman37d11632019-10-08 23:07:15119 obj_.Reset(env, Java_NavigationControllerImpl_create(
120 env, reinterpret_cast<intptr_t>(this))
121 .obj());
[email protected]155c7f22013-12-09 17:07:18122}
123
124NavigationControllerAndroid::~NavigationControllerAndroid() {
torne948f3662016-08-16 15:10:44125 Java_NavigationControllerImpl_destroy(AttachCurrentThread(), obj_);
[email protected]155c7f22013-12-09 17:07:18126}
127
128base::android::ScopedJavaLocalRef<jobject>
129NavigationControllerAndroid::GetJavaObject() {
130 return base::android::ScopedJavaLocalRef<jobject>(obj_);
131}
132
tornee1bfee92015-12-01 14:05:01133jboolean NavigationControllerAndroid::CanGoBack(
134 JNIEnv* env,
135 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18136 return navigation_controller_->CanGoBack();
137}
138
tornee1bfee92015-12-01 14:05:01139jboolean NavigationControllerAndroid::CanGoForward(
140 JNIEnv* env,
141 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18142 return navigation_controller_->CanGoForward();
143}
144
tornee1bfee92015-12-01 14:05:01145jboolean NavigationControllerAndroid::CanGoToOffset(
146 JNIEnv* env,
147 const JavaParamRef<jobject>& obj,
148 jint offset) {
[email protected]155c7f22013-12-09 17:07:18149 return navigation_controller_->CanGoToOffset(offset);
150}
151
tornee1bfee92015-12-01 14:05:01152void NavigationControllerAndroid::GoBack(JNIEnv* env,
153 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18154 navigation_controller_->GoBack();
155}
156
tornee1bfee92015-12-01 14:05:01157void NavigationControllerAndroid::GoForward(JNIEnv* env,
158 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18159 navigation_controller_->GoForward();
160}
161
162void NavigationControllerAndroid::GoToOffset(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01163 const JavaParamRef<jobject>& obj,
[email protected]155c7f22013-12-09 17:07:18164 jint offset) {
165 navigation_controller_->GoToOffset(offset);
166}
167
tornee1bfee92015-12-01 14:05:01168jboolean NavigationControllerAndroid::IsInitialNavigation(
169 JNIEnv* env,
170 const JavaParamRef<jobject>& obj) {
dfalcantara0d314d522015-01-05 22:56:43171 return navigation_controller_->IsInitialNavigation();
172}
173
tornee1bfee92015-12-01 14:05:01174void NavigationControllerAndroid::LoadIfNecessary(
175 JNIEnv* env,
176 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29177 navigation_controller_->LoadIfNecessary();
178}
179
tornee1bfee92015-12-01 14:05:01180void NavigationControllerAndroid::ContinuePendingReload(
181 JNIEnv* env,
182 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29183 navigation_controller_->ContinuePendingReload();
184}
185
186void NavigationControllerAndroid::Reload(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01187 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29188 jboolean check_for_repost) {
toyoshim6142d96f2016-12-19 09:07:25189 navigation_controller_->Reload(ReloadType::NORMAL, check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29190}
191
toyoshim7dad4b1182016-04-01 14:28:05192void NavigationControllerAndroid::ReloadBypassingCache(
[email protected]6d3f32f2014-07-08 08:23:29193 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01194 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29195 jboolean check_for_repost) {
toyoshim6142d96f2016-12-19 09:07:25196 navigation_controller_->Reload(ReloadType::BYPASSING_CACHE, check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29197}
198
Matthew Carye7da4b12018-05-02 16:14:16199jboolean NavigationControllerAndroid::NeedsReload(
200 JNIEnv* env,
201 const JavaParamRef<jobject>& obj) {
202 return navigation_controller_->NeedsReload();
203}
204
205void NavigationControllerAndroid::SetNeedsReload(
tornee1bfee92015-12-01 14:05:01206 JNIEnv* env,
207 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29208 navigation_controller_->SetNeedsReload();
209}
210
tornee1bfee92015-12-01 14:05:01211void NavigationControllerAndroid::CancelPendingReload(
212 JNIEnv* env,
213 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29214 navigation_controller_->CancelPendingReload();
215}
216
tornee1bfee92015-12-01 14:05:01217void NavigationControllerAndroid::GoToNavigationIndex(
218 JNIEnv* env,
219 const JavaParamRef<jobject>& obj,
220 jint index) {
[email protected]155c7f22013-12-09 17:07:18221 navigation_controller_->GoToIndex(index);
222}
223
lizebe8adeb82015-08-20 12:18:10224void NavigationControllerAndroid::LoadUrl(
225 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01226 const JavaParamRef<jobject>& obj,
227 const JavaParamRef<jstring>& url,
lizebe8adeb82015-08-20 12:18:10228 jint load_url_type,
229 jint transition_type,
tornee1bfee92015-12-01 14:05:01230 const JavaParamRef<jstring>& j_referrer_url,
lizebe8adeb82015-08-20 12:18:10231 jint referrer_policy,
232 jint ua_override_option,
tornee1bfee92015-12-01 14:05:01233 const JavaParamRef<jstring>& extra_headers,
lukasza477a5a22016-06-16 18:28:43234 const JavaParamRef<jobject>& j_post_data,
tornee1bfee92015-12-01 14:05:01235 const JavaParamRef<jstring>& base_url_for_data_url,
236 const JavaParamRef<jstring>& virtual_url_for_data_url,
mnaganovbf087422015-12-16 05:10:03237 const JavaParamRef<jstring>& data_url_as_string,
lizebe8adeb82015-08-20 12:18:10238 jboolean can_load_local_resources,
239 jboolean is_renderer_initiated,
240 jboolean should_replace_current_entry) {
ajith.v4502cc62014-09-05 17:41:39241 DCHECK(url);
242 NavigationController::LoadURLParams params(
243 GURL(ConvertJavaStringToUTF8(env, url)));
244
245 params.load_type =
246 static_cast<NavigationController::LoadURLType>(load_url_type);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35247 params.transition_type = ui::PageTransitionFromInt(transition_type);
ajith.v4502cc62014-09-05 17:41:39248 params.override_user_agent =
249 static_cast<NavigationController::UserAgentOverrideOption>(
250 ua_override_option);
251 params.can_load_local_resources = can_load_local_resources;
252 params.is_renderer_initiated = is_renderer_initiated;
lizebe8adeb82015-08-20 12:18:10253 params.should_replace_current_entry = should_replace_current_entry;
ajith.v4502cc62014-09-05 17:41:39254
255 if (extra_headers)
256 params.extra_headers = ConvertJavaStringToUTF8(env, extra_headers);
257
John Abd-El-Maleka59411632018-01-10 20:08:28258 params.post_data = ExtractResourceRequestBodyFromJavaObject(env, j_post_data);
ajith.v4502cc62014-09-05 17:41:39259
260 if (base_url_for_data_url) {
261 params.base_url_for_data_url =
262 GURL(ConvertJavaStringToUTF8(env, base_url_for_data_url));
263 }
264
265 if (virtual_url_for_data_url) {
266 params.virtual_url_for_data_url =
267 GURL(ConvertJavaStringToUTF8(env, virtual_url_for_data_url));
268 }
269
mnaganovbf087422015-12-16 05:10:03270 if (data_url_as_string) {
Daniel Chengef9f4b72017-10-18 08:56:17271 // Treat |data_url_as_string| as if we were intending to put it into a GURL
272 // field. Note that kMaxURLChars is only enforced when serializing URLs
273 // for IPC.
274 GURL data_url = GURL(ConvertJavaStringToUTF8(env, data_url_as_string));
275 DCHECK(data_url.SchemeIs(url::kDataScheme));
mnaganovbf087422015-12-16 05:10:03276 DCHECK(params.url.SchemeIs(url::kDataScheme));
277#if DCHECK_IS_ON()
278 {
279 std::string mime_type, charset, data;
280 DCHECK(net::DataURL::Parse(params.url, &mime_type, &charset, &data));
281 DCHECK(data.empty());
282 }
Daniel Chengef9f4b72017-10-18 08:56:17283#endif
284 std::string s = data_url.spec();
285 params.data_url_as_string = base::RefCountedString::TakeString(&s);
mnaganovbf087422015-12-16 05:10:03286 }
287
ajith.v4502cc62014-09-05 17:41:39288 if (j_referrer_url) {
Lukasz Anforowicza192eb952019-10-15 19:22:22289 params.referrer =
290 Referrer(GURL(ConvertJavaStringToUTF8(env, j_referrer_url)),
291 Referrer::ConvertToPolicy(referrer_policy));
ajith.v4502cc62014-09-05 17:41:39292 }
293
294 navigation_controller_->LoadURLWithParams(params);
295}
296
tornee1bfee92015-12-01 14:05:01297void NavigationControllerAndroid::ClearHistory(
298 JNIEnv* env,
299 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39300 // TODO(creis): Do callers of this need to know if it fails?
301 if (navigation_controller_->CanPruneAllButLastCommitted())
302 navigation_controller_->PruneAllButLastCommitted();
303}
304
tornee1bfee92015-12-01 14:05:01305jint NavigationControllerAndroid::GetNavigationHistory(
306 JNIEnv* env,
307 const JavaParamRef<jobject>& obj,
308 const JavaParamRef<jobject>& history) {
ajith.v4502cc62014-09-05 17:41:39309 // Iterate through navigation entries to populate the list
310 int count = navigation_controller_->GetEntryCount();
311 for (int i = 0; i < count; ++i) {
Daniel Bratell7aacf952017-11-21 17:51:25312 JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55313 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39314 }
315
316 return navigation_controller_->GetCurrentEntryIndex();
317}
318
319void NavigationControllerAndroid::GetDirectedNavigationHistory(
320 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01321 const JavaParamRef<jobject>& obj,
322 const JavaParamRef<jobject>& history,
ajith.v4502cc62014-09-05 17:41:39323 jboolean is_forward,
324 jint max_entries) {
325 // Iterate through navigation entries to populate the list
326 int count = navigation_controller_->GetEntryCount();
327 int num_added = 0;
328 int increment_value = is_forward ? 1 : -1;
329 for (int i = navigation_controller_->GetCurrentEntryIndex() + increment_value;
Aran Gilman37d11632019-10-08 23:07:15330 i >= 0 && i < count; i += increment_value) {
ajith.v4502cc62014-09-05 17:41:39331 if (num_added >= max_entries)
332 break;
333
Daniel Bratell7aacf952017-11-21 17:51:25334 JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55335 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39336 num_added++;
337 }
338}
339
tornee1bfee92015-12-01 14:05:01340void NavigationControllerAndroid::ClearSslPreferences(
341 JNIEnv* env,
342 const JavaParamRef<jobject>& obj) {
Lukasz Anforowicza192eb952019-10-15 19:22:22343 SSLHostStateDelegate* delegate =
ajith.v4502cc62014-09-05 17:41:39344 navigation_controller_->GetBrowserContext()->GetSSLHostStateDelegate();
345 if (delegate)
danakj1606c572019-11-27 22:34:03346 delegate->Clear(base::NullCallback());
ajith.v4502cc62014-09-05 17:41:39347}
348
tornee1bfee92015-12-01 14:05:01349bool NavigationControllerAndroid::GetUseDesktopUserAgent(
350 JNIEnv* env,
351 const JavaParamRef<jobject>& obj) {
Mohamed Abdelhalim676259c2019-06-18 07:27:54352 NavigationEntry* entry = navigation_controller_->GetLastCommittedEntry();
ajith.v4502cc62014-09-05 17:41:39353 return entry && entry->GetIsOverridingUserAgent();
354}
355
356void NavigationControllerAndroid::SetUseDesktopUserAgent(
357 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01358 const JavaParamRef<jobject>& obj,
ajith.v4502cc62014-09-05 17:41:39359 jboolean enabled,
360 jboolean reload_on_state_change) {
361 if (GetUseDesktopUserAgent(env, obj) == enabled)
362 return;
363
364 // Make sure the navigation entry actually exists.
Mohamed Abdelhalim676259c2019-06-18 07:27:54365 NavigationEntry* entry = navigation_controller_->GetLastCommittedEntry();
ajith.v4502cc62014-09-05 17:41:39366 if (!entry)
367 return;
368
369 // Set the flag in the NavigationEntry.
370 entry->SetIsOverridingUserAgent(enabled);
aelias5252baa2016-04-10 01:18:02371 navigation_controller_->delegate()->UpdateOverridingUserAgent();
ajith.v4502cc62014-09-05 17:41:39372
373 // Send the override to the renderer.
374 if (reload_on_state_change) {
375 // Reloading the page will send the override down as part of the
376 // navigation IPC message.
yoichio4f7be0c2016-12-20 08:27:10377 navigation_controller_->Reload(ReloadType::ORIGINAL_REQUEST_URL, true);
ajith.v4502cc62014-09-05 17:41:39378 }
379}
380
dtrainorb316e9272014-09-19 23:30:55381base::android::ScopedJavaLocalRef<jobject>
dfalcantaraf5d7ff812015-01-16 22:58:03382NavigationControllerAndroid::GetEntryAtIndex(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01383 const JavaParamRef<jobject>& obj,
dfalcantaraf5d7ff812015-01-16 22:58:03384 int index) {
385 if (index < 0 || index >= navigation_controller_->GetEntryCount())
386 return base::android::ScopedJavaLocalRef<jobject>();
387
Lukasz Anforowicza192eb952019-10-15 19:22:22388 NavigationEntry* entry = navigation_controller_->GetEntryAtIndex(index);
Daniel Bratell7aacf952017-11-21 17:51:25389 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
390 index);
dfalcantaraf5d7ff812015-01-16 22:58:03391}
392
393base::android::ScopedJavaLocalRef<jobject>
Ted Chocaa84a512019-04-23 19:15:40394NavigationControllerAndroid::GetVisibleEntry(JNIEnv* env,
395 const JavaParamRef<jobject>& obj) {
Lukasz Anforowicza192eb952019-10-15 19:22:22396 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
Ted Chocaa84a512019-04-23 19:15:40397
398 if (!entry)
399 return base::android::ScopedJavaLocalRef<jobject>();
400
401 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
402 /*index=*/-1);
403}
404
405base::android::ScopedJavaLocalRef<jobject>
tornee1bfee92015-12-01 14:05:01406NavigationControllerAndroid::GetPendingEntry(JNIEnv* env,
407 const JavaParamRef<jobject>& obj) {
Lukasz Anforowicza192eb952019-10-15 19:22:22408 NavigationEntry* entry = navigation_controller_->GetPendingEntry();
dtrainorb316e9272014-09-19 23:30:55409
410 if (!entry)
411 return base::android::ScopedJavaLocalRef<jobject>();
412
Daniel Bratell7aacf952017-11-21 17:51:25413 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(
dtrainorb316e9272014-09-19 23:30:55414 env, entry, navigation_controller_->GetPendingEntryIndex());
415}
416
tornee1bfee92015-12-01 14:05:01417jint NavigationControllerAndroid::GetLastCommittedEntryIndex(
418 JNIEnv* env,
419 const JavaParamRef<jobject>& obj) {
jaekyun45bc8c52014-11-03 01:00:21420 return navigation_controller_->GetLastCommittedEntryIndex();
421}
422
tornee1bfee92015-12-01 14:05:01423jboolean NavigationControllerAndroid::RemoveEntryAtIndex(
424 JNIEnv* env,
425 const JavaParamRef<jobject>& obj,
426 jint index) {
jaekyun45bc8c52014-11-03 01:00:21427 return navigation_controller_->RemoveEntryAtIndex(index);
428}
429
Michael Thiessen9b14d512019-09-23 21:19:47430void NavigationControllerAndroid::PruneForwardEntries(
431 JNIEnv* env,
432 const JavaParamRef<jobject>& obj) {
433 return navigation_controller_->PruneForwardEntries();
434}
435
mvanouwerkerk5b1519e2016-09-27 15:47:46436ScopedJavaLocalRef<jstring> NavigationControllerAndroid::GetEntryExtraData(
437 JNIEnv* env,
438 const JavaParamRef<jobject>& obj,
439 jint index,
440 const JavaParamRef<jstring>& jkey) {
441 if (index < 0 || index >= navigation_controller_->GetEntryCount())
442 return ScopedJavaLocalRef<jstring>();
443
444 std::string key = base::android::ConvertJavaStringToUTF8(env, jkey);
Scott Violetf4eec902019-04-04 21:20:34445 MapData* map_data =
446 MapData::Get(navigation_controller_->GetEntryAtIndex(index));
447 auto iter = map_data->map().find(key);
448 return ConvertUTF16ToJavaString(
449 env, iter == map_data->map().end() ? base::string16() : iter->second);
mvanouwerkerk5b1519e2016-09-27 15:47:46450}
451
452void NavigationControllerAndroid::SetEntryExtraData(
453 JNIEnv* env,
454 const JavaParamRef<jobject>& obj,
455 jint index,
456 const JavaParamRef<jstring>& jkey,
457 const JavaParamRef<jstring>& jvalue) {
458 if (index < 0 || index >= navigation_controller_->GetEntryCount())
459 return;
460
461 std::string key = base::android::ConvertJavaStringToUTF8(env, jkey);
462 base::string16 value = base::android::ConvertJavaStringToUTF16(env, jvalue);
Scott Violetf4eec902019-04-04 21:20:34463 MapData* map_data =
464 MapData::Get(navigation_controller_->GetEntryAtIndex(index));
465 map_data->map()[key] = value;
mvanouwerkerk5b1519e2016-09-27 15:47:46466}
467
Shivani Sharmaa5637cf2019-02-13 17:20:48468jboolean NavigationControllerAndroid::IsEntryMarkedToBeSkipped(
469 JNIEnv* env,
470 const base::android::JavaParamRef<jobject>& obj,
471 jint index) {
472 return navigation_controller_->IsEntryMarkedToBeSkipped(index);
473}
474
[email protected]155c7f22013-12-09 17:07:18475} // namespace content