1// 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 "base/android/jni_android.h"
6#include "base/android/jni_string.h"
7#include "components/google/core/browser/google_util.h"
8#include "components/url_fixer/url_fixer.h"
9#include "jni/UrlUtilities_jni.h"
10#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
11#include "url/gurl.h"
12
13using base::android::ConvertJavaStringToUTF8;
14
15namespace {
16
17net::registry_controlled_domains::PrivateRegistryFilter GetRegistryFilter(
18    jboolean include_private) {
19  return include_private
20      ? net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES
21      : net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES;
22}
23
24}
25
26static jboolean SameDomainOrHost(JNIEnv* env,
27                                 jclass clazz,
28                                 jstring url_1_str,
29                                 jstring url_2_str,
30                                 jboolean include_private) {
31  GURL url_1(ConvertJavaStringToUTF8(env, url_1_str));
32  GURL url_2(ConvertJavaStringToUTF8(env, url_2_str));
33
34  net::registry_controlled_domains::PrivateRegistryFilter filter =
35      GetRegistryFilter(include_private);
36
37  return net::registry_controlled_domains::SameDomainOrHost(url_1,
38                                                            url_2,
39                                                            filter);
40}
41
42static jstring GetDomainAndRegistry(JNIEnv* env,
43                                    jclass clazz,
44                                    jstring url,
45                                    jboolean include_private) {
46  GURL gurl = GURL(ConvertJavaStringToUTF8(env, url));
47  if (gurl.is_empty())
48    return NULL;
49
50  net::registry_controlled_domains::PrivateRegistryFilter filter =
51      GetRegistryFilter(include_private);
52
53  // OK to release, JNI binding.
54  return base::android::ConvertUTF8ToJavaString(
55      env, net::registry_controlled_domains::GetDomainAndRegistry(
56          gurl, filter)).Release();
57}
58
59static jboolean IsGoogleSearchUrl(JNIEnv* env, jclass clazz, jstring url) {
60  GURL gurl = GURL(ConvertJavaStringToUTF8(env, url));
61  if (gurl.is_empty())
62    return false;
63  return google_util::IsGoogleSearchUrl(gurl);
64}
65
66static jboolean IsGoogleHomePageUrl(JNIEnv* env, jclass clazz, jstring url) {
67  GURL gurl = GURL(ConvertJavaStringToUTF8(env, url));
68  if (gurl.is_empty())
69    return false;
70  return google_util::IsGoogleHomePageUrl(gurl);
71}
72
73static jstring FixupUrl(JNIEnv* env,
74                        jclass clazz,
75                        jstring url,
76                        jstring desired_tld) {
77  GURL fixed_url = url_fixer::FixupURL(
78      base::android::ConvertJavaStringToUTF8(env, url),
79      base::android::ConvertJavaStringToUTF8(env, desired_tld));
80
81  return fixed_url.is_valid() ?
82      base::android::ConvertUTF8ToJavaString(env, fixed_url.spec()).Release() :
83      NULL;
84}
85
86static jboolean IsGooglePropertyUrl(JNIEnv* env, jclass clazz, jstring url) {
87  const GURL gurl = GURL(ConvertJavaStringToUTF8(env, url));
88  if (gurl.is_empty() || !gurl.is_valid())
89    return false;
90  return
91      google_util::IsGoogleDomainUrl(
92          gurl,
93          google_util::ALLOW_SUBDOMAIN,
94          google_util::DISALLOW_NON_STANDARD_PORTS) ||
95      google_util::IsYoutubeDomainUrl(
96          gurl,
97          google_util::ALLOW_SUBDOMAIN,
98          google_util::DISALLOW_NON_STANDARD_PORTS);
99}
100
101// Register native methods
102bool RegisterUrlUtilities(JNIEnv* env) {
103  return RegisterNativesImpl(env);
104}
105