blob: c016daaaf7c0b2e571c40ca285d4c9ccfd4f72a0 [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"
mvanouwerkerk5b1519e2016-09-27 15:47:4612#include "base/strings/string16.h"
aelias5252baa2016-04-10 01:18:0213#include "content/browser/frame_host/navigation_controller_impl.h"
ajith.v4502cc62014-09-05 17:41:3914#include "content/browser/frame_host/navigation_entry_impl.h"
15#include "content/public/browser/browser_context.h"
ajith.v4502cc62014-09-05 17:41:3916#include "content/public/browser/ssl_host_state_delegate.h"
lukasza477a5a22016-06-16 18:28:4317#include "content/public/common/resource_request_body.h"
[email protected]155c7f22013-12-09 17:07:1818#include "jni/NavigationControllerImpl_jni.h"
mnaganovbf087422015-12-16 05:10:0319#include "net/base/data_url.h"
ajith.v4502cc62014-09-05 17:41:3920#include "ui/gfx/android/java_bitmap.h"
[email protected]155c7f22013-12-09 17:07:1821
22using base::android::AttachCurrentThread;
ajith.v4502cc62014-09-05 17:41:3923using base::android::ConvertJavaStringToUTF16;
24using base::android::ConvertJavaStringToUTF8;
25using base::android::ConvertUTF16ToJavaString;
26using base::android::ConvertUTF8ToJavaString;
torne86560112016-08-04 15:59:0427using base::android::JavaParamRef;
torne660061cd2016-09-07 17:47:5428using base::android::JavaRef;
torne86560112016-08-04 15:59:0429using base::android::ScopedJavaLocalRef;
torne660061cd2016-09-07 17:47:5430
ajith.v4502cc62014-09-05 17:41:3931namespace {
32
33// static
Daniel Bratell7aacf952017-11-21 17:51:2534static base::android::ScopedJavaLocalRef<jobject>
35JNI_NavigationControllerImpl_CreateJavaNavigationEntry(
dtrainorb316e9272014-09-19 23:30:5536 JNIEnv* env,
37 content::NavigationEntry* entry,
38 int index) {
39 DCHECK(entry);
40
ajith.v4502cc62014-09-05 17:41:3941 // Get the details of the current entry
42 ScopedJavaLocalRef<jstring> j_url(
43 ConvertUTF8ToJavaString(env, entry->GetURL().spec()));
44 ScopedJavaLocalRef<jstring> j_virtual_url(
45 ConvertUTF8ToJavaString(env, entry->GetVirtualURL().spec()));
46 ScopedJavaLocalRef<jstring> j_original_url(
47 ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec()));
48 ScopedJavaLocalRef<jstring> j_title(
49 ConvertUTF16ToJavaString(env, entry->GetTitle()));
50 ScopedJavaLocalRef<jobject> j_bitmap;
51 const content::FaviconStatus& status = entry->GetFavicon();
Mike Reed8eac88c42017-10-12 21:24:3852 if (status.valid && status.image.ToSkBitmap()->computeByteSize() > 0)
ajith.v4502cc62014-09-05 17:41:3953 j_bitmap = gfx::ConvertToJavaBitmap(status.image.ToSkBitmap());
54
dtrainorb316e9272014-09-19 23:30:5555 return content::Java_NavigationControllerImpl_createNavigationEntry(
torne948f3662016-08-16 15:10:4456 env, index, j_url, j_virtual_url, j_original_url, j_title, j_bitmap,
mnaganov7a3234c2015-03-23 21:28:5957 entry->GetTransitionType());
ajith.v4502cc62014-09-05 17:41:3958}
59
Daniel Bratell7aacf952017-11-21 17:51:2560static void JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
61 JNIEnv* env,
62 const JavaRef<jobject>& history,
63 content::NavigationEntry* entry,
64 int index) {
dtrainorb316e9272014-09-19 23:30:5565 content::Java_NavigationControllerImpl_addToNavigationHistory(
Daniel Bratell7aacf952017-11-21 17:51:2566 env, history,
67 JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
68 index));
dtrainorb316e9272014-09-19 23:30:5569}
70
ajith.v4502cc62014-09-05 17:41:3971} // namespace
[email protected]155c7f22013-12-09 17:07:1872
73namespace content {
74
[email protected]155c7f22013-12-09 17:07:1875NavigationControllerAndroid::NavigationControllerAndroid(
aelias5252baa2016-04-10 01:18:0276 NavigationControllerImpl* navigation_controller)
[email protected]155c7f22013-12-09 17:07:1877 : navigation_controller_(navigation_controller) {
78 JNIEnv* env = AttachCurrentThread();
79 obj_.Reset(env,
80 Java_NavigationControllerImpl_create(
81 env, reinterpret_cast<intptr_t>(this)).obj());
82}
83
84NavigationControllerAndroid::~NavigationControllerAndroid() {
torne948f3662016-08-16 15:10:4485 Java_NavigationControllerImpl_destroy(AttachCurrentThread(), obj_);
[email protected]155c7f22013-12-09 17:07:1886}
87
88base::android::ScopedJavaLocalRef<jobject>
89NavigationControllerAndroid::GetJavaObject() {
90 return base::android::ScopedJavaLocalRef<jobject>(obj_);
91}
92
tornee1bfee92015-12-01 14:05:0193jboolean NavigationControllerAndroid::CanGoBack(
94 JNIEnv* env,
95 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:1896 return navigation_controller_->CanGoBack();
97}
98
tornee1bfee92015-12-01 14:05:0199jboolean NavigationControllerAndroid::CanGoForward(
100 JNIEnv* env,
101 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18102 return navigation_controller_->CanGoForward();
103}
104
tornee1bfee92015-12-01 14:05:01105jboolean NavigationControllerAndroid::CanGoToOffset(
106 JNIEnv* env,
107 const JavaParamRef<jobject>& obj,
108 jint offset) {
[email protected]155c7f22013-12-09 17:07:18109 return navigation_controller_->CanGoToOffset(offset);
110}
111
tornee1bfee92015-12-01 14:05:01112void NavigationControllerAndroid::GoBack(JNIEnv* env,
113 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18114 navigation_controller_->GoBack();
115}
116
tornee1bfee92015-12-01 14:05:01117void NavigationControllerAndroid::GoForward(JNIEnv* env,
118 const JavaParamRef<jobject>& obj) {
[email protected]155c7f22013-12-09 17:07:18119 navigation_controller_->GoForward();
120}
121
122void NavigationControllerAndroid::GoToOffset(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01123 const JavaParamRef<jobject>& obj,
[email protected]155c7f22013-12-09 17:07:18124 jint offset) {
125 navigation_controller_->GoToOffset(offset);
126}
127
tornee1bfee92015-12-01 14:05:01128jboolean NavigationControllerAndroid::IsInitialNavigation(
129 JNIEnv* env,
130 const JavaParamRef<jobject>& obj) {
dfalcantara0d314d522015-01-05 22:56:43131 return navigation_controller_->IsInitialNavigation();
132}
133
tornee1bfee92015-12-01 14:05:01134void NavigationControllerAndroid::LoadIfNecessary(
135 JNIEnv* env,
136 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29137 navigation_controller_->LoadIfNecessary();
138}
139
tornee1bfee92015-12-01 14:05:01140void NavigationControllerAndroid::ContinuePendingReload(
141 JNIEnv* env,
142 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29143 navigation_controller_->ContinuePendingReload();
144}
145
146void NavigationControllerAndroid::Reload(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01147 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29148 jboolean check_for_repost) {
toyoshim6142d96f2016-12-19 09:07:25149 navigation_controller_->Reload(ReloadType::NORMAL, check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29150}
151
toyoshim7dad4b1182016-04-01 14:28:05152void NavigationControllerAndroid::ReloadBypassingCache(
[email protected]6d3f32f2014-07-08 08:23:29153 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01154 const JavaParamRef<jobject>& obj,
[email protected]6d3f32f2014-07-08 08:23:29155 jboolean check_for_repost) {
toyoshim6142d96f2016-12-19 09:07:25156 navigation_controller_->Reload(ReloadType::BYPASSING_CACHE, check_for_repost);
[email protected]6d3f32f2014-07-08 08:23:29157}
158
tornee1bfee92015-12-01 14:05:01159void NavigationControllerAndroid::RequestRestoreLoad(
160 JNIEnv* env,
161 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29162 navigation_controller_->SetNeedsReload();
163}
164
tornee1bfee92015-12-01 14:05:01165void NavigationControllerAndroid::CancelPendingReload(
166 JNIEnv* env,
167 const JavaParamRef<jobject>& obj) {
[email protected]6d3f32f2014-07-08 08:23:29168 navigation_controller_->CancelPendingReload();
169}
170
tornee1bfee92015-12-01 14:05:01171void NavigationControllerAndroid::GoToNavigationIndex(
172 JNIEnv* env,
173 const JavaParamRef<jobject>& obj,
174 jint index) {
[email protected]155c7f22013-12-09 17:07:18175 navigation_controller_->GoToIndex(index);
176}
177
lizebe8adeb82015-08-20 12:18:10178void NavigationControllerAndroid::LoadUrl(
179 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01180 const JavaParamRef<jobject>& obj,
181 const JavaParamRef<jstring>& url,
lizebe8adeb82015-08-20 12:18:10182 jint load_url_type,
183 jint transition_type,
tornee1bfee92015-12-01 14:05:01184 const JavaParamRef<jstring>& j_referrer_url,
lizebe8adeb82015-08-20 12:18:10185 jint referrer_policy,
186 jint ua_override_option,
tornee1bfee92015-12-01 14:05:01187 const JavaParamRef<jstring>& extra_headers,
lukasza477a5a22016-06-16 18:28:43188 const JavaParamRef<jobject>& j_post_data,
tornee1bfee92015-12-01 14:05:01189 const JavaParamRef<jstring>& base_url_for_data_url,
190 const JavaParamRef<jstring>& virtual_url_for_data_url,
mnaganovbf087422015-12-16 05:10:03191 const JavaParamRef<jstring>& data_url_as_string,
lizebe8adeb82015-08-20 12:18:10192 jboolean can_load_local_resources,
193 jboolean is_renderer_initiated,
194 jboolean should_replace_current_entry) {
ajith.v4502cc62014-09-05 17:41:39195 DCHECK(url);
196 NavigationController::LoadURLParams params(
197 GURL(ConvertJavaStringToUTF8(env, url)));
198
199 params.load_type =
200 static_cast<NavigationController::LoadURLType>(load_url_type);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35201 params.transition_type = ui::PageTransitionFromInt(transition_type);
ajith.v4502cc62014-09-05 17:41:39202 params.override_user_agent =
203 static_cast<NavigationController::UserAgentOverrideOption>(
204 ua_override_option);
205 params.can_load_local_resources = can_load_local_resources;
206 params.is_renderer_initiated = is_renderer_initiated;
lizebe8adeb82015-08-20 12:18:10207 params.should_replace_current_entry = should_replace_current_entry;
ajith.v4502cc62014-09-05 17:41:39208
209 if (extra_headers)
210 params.extra_headers = ConvertJavaStringToUTF8(env, extra_headers);
211
lukasza477a5a22016-06-16 18:28:43212 params.post_data = ResourceRequestBody::FromJavaObject(env, j_post_data);
ajith.v4502cc62014-09-05 17:41:39213
214 if (base_url_for_data_url) {
215 params.base_url_for_data_url =
216 GURL(ConvertJavaStringToUTF8(env, base_url_for_data_url));
217 }
218
219 if (virtual_url_for_data_url) {
220 params.virtual_url_for_data_url =
221 GURL(ConvertJavaStringToUTF8(env, virtual_url_for_data_url));
222 }
223
mnaganovbf087422015-12-16 05:10:03224 if (data_url_as_string) {
Daniel Chengef9f4b72017-10-18 08:56:17225 // Treat |data_url_as_string| as if we were intending to put it into a GURL
226 // field. Note that kMaxURLChars is only enforced when serializing URLs
227 // for IPC.
228 GURL data_url = GURL(ConvertJavaStringToUTF8(env, data_url_as_string));
229 DCHECK(data_url.SchemeIs(url::kDataScheme));
mnaganovbf087422015-12-16 05:10:03230 DCHECK(params.url.SchemeIs(url::kDataScheme));
231#if DCHECK_IS_ON()
232 {
233 std::string mime_type, charset, data;
234 DCHECK(net::DataURL::Parse(params.url, &mime_type, &charset, &data));
235 DCHECK(data.empty());
236 }
Daniel Chengef9f4b72017-10-18 08:56:17237#endif
238 std::string s = data_url.spec();
239 params.data_url_as_string = base::RefCountedString::TakeString(&s);
mnaganovbf087422015-12-16 05:10:03240 }
241
ajith.v4502cc62014-09-05 17:41:39242 if (j_referrer_url) {
243 params.referrer = content::Referrer(
244 GURL(ConvertJavaStringToUTF8(env, j_referrer_url)),
245 static_cast<blink::WebReferrerPolicy>(referrer_policy));
246 }
247
248 navigation_controller_->LoadURLWithParams(params);
249}
250
tornee1bfee92015-12-01 14:05:01251void NavigationControllerAndroid::ClearHistory(
252 JNIEnv* env,
253 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39254 // TODO(creis): Do callers of this need to know if it fails?
255 if (navigation_controller_->CanPruneAllButLastCommitted())
256 navigation_controller_->PruneAllButLastCommitted();
257}
258
tornee1bfee92015-12-01 14:05:01259jint NavigationControllerAndroid::GetNavigationHistory(
260 JNIEnv* env,
261 const JavaParamRef<jobject>& obj,
262 const JavaParamRef<jobject>& history) {
ajith.v4502cc62014-09-05 17:41:39263 // Iterate through navigation entries to populate the list
264 int count = navigation_controller_->GetEntryCount();
265 for (int i = 0; i < count; ++i) {
Daniel Bratell7aacf952017-11-21 17:51:25266 JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55267 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39268 }
269
270 return navigation_controller_->GetCurrentEntryIndex();
271}
272
273void NavigationControllerAndroid::GetDirectedNavigationHistory(
274 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01275 const JavaParamRef<jobject>& obj,
276 const JavaParamRef<jobject>& history,
ajith.v4502cc62014-09-05 17:41:39277 jboolean is_forward,
278 jint max_entries) {
279 // Iterate through navigation entries to populate the list
280 int count = navigation_controller_->GetEntryCount();
281 int num_added = 0;
282 int increment_value = is_forward ? 1 : -1;
283 for (int i = navigation_controller_->GetCurrentEntryIndex() + increment_value;
284 i >= 0 && i < count;
285 i += increment_value) {
286 if (num_added >= max_entries)
287 break;
288
Daniel Bratell7aacf952017-11-21 17:51:25289 JNI_NavigationControllerImpl_AddNavigationEntryToHistory(
dtrainorb316e9272014-09-19 23:30:55290 env, history, navigation_controller_->GetEntryAtIndex(i), i);
ajith.v4502cc62014-09-05 17:41:39291 num_added++;
292 }
293}
294
295ScopedJavaLocalRef<jstring>
296NavigationControllerAndroid::GetOriginalUrlForVisibleNavigationEntry(
297 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01298 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39299 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
300 if (entry == NULL)
301 return ScopedJavaLocalRef<jstring>(env, NULL);
302 return ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec());
303}
304
tornee1bfee92015-12-01 14:05:01305void NavigationControllerAndroid::ClearSslPreferences(
306 JNIEnv* env,
307 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39308 content::SSLHostStateDelegate* delegate =
309 navigation_controller_->GetBrowserContext()->GetSSLHostStateDelegate();
310 if (delegate)
msrameke7da2982016-09-07 09:58:08311 delegate->Clear(base::Callback<bool(const std::string&)>());
ajith.v4502cc62014-09-05 17:41:39312}
313
tornee1bfee92015-12-01 14:05:01314bool NavigationControllerAndroid::GetUseDesktopUserAgent(
315 JNIEnv* env,
316 const JavaParamRef<jobject>& obj) {
ajith.v4502cc62014-09-05 17:41:39317 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
318 return entry && entry->GetIsOverridingUserAgent();
319}
320
321void NavigationControllerAndroid::SetUseDesktopUserAgent(
322 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01323 const JavaParamRef<jobject>& obj,
ajith.v4502cc62014-09-05 17:41:39324 jboolean enabled,
325 jboolean reload_on_state_change) {
326 if (GetUseDesktopUserAgent(env, obj) == enabled)
327 return;
328
329 // Make sure the navigation entry actually exists.
330 NavigationEntry* entry = navigation_controller_->GetVisibleEntry();
331 if (!entry)
332 return;
333
334 // Set the flag in the NavigationEntry.
335 entry->SetIsOverridingUserAgent(enabled);
aelias5252baa2016-04-10 01:18:02336 navigation_controller_->delegate()->UpdateOverridingUserAgent();
ajith.v4502cc62014-09-05 17:41:39337
338 // Send the override to the renderer.
339 if (reload_on_state_change) {
340 // Reloading the page will send the override down as part of the
341 // navigation IPC message.
yoichio4f7be0c2016-12-20 08:27:10342 navigation_controller_->Reload(ReloadType::ORIGINAL_REQUEST_URL, true);
ajith.v4502cc62014-09-05 17:41:39343 }
344}
345
dtrainorb316e9272014-09-19 23:30:55346base::android::ScopedJavaLocalRef<jobject>
dfalcantaraf5d7ff812015-01-16 22:58:03347NavigationControllerAndroid::GetEntryAtIndex(JNIEnv* env,
tornee1bfee92015-12-01 14:05:01348 const JavaParamRef<jobject>& obj,
dfalcantaraf5d7ff812015-01-16 22:58:03349 int index) {
350 if (index < 0 || index >= navigation_controller_->GetEntryCount())
351 return base::android::ScopedJavaLocalRef<jobject>();
352
353 content::NavigationEntry* entry =
354 navigation_controller_->GetEntryAtIndex(index);
Daniel Bratell7aacf952017-11-21 17:51:25355 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry,
356 index);
dfalcantaraf5d7ff812015-01-16 22:58:03357}
358
359base::android::ScopedJavaLocalRef<jobject>
tornee1bfee92015-12-01 14:05:01360NavigationControllerAndroid::GetPendingEntry(JNIEnv* env,
361 const JavaParamRef<jobject>& obj) {
dtrainorb316e9272014-09-19 23:30:55362 content::NavigationEntry* entry = navigation_controller_->GetPendingEntry();
363
364 if (!entry)
365 return base::android::ScopedJavaLocalRef<jobject>();
366
Daniel Bratell7aacf952017-11-21 17:51:25367 return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(
dtrainorb316e9272014-09-19 23:30:55368 env, entry, navigation_controller_->GetPendingEntryIndex());
369}
370
tornee1bfee92015-12-01 14:05:01371jint NavigationControllerAndroid::GetLastCommittedEntryIndex(
372 JNIEnv* env,
373 const JavaParamRef<jobject>& obj) {
jaekyun45bc8c52014-11-03 01:00:21374 return navigation_controller_->GetLastCommittedEntryIndex();
375}
376
tornee1bfee92015-12-01 14:05:01377jboolean NavigationControllerAndroid::RemoveEntryAtIndex(
378 JNIEnv* env,
379 const JavaParamRef<jobject>& obj,
380 jint index) {
jaekyun45bc8c52014-11-03 01:00:21381 return navigation_controller_->RemoveEntryAtIndex(index);
382}
383
tornee1bfee92015-12-01 14:05:01384jboolean NavigationControllerAndroid::CanCopyStateOver(
385 JNIEnv* env,
386 const JavaParamRef<jobject>& obj) {
aruslanb47a7a32015-06-04 03:11:08387 return navigation_controller_->GetEntryCount() == 0 &&
388 !navigation_controller_->GetPendingEntry();
389}
390
tornee1bfee92015-12-01 14:05:01391jboolean NavigationControllerAndroid::CanPruneAllButLastCommitted(
392 JNIEnv* env,
393 const JavaParamRef<jobject>& obj) {
aruslanb47a7a32015-06-04 03:11:08394 return navigation_controller_->CanPruneAllButLastCommitted();
395}
396
397void NavigationControllerAndroid::CopyStateFrom(
398 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01399 const JavaParamRef<jobject>& obj,
Francois Dorayeaace782017-06-21 16:37:24400 jlong source_navigation_controller_android,
401 jboolean needs_reload) {
aruslanb47a7a32015-06-04 03:11:08402 navigation_controller_->CopyStateFrom(
403 *(reinterpret_cast<NavigationControllerAndroid*>(
Francois Dorayeaace782017-06-21 16:37:24404 source_navigation_controller_android)
405 ->navigation_controller_),
406 needs_reload);
aruslanb47a7a32015-06-04 03:11:08407}
408
409void NavigationControllerAndroid::CopyStateFromAndPrune(
410 JNIEnv* env,
tornee1bfee92015-12-01 14:05:01411 const JavaParamRef<jobject>& obj,
aruslanb47a7a32015-06-04 03:11:08412 jlong source_navigation_controller_android,
413 jboolean replace_entry) {
414 navigation_controller_->CopyStateFromAndPrune(
415 reinterpret_cast<NavigationControllerAndroid*>(
416 source_navigation_controller_android)->navigation_controller_,
417 replace_entry);
418}
419
mvanouwerkerk5b1519e2016-09-27 15:47:46420ScopedJavaLocalRef<jstring> NavigationControllerAndroid::GetEntryExtraData(
421 JNIEnv* env,
422 const JavaParamRef<jobject>& obj,
423 jint index,
424 const JavaParamRef<jstring>& jkey) {
425 if (index < 0 || index >= navigation_controller_->GetEntryCount())
426 return ScopedJavaLocalRef<jstring>();
427
428 std::string key = base::android::ConvertJavaStringToUTF8(env, jkey);
429 base::string16 value;
430 navigation_controller_->GetEntryAtIndex(index)->GetExtraData(key, &value);
431 return ConvertUTF16ToJavaString(env, value);
432}
433
434void NavigationControllerAndroid::SetEntryExtraData(
435 JNIEnv* env,
436 const JavaParamRef<jobject>& obj,
437 jint index,
438 const JavaParamRef<jstring>& jkey,
439 const JavaParamRef<jstring>& jvalue) {
440 if (index < 0 || index >= navigation_controller_->GetEntryCount())
441 return;
442
443 std::string key = base::android::ConvertJavaStringToUTF8(env, jkey);
444 base::string16 value = base::android::ConvertJavaStringToUTF16(env, jvalue);
445 navigation_controller_->GetEntryAtIndex(index)->SetExtraData(key, value);
446}
447
[email protected]155c7f22013-12-09 17:07:18448} // namespace content