blob: 448ee7e1abe8c497154f02f316eefe06f5d4bf58 [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"
msrameke7da2982016-09-07 09:58:0811#include "base/callback.h"
Scott Violetf4eec902019-04-04 21:20:3412#include "base/containers/flat_map.h"
mvanouwerkerk5b1519e2016-09-27 15:47:4613#include "base/strings/string16.h"
aelias5252baa2016-04-10 01:18:0214#include "content/browser/frame_host/navigation_controller_impl.h"
ajith.v4502cc62014-09-05 17:41:3915#include "content/browser/frame_host/navigation_entry_impl.h"
16#include "content/public/browser/browser_context.h"
ajith.v4502cc62014-09-05 17:41:3917#include "content/public/browser/ssl_host_state_delegate.h"
John Abd-El-Maleka59411632018-01-10 20:08:2818#include "content/public/common/resource_request_body_android.h"
[email protected]155c7f22013-12-09 17:07:1819#include "jni/NavigationControllerImpl_jni.h"
mnaganovbf087422015-12-16 05:10:0320#include "net/base/data_url.h"
ajith.v4502cc62014-09-05 17:41:3921#include "ui/gfx/android/java_bitmap.h"
[email protected]155c7f22013-12-09 17:07:1822
23using base::android::AttachCurrentThread;
ajith.v4502cc62014-09-05 17:41:3924using base::android::ConvertJavaStringToUTF16;
25using base::android::ConvertJavaStringToUTF8;
26using base::android::ConvertUTF16ToJavaString;
27using base::android::ConvertUTF8ToJavaString;
torne86560112016-08-04 15:59:0428using base::android::JavaParamRef;
torne660061cd2016-09-07 17:47:5429using base::android::JavaRef;
torne86560112016-08-04 15:59:0430using base::android::ScopedJavaLocalRef;
torne660061cd2016-09-07 17:47:5431
ajith.v4502cc62014-09-05 17:41:3932namespace {
33
Scott Violetf4eec902019-04-04 21:20:3434const char kMapDataKey[] = "map_data_key";
35
ajith.v4502cc62014-09-05 17:41:3936// static
Daniel Bratell7aacf952017-11-21 17:51:2537static base::android::ScopedJavaLocalRef<jobject>
38JNI_NavigationControllerImpl_CreateJavaNavigationEntry(
dtrainorb316e9272014-09-19 23:30:5539 JNIEnv* env,
40 content::NavigationEntry* entry,
41 int index) {
42 DCHECK(entry);
43
ajith.v4502cc62014-09-05 17:41:3944 // Get the details of the current entry
45 ScopedJavaLocalRef<jstring> j_url(
46 ConvertUTF8ToJavaString(env, entry->GetURL().spec()));
47 ScopedJavaLocalRef<jstring> j_virtual_url(
48 ConvertUTF8ToJavaString(env, entry->GetVirtualURL().spec()));
49 ScopedJavaLocalRef<jstring> j_original_url(
50 ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec()));
51 ScopedJavaLocalRef<jstring> j_title(
52 ConvertUTF16ToJavaString(env, entry->GetTitle()));
Brandon Wylie7844e1b2018-08-22 20:32:2053 ScopedJavaLocalRef<jstring> j_referrer_url(
54 ConvertUTF8ToJavaString(env, entry->GetReferrer().url.spec()));
ajith.v4502cc62014-09-05 17:41:3955 ScopedJavaLocalRef<jobject> j_bitmap;
56 const content::FaviconStatus& status = entry->GetFavicon();
Mike Reed8eac88c42017-10-12 21:24:3857 if (status.valid && status.image.ToSkBitmap()->computeByteSize() > 0)
ajith.v4502cc62014-09-05 17:41:3958 j_bitmap = gfx::ConvertToJavaBitmap(status.image.ToSkBitmap());
Jeffrey Cohen23f8cd772019-03-19 17:17:2859 jlong j_timestamp = entry->GetTimestamp().ToJavaTime();
ajith.v4502cc62014-09-05 17:41:3960
dtrainorb316e9272014-09-19 23:30:5561 return content::Java_NavigationControllerImpl_createNavigationEntry(
Brandon Wylie7844e1b2018-08-22 20:32:2062 env, index, j_url, j_virtual_url, j_original_url, j_referrer_url, j_title,
Jeffrey Cohen23f8cd772019-03-19 17:17:2863 j_bitmap, entry->GetTransitionType(), j_timestamp);
ajith.v4502cc62014-09-05 17:41:3964}
65
Daniel Bratell7aacf952017-11-21 17:51:2566static void JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
67 JNIEnv* env,
68 const JavaRef<jobject>& history,
69 content::NavigationEntry* entry,
70 int index) {
dtrainorb316e9272014-09-19 23:30:5571 content::Java_NavigationControllerImpl_addToNavigationHistory(
Daniel Bratell7aacf952017-11-21 17:51:2572 env, history,
73 JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
74 index));
dtrainorb316e9272014-09-19 23:30:5575}
76
Scott Violetf4eec902019-04-04 21:20:3477class MapData : public base::SupportsUserData::Data {
78 public:
79 MapData() = default;
80 ~MapData() override = default;
81
82 static MapData* Get(content::NavigationEntry* entry) {
83 MapData* map_data = static_cast<MapData*>(entry->GetUserData(kMapDataKey));
84 if (map_data)
85 return map_data;
86 auto map_data_ptr = std::make_unique<MapData>();
87 map_data = map_data_ptr.get();
88 entry->SetUserData(kMapDataKey, std::move(map_data_ptr));
89 return map_data;
90 }
91
92 base::flat_map<std::string, base::string16>& map() { return map_; }
93
94 // base::SupportsUserData::Data:
95 std::unique_ptr<Data> Clone() override {
96 std::unique_ptr<MapData> clone = std::make_unique<MapData>();
97 clone->map_ = map_;
98 return clone;
99 }
100
101 private:
102 base::flat_map<std::string, base::string16> map_;
103
104 DISALLOW_COPY_AND_ASSIGN(MapData);
105};
106
ajith.v4502cc62014-09-05 17:41:39107} // namespace
[email protected]155c7f22013-12-09 17:07:18108
109namespace content {
110
[email protected]155c7f22013-12-09 17:07:18111NavigationControllerAndroid::NavigationControllerAndroid(
aelias5252baa2016-04-10 01:18:02112 NavigationControllerImpl* navigation_controller)
[email protected]155c7f22013-12-09 17:07:18113 : navigation_controller_(navigation_controller) {
114 JNIEnv* env = AttachCurrentThread();
115 obj_.Reset(env,
116 Java_NavigationControllerImpl_create(
117 env, reinterpret_cast<intptr_t>(this)).obj());
118}
119
120NavigationControllerAndroid::~NavigationControllerAndroid() {
torne948f3662016-08-16 15:10:44121 Java_NavigationControllerImpl_destroy(AttachCurrentThread(), obj_);
[email protected]155c7f22013-12-09 17:07:18122}
123
124base::android::ScopedJavaLocalRef<jobject>
125NavigationControllerAndroid::GetJavaObject() {
126 return base::android::ScopedJavaLocalRef<jobject>(obj_);
127}
128
tornee1bfee92015-12-01 14:05:01129jboolean NavigationControllerAndroid::CanGoBack(
130 JNIEnv* env,
131 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18132 return navigation_controller_->CanGoBack();
133}
134
tornee1bfee92015-12-01 14:05:01135jboolean NavigationControllerAndroid::CanGoForward(
136 JNIEnv* env,
137 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18138 return navigation_controller_->CanGoForward();
139}
140
tornee1bfee92015-12-01 14:05:01141jboolean NavigationControllerAndroid::CanGoToOffset(
142 JNIEnv* env,
143 const JavaParamRef<jobject>& obj,
144 jint offset) {
[email protected]155c7f22013-12-09 17:07:18145 return navigation_controller_->CanGoToOffset(offset);
146}
147
tornee1bfee92015-12-01 14:05:01148void NavigationControllerAndroid::GoBack(JNIEnv* env,
149 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18150 navigation_controller_->GoBack();
151}
152
tornee1bfee92015-12-01 14:05:01153void NavigationControllerAndroid::GoForward(JNIEnv* env,
154 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18155 navigation_controller_->GoForward();
156}
157
158void NavigationControllerAndroid::GoToOffset(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01159 const JavaParamRef<jobject>& obj,
[email protected]155c7f22013-12-09 17:07:18160 jint offset) {
161 navigation_controller_->GoToOffset(offset);
162}
163
tornee1bfee92015-12-01 14:05:01164jboolean NavigationControllerAndroid::IsInitialNavigation(
165 JNIEnv* env,
166 const JavaParamRef<jobject>& obj) {
dfalcantara0d314d522015-01-05 22:56:43167 return navigation_controller_->IsInitialNavigation();
168}
169
tornee1bfee92015-12-01 14:05:01170void NavigationControllerAndroid::LoadIfNecessary(
171 JNIEnv* env,
172 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29173 navigation_controller_->LoadIfNecessary();
174}
175
tornee1bfee92015-12-01 14:05:01176void NavigationControllerAndroid::ContinuePendingReload(
177 JNIEnv* env,
178 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29179 navigation_controller_->ContinuePendingReload();
180}
181
182void NavigationControllerAndroid::Reload(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01183 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29184 jboolean check_for_repost) {
toyoshim6142d96f2016-12-19 09:07:25185 navigation_controller_->Reload(ReloadType::NORMAL, check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29186}
187
toyoshim7dad4b1182016-04-01 14:28:05188void NavigationControllerAndroid::ReloadBypassingCache(
[email protected]6d3f32f2014-07-08 08:23:29189 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01190 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29191 jboolean check_for_repost) {
toyoshim6142d96f2016-12-19 09:07:25192 navigation_controller_->Reload(ReloadType::BYPASSING_CACHE, check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29193}
194
Matthew Carye7da4b12018-05-02 16:14:16195jboolean NavigationControllerAndroid::NeedsReload(
196 JNIEnv* env,
197 const JavaParamRef<jobject>& obj) {
198 return navigation_controller_->NeedsReload();
199}
200
201void NavigationControllerAndroid::SetNeedsReload(
tornee1bfee92015-12-01 14:05:01202 JNIEnv* env,
203 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29204 navigation_controller_->SetNeedsReload();
205}
206
tornee1bfee92015-12-01 14:05:01207void NavigationControllerAndroid::CancelPendingReload(
208 JNIEnv* env,
209 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29210 navigation_controller_->CancelPendingReload();
211}
212
tornee1bfee92015-12-01 14:05:01213void NavigationControllerAndroid::GoToNavigationIndex(
214 JNIEnv* env,
215 const JavaParamRef<jobject>& obj,
216 jint index) {
[email protected]155c7f22013-12-09 17:07:18217 navigation_controller_->GoToIndex(index);
218}
219
lizebe8adeb82015-08-20 12:18:10220void NavigationControllerAndroid::LoadUrl(
221 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01222 const JavaParamRef<jobject>& obj,
223 const JavaParamRef<jstring>& url,
lizebe8adeb82015-08-20 12:18:10224 jint load_url_type,
225 jint transition_type,
tornee1bfee92015-12-01 14:05:01226 const JavaParamRef<jstring>& j_referrer_url,
lizebe8adeb82015-08-20 12:18:10227 jint referrer_policy,
228 jint ua_override_option,
tornee1bfee92015-12-01 14:05:01229 const JavaParamRef<jstring>& extra_headers,
lukasza477a5a22016-06-16 18:28:43230 const JavaParamRef<jobject>& j_post_data,
tornee1bfee92015-12-01 14:05:01231 const JavaParamRef<jstring>& base_url_for_data_url,
232 const JavaParamRef<jstring>& virtual_url_for_data_url,
mnaganovbf087422015-12-16 05:10:03233 const JavaParamRef<jstring>& data_url_as_string,
lizebe8adeb82015-08-20 12:18:10234 jboolean can_load_local_resources,
235 jboolean is_renderer_initiated,
236 jboolean should_replace_current_entry) {
ajith.v4502cc62014-09-05 17:41:39237 DCHECK(url);
238 NavigationController::LoadURLParams params(
239 GURL(ConvertJavaStringToUTF8(env, url)));
240
241 params.load_type =
242 static_cast<NavigationController::LoadURLType>(load_url_type);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35243 params.transition_type = ui::PageTransitionFromInt(transition_type);
ajith.v4502cc62014-09-05 17:41:39244 params.override_user_agent =
245 static_cast<NavigationController::UserAgentOverrideOption>(
246 ua_override_option);
247 params.can_load_local_resources = can_load_local_resources;
248 params.is_renderer_initiated = is_renderer_initiated;
lizebe8adeb82015-08-20 12:18:10249 params.should_replace_current_entry = should_replace_current_entry;
ajith.v4502cc62014-09-05 17:41:39250
251 if (extra_headers)
252 params.extra_headers = ConvertJavaStringToUTF8(env, extra_headers);
253
John Abd-El-Maleka59411632018-01-10 20:08:28254 params.post_data = ExtractResourceRequestBodyFromJavaObject(env, j_post_data);
ajith.v4502cc62014-09-05 17:41:39255
256 if (base_url_for_data_url) {
257 params.base_url_for_data_url =
258 GURL(ConvertJavaStringToUTF8(env, base_url_for_data_url));
259 }
260
261 if (virtual_url_for_data_url) {
262 params.virtual_url_for_data_url =
263 GURL(ConvertJavaStringToUTF8(env, virtual_url_for_data_url));
264 }
265
mnaganovbf087422015-12-16 05:10:03266 if (data_url_as_string) {
Daniel Chengef9f4b72017-10-18 08:56:17267 // Treat |data_url_as_string| as if we were intending to put it into a GURL
268 // field. Note that kMaxURLChars is only enforced when serializing URLs
269 // for IPC.
270 GURL data_url = GURL(ConvertJavaStringToUTF8(env, data_url_as_string));
271 DCHECK(data_url.SchemeIs(url::kDataScheme));
mnaganovbf087422015-12-16 05:10:03272 DCHECK(params.url.SchemeIs(url::kDataScheme));
273#if DCHECK_IS_ON()
274 {
275 std::string mime_type, charset, data;
276 DCHECK(net::DataURL::Parse(params.url, &mime_type, &charset, &data));
277 DCHECK(data.empty());
278 }
Daniel Chengef9f4b72017-10-18 08:56:17279#endif
280 std::string s = data_url.spec();
281 params.data_url_as_string = base::RefCountedString::TakeString(&s);
mnaganovbf087422015-12-16 05:10:03282 }
283
ajith.v4502cc62014-09-05 17:41:39284 if (j_referrer_url) {
285 params.referrer = content::Referrer(
286 GURL(ConvertJavaStringToUTF8(env, j_referrer_url)),
Richard Li49fe04d2018-10-21 09:07:19287 static_cast<network::mojom::ReferrerPolicy>(referrer_policy));
ajith.v4502cc62014-09-05 17:41:39288 }
289
290 navigation_controller_->LoadURLWithParams(params);
291}
292
tornee1bfee92015-12-01 14:05:01293void NavigationControllerAndroid::ClearHistory(
294 JNIEnv* env,
295 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39296 // TODO(creis): Do callers of this need to know if it fails?
297 if (navigation_controller_->CanPruneAllButLastCommitted())
298 navigation_controller_->PruneAllButLastCommitted();
299}
300
tornee1bfee92015-12-01 14:05:01301jint NavigationControllerAndroid::GetNavigationHistory(
302 JNIEnv* env,
303 const JavaParamRef<jobject>& obj,
304 const JavaParamRef<jobject>& history) {
ajith.v4502cc62014-09-05 17:41:39305 // Iterate through navigation entries to populate the list
306 int count = navigation_controller_->GetEntryCount();
307 for (int i = 0; i < count; ++i) {
Daniel Bratell7aacf952017-11-21 17:51:25308 JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55309 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39310 }
311
312 return navigation_controller_->GetCurrentEntryIndex();
313}
314
315void NavigationControllerAndroid::GetDirectedNavigationHistory(
316 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01317 const JavaParamRef<jobject>& obj,
318 const JavaParamRef<jobject>& history,
ajith.v4502cc62014-09-05 17:41:39319 jboolean is_forward,
320 jint max_entries) {
321 // Iterate through navigation entries to populate the list
322 int count = navigation_controller_->GetEntryCount();
323 int num_added = 0;
324 int increment_value = is_forward ? 1 : -1;
325 for (int i = navigation_controller_->GetCurrentEntryIndex() + increment_value;
326 i >= 0 && i < count;
327 i += increment_value) {
328 if (num_added >= max_entries)
329 break;
330
Daniel Bratell7aacf952017-11-21 17:51:25331 JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55332 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39333 num_added++;
334 }
335}
336
tornee1bfee92015-12-01 14:05:01337void NavigationControllerAndroid::ClearSslPreferences(
338 JNIEnv* env,
339 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39340 content::SSLHostStateDelegate* delegate =
341 navigation_controller_->GetBrowserContext()->GetSSLHostStateDelegate();
342 if (delegate)
msrameke7da2982016-09-07 09:58:08343 delegate->Clear(base::Callback<bool(const std::string&)>());
ajith.v4502cc62014-09-05 17:41:39344}
345
tornee1bfee92015-12-01 14:05:01346bool NavigationControllerAndroid::GetUseDesktopUserAgent(
347 JNIEnv* env,
348 const JavaParamRef<jobject>& obj) {
Mohamed Abdelhalim676259c2019-06-18 07:27:54349 NavigationEntry* entry = navigation_controller_->GetLastCommittedEntry();
ajith.v4502cc62014-09-05 17:41:39350 return entry && entry->GetIsOverridingUserAgent();
351}
352
353void NavigationControllerAndroid::SetUseDesktopUserAgent(
354 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01355 const JavaParamRef<jobject>& obj,
ajith.v4502cc62014-09-05 17:41:39356 jboolean enabled,
357 jboolean reload_on_state_change) {
358 if (GetUseDesktopUserAgent(env, obj) == enabled)
359 return;
360
361 // Make sure the navigation entry actually exists.
Mohamed Abdelhalim676259c2019-06-18 07:27:54362 NavigationEntry* entry = navigation_controller_->GetLastCommittedEntry();
ajith.v4502cc62014-09-05 17:41:39363 if (!entry)
364 return;
365
366 // Set the flag in the NavigationEntry.
367 entry->SetIsOverridingUserAgent(enabled);
aelias5252baa2016-04-10 01:18:02368 navigation_controller_->delegate()->UpdateOverridingUserAgent();
ajith.v4502cc62014-09-05 17:41:39369
370 // Send the override to the renderer.
371 if (reload_on_state_change) {
372 // Reloading the page will send the override down as part of the
373 // navigation IPC message.
yoichio4f7be0c2016-12-20 08:27:10374 navigation_controller_->Reload(ReloadType::ORIGINAL_REQUEST_URL, true);
ajith.v4502cc62014-09-05 17:41:39375 }
376}
377
dtrainorb316e9272014-09-19 23:30:55378base::android::ScopedJavaLocalRef<jobject>
dfalcantaraf5d7ff812015-01-16 22:58:03379NavigationControllerAndroid::GetEntryAtIndex(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01380 const JavaParamRef<jobject>& obj,
dfalcantaraf5d7ff812015-01-16 22:58:03381 int index) {
382 if (index < 0 || index >= navigation_controller_->GetEntryCount())
383 return base::android::ScopedJavaLocalRef<jobject>();
384
385 content::NavigationEntry* entry =
386 navigation_controller_->GetEntryAtIndex(index);
Daniel Bratell7aacf952017-11-21 17:51:25387 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
388 index);
dfalcantaraf5d7ff812015-01-16 22:58:03389}
390
391base::android::ScopedJavaLocalRef<jobject>
Ted Chocaa84a512019-04-23 19:15:40392NavigationControllerAndroid::GetVisibleEntry(JNIEnv* env,
393 const JavaParamRef<jobject>& obj) {
394 content::NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
395
396 if (!entry)
397 return base::android::ScopedJavaLocalRef<jobject>();
398
399 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
400 /*index=*/-1);
401}
402
403base::android::ScopedJavaLocalRef<jobject>
tornee1bfee92015-12-01 14:05:01404NavigationControllerAndroid::GetPendingEntry(JNIEnv* env,
405 const JavaParamRef<jobject>& obj) {
dtrainorb316e9272014-09-19 23:30:55406 content::NavigationEntry* entry = navigation_controller_->GetPendingEntry();
407
408 if (!entry)
409 return base::android::ScopedJavaLocalRef<jobject>();
410
Daniel Bratell7aacf952017-11-21 17:51:25411 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(
dtrainorb316e9272014-09-19 23:30:55412 env, entry, navigation_controller_->GetPendingEntryIndex());
413}
414
tornee1bfee92015-12-01 14:05:01415jint NavigationControllerAndroid::GetLastCommittedEntryIndex(
416 JNIEnv* env,
417 const JavaParamRef<jobject>& obj) {
jaekyun45bc8c52014-11-03 01:00:21418 return navigation_controller_->GetLastCommittedEntryIndex();
419}
420
tornee1bfee92015-12-01 14:05:01421jboolean NavigationControllerAndroid::RemoveEntryAtIndex(
422 JNIEnv* env,
423 const JavaParamRef<jobject>& obj,
424 jint index) {
jaekyun45bc8c52014-11-03 01:00:21425 return navigation_controller_->RemoveEntryAtIndex(index);
426}
427
mvanouwerkerk5b1519e2016-09-27 15:47:46428ScopedJavaLocalRef<jstring> NavigationControllerAndroid::GetEntryExtraData(
429 JNIEnv* env,
430 const JavaParamRef<jobject>& obj,
431 jint index,
432 const JavaParamRef<jstring>& jkey) {
433 if (index < 0 || index >= navigation_controller_->GetEntryCount())
434 return ScopedJavaLocalRef<jstring>();
435
436 std::string key = base::android::ConvertJavaStringToUTF8(env, jkey);
Scott Violetf4eec902019-04-04 21:20:34437 MapData* map_data =
438 MapData::Get(navigation_controller_->GetEntryAtIndex(index));
439 auto iter = map_data->map().find(key);
440 return ConvertUTF16ToJavaString(
441 env, iter == map_data->map().end() ? base::string16() : iter->second);
mvanouwerkerk5b1519e2016-09-27 15:47:46442}
443
444void NavigationControllerAndroid::SetEntryExtraData(
445 JNIEnv* env,
446 const JavaParamRef<jobject>& obj,
447 jint index,
448 const JavaParamRef<jstring>& jkey,
449 const JavaParamRef<jstring>& jvalue) {
450 if (index < 0 || index >= navigation_controller_->GetEntryCount())
451 return;
452
453 std::string key = base::android::ConvertJavaStringToUTF8(env, jkey);
454 base::string16 value = base::android::ConvertJavaStringToUTF16(env, jvalue);
Scott Violetf4eec902019-04-04 21:20:34455 MapData* map_data =
456 MapData::Get(navigation_controller_->GetEntryAtIndex(index));
457 map_data->map()[key] = value;
mvanouwerkerk5b1519e2016-09-27 15:47:46458}
459
Shivani Sharmaa5637cf2019-02-13 17:20:48460jboolean NavigationControllerAndroid::IsEntryMarkedToBeSkipped(
461 JNIEnv* env,
462 const base::android::JavaParamRef<jobject>& obj,
463 jint index) {
464 return navigation_controller_->IsEntryMarkedToBeSkipped(index);
465}
466
[email protected]155c7f22013-12-09 17:07:18467} // namespace content