| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/navigation_interception/navigation_params_android.h" | 5 #include "components/navigation_interception/navigation_params_android.h" |
| 6 | 6 |
| 7 #include "base/android/jni_string.h" | 7 #include "base/android/jni_string.h" |
| 8 #include "jni/NavigationParams_jni.h" | 8 #include "jni/NavigationParams_jni.h" |
| 9 #include "net/base/escape.h" |
| 10 #include "net/base/url_util.h" |
| 9 | 11 |
| 10 using base::android::ConvertUTF8ToJavaString; | 12 using base::android::ConvertUTF8ToJavaString; |
| 11 | 13 |
| 12 namespace navigation_interception { | 14 namespace navigation_interception { |
| 13 | 15 |
| 16 static GURL EscapeQueryParameters(const GURL& url) { |
| 17 const std::string input = url.query(); |
| 18 url::Component cursor(0, input.size()); |
| 19 std::string output; |
| 20 url::Component key_range, value_range; |
| 21 while (url::ExtractQueryKeyValue( |
| 22 input.data(), &cursor, &key_range, &value_range)) { |
| 23 std::string key(input.data() + key_range.begin, key_range.len); |
| 24 std::string value(input.data() + value_range.begin, value_range.len); |
| 25 std::string unescaped_key = net::UnescapeURLComponent( |
| 26 key, |
| 27 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS | |
| 28 net::UnescapeRule::REPLACE_PLUS_WITH_SPACE); |
| 29 std::string unescaped_value = net::UnescapeURLComponent( |
| 30 value, |
| 31 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS | |
| 32 net::UnescapeRule::REPLACE_PLUS_WITH_SPACE); |
| 33 std::string param_name = net::EscapeQueryParamValue(unescaped_key, true); |
| 34 std::string param_value = net::EscapeQueryParamValue(unescaped_value, true); |
| 35 std::string key_value_pair = (param_name + "=" + param_value); |
| 36 if (!output.empty()) |
| 37 output += "&"; |
| 38 |
| 39 output += key_value_pair; |
| 40 } |
| 41 if (output.empty()) |
| 42 return url; |
| 43 |
| 44 GURL::Replacements replacements; |
| 45 replacements.SetQueryStr(output); |
| 46 return url.ReplaceComponents(replacements); |
| 47 } |
| 48 |
| 14 base::android::ScopedJavaLocalRef<jobject> CreateJavaNavigationParams( | 49 base::android::ScopedJavaLocalRef<jobject> CreateJavaNavigationParams( |
| 15 JNIEnv* env, | 50 JNIEnv* env, |
| 16 const NavigationParams& params) { | 51 const NavigationParams& params) { |
| 52 // Escape all the queries. |
| 53 GURL escaped_url = EscapeQueryParameters(params.url()); |
| 17 ScopedJavaLocalRef<jstring> jstring_url = | 54 ScopedJavaLocalRef<jstring> jstring_url = |
| 18 ConvertUTF8ToJavaString(env, params.url().spec()); | 55 ConvertUTF8ToJavaString(env, escaped_url.spec()); |
| 19 | 56 |
| 20 return Java_NavigationParams_create(env, | 57 return Java_NavigationParams_create(env, |
| 21 jstring_url.obj(), | 58 jstring_url.obj(), |
| 22 params.is_post(), | 59 params.is_post(), |
| 23 params.has_user_gesture(), | 60 params.has_user_gesture(), |
| 24 params.transition_type(), | 61 params.transition_type(), |
| 25 params.is_redirect()); | 62 params.is_redirect()); |
| 26 } | 63 } |
| 27 | 64 |
| 28 // Register native methods. | 65 // Register native methods. |
| 29 | 66 |
| 30 bool RegisterNavigationParams(JNIEnv* env) { | 67 bool RegisterNavigationParams(JNIEnv* env) { |
| 31 return RegisterNativesImpl(env); | 68 return RegisterNativesImpl(env); |
| 32 } | 69 } |
| 33 | 70 |
| 34 } // namespace navigation_interception | 71 } // namespace navigation_interception |
| OLD | NEW |