blob: c195666b19b288e89009ba19330c2cbc8eb48e8d [file] [log] [blame]
[email protected]7e27c372013-09-11 12:10:301// 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
palmer91246922015-09-20 23:16:165#include <string>
6
[email protected]7e27c372013-09-11 12:10:307#include "base/android/jni_android.h"
8#include "base/android/jni_string.h"
pkotwiczb9096f1be2017-01-19 03:09:399#include "base/strings/string_util.h"
John Abd-El-Malek9cf3d7f02018-07-27 02:40:3910#include "components/google/core/common/google_util.h"
[email protected]7e27c372013-09-11 12:10:3011#include "jni/UrlUtilities_jni.h"
12#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
13#include "url/gurl.h"
14
[email protected]21bb906f2013-11-04 19:12:5515using base::android::ConvertJavaStringToUTF8;
torne86560112016-08-04 15:59:0416using base::android::JavaParamRef;
17using base::android::ScopedJavaLocalRef;
[email protected]21bb906f2013-11-04 19:12:5518
[email protected]7e27c372013-09-11 12:10:3019namespace {
20
mariakhomenkof2f761ac2016-08-19 00:07:0521static const char* const g_supported_schemes[] = { "about", "data", "file",
22 "http", "https", "inline", "javascript", nullptr };
23
24static const char* const g_downloadable_schemes[] = {
25 "data", "blob", "file", "filesystem", "http", "https", nullptr };
26
27static const char* const g_fallback_valid_schemes[] = {
28 "http", "https", nullptr };
29
Daniel Bratell7aacf952017-11-21 17:51:2530GURL JNI_UrlUtilities_ConvertJavaStringToGURL(JNIEnv* env, jstring url) {
jdduke6a374932014-11-26 18:19:0431 return url ? GURL(ConvertJavaStringToUTF8(env, url)) : GURL();
32}
33
mariakhomenkof2f761ac2016-08-19 00:07:0534bool CheckSchemeBelongsToList(
35 JNIEnv* env,
36 const JavaParamRef<jstring>& url,
37 const char* const* scheme_list) {
Daniel Bratell7aacf952017-11-21 17:51:2538 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
mariakhomenkof2f761ac2016-08-19 00:07:0539 if (gurl.is_valid()) {
40 for (size_t i = 0; scheme_list[i]; i++) {
41 if (gurl.scheme() == scheme_list[i]) {
42 return true;
43 }
44 }
45 }
46 return false;
47}
48
[email protected]7e27c372013-09-11 12:10:3049net::registry_controlled_domains::PrivateRegistryFilter GetRegistryFilter(
50 jboolean include_private) {
51 return include_private
52 ? net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES
53 : net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES;
54}
55
jdduke6a374932014-11-26 18:19:0456} // namespace
[email protected]7e27c372013-09-11 12:10:3057
Daniel Bratell7aacf952017-11-21 17:51:2558static jboolean JNI_UrlUtilities_SameDomainOrHost(
59 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:2560 const JavaParamRef<jstring>& url_1_str,
61 const JavaParamRef<jstring>& url_2_str,
62 jboolean include_private) {
63 GURL url_1 = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url_1_str);
64 GURL url_2 = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url_2_str);
[email protected]7e27c372013-09-11 12:10:3065
66 net::registry_controlled_domains::PrivateRegistryFilter filter =
67 GetRegistryFilter(include_private);
68
69 return net::registry_controlled_domains::SameDomainOrHost(url_1,
70 url_2,
71 filter);
72}
73
Daniel Bratell7aacf952017-11-21 17:51:2574static ScopedJavaLocalRef<jstring> JNI_UrlUtilities_GetDomainAndRegistry(
tornef71efb32015-08-26 14:07:3275 JNIEnv* env,
torne89cc5d92015-09-04 11:16:3576 const JavaParamRef<jstring>& url,
tornef71efb32015-08-26 14:07:3277 jboolean include_private) {
jdduke6a374932014-11-26 18:19:0478 DCHECK(url);
Daniel Bratell7aacf952017-11-21 17:51:2579 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
[email protected]7e27c372013-09-11 12:10:3080 if (gurl.is_empty())
tornef71efb32015-08-26 14:07:3281 return ScopedJavaLocalRef<jstring>();
[email protected]7e27c372013-09-11 12:10:3082
83 net::registry_controlled_domains::PrivateRegistryFilter filter =
84 GetRegistryFilter(include_private);
85
[email protected]7e27c372013-09-11 12:10:3086 return base::android::ConvertUTF8ToJavaString(
tornef71efb32015-08-26 14:07:3287 env,
88 net::registry_controlled_domains::GetDomainAndRegistry(gurl, filter));
[email protected]7e27c372013-09-11 12:10:3089}
90
Arthur Sonzogniea4bf432019-01-14 11:28:1291static jboolean JNI_UrlUtilities_IsGoogleDomainUrl(
92 JNIEnv* env,
93 const JavaParamRef<jstring>& url,
94 jboolean allow_non_standard_port) {
95 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
96 if (gurl.is_empty())
97 return false;
98 return google_util::IsGoogleDomainUrl(
99 gurl, google_util::DISALLOW_SUBDOMAIN,
100 allow_non_standard_port == JNI_TRUE
101 ? google_util::ALLOW_NON_STANDARD_PORTS
102 : google_util::DISALLOW_NON_STANDARD_PORTS);
103}
104
Daniel Bratell7aacf952017-11-21 17:51:25105static jboolean JNI_UrlUtilities_IsGoogleSearchUrl(
106 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25107 const JavaParamRef<jstring>& url) {
108 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
[email protected]7e27c372013-09-11 12:10:30109 if (gurl.is_empty())
110 return false;
mariakhomenko38c3c8c82017-01-04 21:20:50111 return google_util::IsGoogleSearchUrl(gurl);
[email protected]7e27c372013-09-11 12:10:30112}
113
Daniel Bratell7aacf952017-11-21 17:51:25114static jboolean JNI_UrlUtilities_IsGoogleHomePageUrl(
115 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25116 const JavaParamRef<jstring>& url) {
117 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
[email protected]21bb906f2013-11-04 19:12:55118 if (gurl.is_empty())
119 return false;
120 return google_util::IsGoogleHomePageUrl(gurl);
121}
122
Daniel Bratell7aacf952017-11-21 17:51:25123static jboolean JNI_UrlUtilities_IsUrlWithinScope(
124 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25125 const JavaParamRef<jstring>& url,
126 const JavaParamRef<jstring>& scope_url) {
127 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
128 GURL gscope_url = JNI_UrlUtilities_ConvertJavaStringToGURL(env, scope_url);
pkotwiczb9096f1be2017-01-19 03:09:39129 return gurl.GetOrigin() == gscope_url.GetOrigin() &&
130 base::StartsWith(gurl.path(), gscope_url.path(),
131 base::CompareCase::SENSITIVE);
132}
133
Daniel Bratell7aacf952017-11-21 17:51:25134static jboolean JNI_UrlUtilities_UrlsMatchIgnoringFragments(
135 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25136 const JavaParamRef<jstring>& url,
137 const JavaParamRef<jstring>& url2) {
138 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
139 GURL gurl2 = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url2);
lizeb3c1fe9cb2016-03-08 15:12:01140 if (gurl.is_empty())
141 return gurl2.is_empty();
142 if (!gurl.is_valid() || !gurl2.is_valid())
143 return false;
144
145 GURL::Replacements replacements;
146 replacements.SetRefStr("");
147 return gurl.ReplaceComponents(replacements) ==
148 gurl2.ReplaceComponents(replacements);
149}
150
Daniel Bratell7aacf952017-11-21 17:51:25151static jboolean JNI_UrlUtilities_UrlsFragmentsDiffer(
152 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25153 const JavaParamRef<jstring>& url,
154 const JavaParamRef<jstring>& url2) {
155 GURL gurl = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url);
156 GURL gurl2 = JNI_UrlUtilities_ConvertJavaStringToGURL(env, url2);
lizeb3c1fe9cb2016-03-08 15:12:01157 if (gurl.is_empty())
158 return !gurl2.is_empty();
159 if (!gurl.is_valid() || !gurl2.is_valid())
160 return true;
161 return gurl.ref() != gurl2.ref();
162}
163
Daniel Bratell7aacf952017-11-21 17:51:25164static jboolean JNI_UrlUtilities_IsAcceptedScheme(
165 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25166 const JavaParamRef<jstring>& url) {
mariakhomenkof2f761ac2016-08-19 00:07:05167 return CheckSchemeBelongsToList(env, url, g_supported_schemes);
168}
169
Daniel Bratell7aacf952017-11-21 17:51:25170static jboolean JNI_UrlUtilities_IsValidForIntentFallbackNavigation(
mariakhomenkof2f761ac2016-08-19 00:07:05171 JNIEnv* env,
mariakhomenkof2f761ac2016-08-19 00:07:05172 const JavaParamRef<jstring>& url) {
173 return CheckSchemeBelongsToList(env, url, g_fallback_valid_schemes);
174}
175
Daniel Bratell7aacf952017-11-21 17:51:25176static jboolean JNI_UrlUtilities_IsDownloadable(
177 JNIEnv* env,
Daniel Bratell7aacf952017-11-21 17:51:25178 const JavaParamRef<jstring>& url) {
mariakhomenkof2f761ac2016-08-19 00:07:05179 return CheckSchemeBelongsToList(env, url, g_downloadable_schemes);
180}