| Index: components/navigation_interception/navigation_params_android.cc
|
| diff --git a/components/navigation_interception/navigation_params_android.cc b/components/navigation_interception/navigation_params_android.cc
|
| index 769450fa9d2816558f67aa50c4dfc6e7dee03ff8..8e582d2247687e70e9f8161a07f0eb2d406a9abc 100644
|
| --- a/components/navigation_interception/navigation_params_android.cc
|
| +++ b/components/navigation_interception/navigation_params_android.cc
|
| @@ -6,16 +6,53 @@
|
|
|
| #include "base/android/jni_string.h"
|
| #include "jni/NavigationParams_jni.h"
|
| +#include "net/base/escape.h"
|
| +#include "net/base/url_util.h"
|
|
|
| using base::android::ConvertUTF8ToJavaString;
|
|
|
| namespace navigation_interception {
|
|
|
| +static GURL EscapeQueryParameters(const GURL& url) {
|
| + const std::string input = url.query();
|
| + url::Component cursor(0, input.size());
|
| + std::string output;
|
| + url::Component key_range, value_range;
|
| + while (url::ExtractQueryKeyValue(
|
| + input.data(), &cursor, &key_range, &value_range)) {
|
| + std::string key(input.data() + key_range.begin, key_range.len);
|
| + std::string value(input.data() + value_range.begin, value_range.len);
|
| + std::string unescaped_key = net::UnescapeURLComponent(
|
| + key,
|
| + net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS |
|
| + net::UnescapeRule::REPLACE_PLUS_WITH_SPACE);
|
| + std::string unescaped_value = net::UnescapeURLComponent(
|
| + value,
|
| + net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS |
|
| + net::UnescapeRule::REPLACE_PLUS_WITH_SPACE);
|
| + std::string param_name = net::EscapeQueryParamValue(unescaped_key, true);
|
| + std::string param_value = net::EscapeQueryParamValue(unescaped_value, true);
|
| + std::string key_value_pair = (param_name + "=" + param_value);
|
| + if (!output.empty())
|
| + output += "&";
|
| +
|
| + output += key_value_pair;
|
| + }
|
| + if (output.empty())
|
| + return url;
|
| +
|
| + GURL::Replacements replacements;
|
| + replacements.SetQueryStr(output);
|
| + return url.ReplaceComponents(replacements);
|
| +}
|
| +
|
| base::android::ScopedJavaLocalRef<jobject> CreateJavaNavigationParams(
|
| JNIEnv* env,
|
| const NavigationParams& params) {
|
| + // Escape all the queries.
|
| + GURL escaped_url = EscapeQueryParameters(params.url());
|
| ScopedJavaLocalRef<jstring> jstring_url =
|
| - ConvertUTF8ToJavaString(env, params.url().spec());
|
| + ConvertUTF8ToJavaString(env, escaped_url.spec());
|
|
|
| return Java_NavigationParams_create(env,
|
| jstring_url.obj(),
|
|
|