Add more checks to investigate SupervisedUserPrefStore crash at startup.
[chromium-blink-merge.git] / chrome / browser / search_engines / template_url_service_android.cc
blob55bedd5e3196afdfb7a85ad0a1eb45a8dde810ef
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
3 // found in the LICENSE file.
5 #include "chrome/browser/search_engines/template_url_service_android.h"
7 #include "base/android/jni_string.h"
8 #include "base/bind.h"
9 #include "base/format_macros.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/profiles/profile_manager.h"
13 #include "chrome/browser/search_engines/template_url_service_factory.h"
14 #include "components/google/core/browser/google_util.h"
15 #include "components/search_engines/template_url.h"
16 #include "components/search_engines/template_url_prepopulate_data.h"
17 #include "components/search_engines/template_url_service.h"
18 #include "components/search_engines/util.h"
19 #include "jni/TemplateUrlService_jni.h"
20 #include "net/base/url_util.h"
22 namespace {
24 Profile* GetOriginalProfile() {
25 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
28 } // namespace
30 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env,
31 jobject obj)
32 : weak_java_obj_(env, obj),
33 template_url_service_(
34 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) {
35 template_url_subscription_ =
36 template_url_service_->RegisterOnLoadedCallback(
37 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded,
38 base::Unretained(this)));
39 template_url_service_->AddObserver(this);
42 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() {
43 template_url_service_->RemoveObserver(this);
46 void TemplateUrlServiceAndroid::Load(JNIEnv* env, jobject obj) {
47 template_url_service_->Load();
50 void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider(
51 JNIEnv* env,
52 jobject obj,
53 jint selected_index) {
54 std::vector<TemplateURL*> template_urls =
55 template_url_service_->GetTemplateURLs();
56 size_t selected_index_size_t = static_cast<size_t>(selected_index);
57 DCHECK_LT(selected_index_size_t, template_urls.size()) <<
58 "Wrong index for search engine";
60 TemplateURL* template_url = template_urls[selected_index_size_t];
61 DCHECK_GT(template_url->prepopulate_id(), 0) <<
62 "Tried to select non-prepopulated search engine";
63 template_url_service_->SetUserSelectedDefaultSearchProvider(template_url);
66 jint TemplateUrlServiceAndroid::GetDefaultSearchProvider(JNIEnv* env,
67 jobject obj) {
68 std::vector<TemplateURL*> template_urls =
69 template_url_service_->GetTemplateURLs();
70 TemplateURL* default_search_provider =
71 template_url_service_->GetDefaultSearchProvider();
72 for (size_t i = 0; i < template_urls.size(); ++i) {
73 if (default_search_provider == template_urls[i])
74 return i;
76 return -1;
79 jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, jobject obj) {
80 return template_url_service_->loaded();
83 jint TemplateUrlServiceAndroid::GetTemplateUrlCount(JNIEnv* env, jobject obj) {
84 return template_url_service_->GetTemplateURLs().size();
87 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged(JNIEnv* env,
88 jobject obj) {
89 return template_url_service_->is_default_search_managed();
92 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable(JNIEnv* env,
93 jobject obj) {
94 const TemplateURL* default_search_provider =
95 template_url_service_->GetDefaultSearchProvider();
96 return default_search_provider &&
97 !default_search_provider->image_url().empty() &&
98 default_search_provider->image_url_ref().IsValid(
99 template_url_service_->search_terms_data());
102 jboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle(JNIEnv* env,
103 jobject obj) {
104 TemplateURL* default_search_provider =
105 template_url_service_->GetDefaultSearchProvider();
106 return default_search_provider &&
107 default_search_provider->url_ref().HasGoogleBaseURLs(
108 template_url_service_->search_terms_data());
111 base::android::ScopedJavaLocalRef<jobject>
112 TemplateUrlServiceAndroid::GetPrepopulatedTemplateUrlAt(JNIEnv* env,
113 jobject obj,
114 jint index) {
115 TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index];
116 if (!IsPrepopulatedTemplate(template_url) &&
117 !template_url->created_by_policy())
118 return ScopedJavaLocalRef<jobject>();
120 return Java_TemplateUrl_create(
121 env,
122 index,
123 base::android::ConvertUTF16ToJavaString(
124 env, template_url->short_name()).obj(),
125 base::android::ConvertUTF16ToJavaString(
126 env, template_url->keyword()).obj());
129 bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) {
130 return url->prepopulate_id() > 0;
133 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() {
134 template_url_subscription_.reset();
135 JNIEnv* env = base::android::AttachCurrentThread();
136 if (weak_java_obj_.get(env).is_null())
137 return;
139 Java_TemplateUrlService_templateUrlServiceLoaded(
140 env, weak_java_obj_.get(env).obj());
143 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() {
144 JNIEnv* env = base::android::AttachCurrentThread();
145 if (weak_java_obj_.get(env).is_null())
146 return;
148 Java_TemplateUrlService_onTemplateURLServiceChanged(
149 env, weak_java_obj_.get(env).obj());
152 base::android::ScopedJavaLocalRef<jstring>
153 TemplateUrlServiceAndroid::GetUrlForSearchQuery(JNIEnv* env,
154 jobject obj,
155 jstring jquery) {
156 const TemplateURL* default_provider =
157 template_url_service_->GetDefaultSearchProvider();
159 base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery));
161 std::string url;
162 if (default_provider &&
163 default_provider->url_ref().SupportsReplacement(
164 template_url_service_->search_terms_data()) &&
165 !query.empty()) {
166 url = default_provider->url_ref().ReplaceSearchTerms(
167 TemplateURLRef::SearchTermsArgs(query),
168 template_url_service_->search_terms_data());
171 return base::android::ConvertUTF8ToJavaString(env, url);
174 base::android::ScopedJavaLocalRef<jstring>
175 TemplateUrlServiceAndroid::GetUrlForVoiceSearchQuery(JNIEnv* env,
176 jobject obj,
177 jstring jquery) {
178 base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery));
179 std::string url;
181 if (!query.empty()) {
182 GURL gurl(GetDefaultSearchURLForSearchTerms(template_url_service_, query));
183 if (google_util::IsGoogleSearchUrl(gurl))
184 gurl = net::AppendQueryParameter(gurl, "inm", "vs");
185 url = gurl.spec();
188 return base::android::ConvertUTF8ToJavaString(env, url);
191 base::android::ScopedJavaLocalRef<jstring>
192 TemplateUrlServiceAndroid::ReplaceSearchTermsInUrl(JNIEnv* env,
193 jobject obj,
194 jstring jquery,
195 jstring jcurrent_url) {
196 TemplateURL* default_provider =
197 template_url_service_->GetDefaultSearchProvider();
199 base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery));
200 GURL current_url(base::android::ConvertJavaStringToUTF16(env, jcurrent_url));
201 GURL destination_url(current_url);
202 if (default_provider && !query.empty()) {
203 bool refined_query = default_provider->ReplaceSearchTermsInURL(
204 current_url, TemplateURLRef::SearchTermsArgs(query),
205 template_url_service_->search_terms_data(), &destination_url);
206 if (refined_query)
207 return base::android::ConvertUTF8ToJavaString(
208 env, destination_url.spec());
210 return base::android::ScopedJavaLocalRef<jstring>(env, NULL);
213 base::android::ScopedJavaLocalRef<jstring>
214 TemplateUrlServiceAndroid::GetUrlForContextualSearchQuery(
215 JNIEnv* env,
216 jobject obj,
217 jstring jquery,
218 jstring jalternate_term,
219 jboolean jshould_prefetch) {
220 base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery));
221 std::string url;
223 if (!query.empty()) {
224 GURL gurl(GetDefaultSearchURLForSearchTerms(template_url_service_, query));
225 if (google_util::IsGoogleSearchUrl(gurl)) {
226 gurl = net::AppendQueryParameter(gurl, "ctxs", "2");
227 if (jshould_prefetch) {
228 // Indicate that the search page is being prefetched.
229 gurl = net::AppendQueryParameter(gurl, "pf", "c");
232 if (jalternate_term) {
233 std::string alternate_term(
234 base::android::ConvertJavaStringToUTF8(env, jalternate_term));
235 if (!alternate_term.empty()) {
236 gurl = net::AppendQueryParameter(
237 gurl, "ctxsl_alternate_term", alternate_term);
241 url = gurl.spec();
244 return base::android::ConvertUTF8ToJavaString(env, url);
247 static jlong Init(JNIEnv* env, jobject obj) {
248 TemplateUrlServiceAndroid* template_url_service_android =
249 new TemplateUrlServiceAndroid(env, obj);
250 return reinterpret_cast<intptr_t>(template_url_service_android);
253 // static
254 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) {
255 return RegisterNativesImpl(env);