| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/android/omnibox/autocomplete_controller_android.h" | 5 #include "chrome/browser/android/omnibox/autocomplete_controller_android.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 // Nothing to do here, the results have been cached. | 108 // Nothing to do here, the results have been cached. |
| 109 // We don't want to trigger deletion here because this is being called by the | 109 // We don't want to trigger deletion here because this is being called by the |
| 110 // AutocompleteController object. | 110 // AutocompleteController object. |
| 111 } | 111 } |
| 112 | 112 |
| 113 } // namespace | 113 } // namespace |
| 114 | 114 |
| 115 AutocompleteControllerAndroid::AutocompleteControllerAndroid(Profile* profile) | 115 AutocompleteControllerAndroid::AutocompleteControllerAndroid(Profile* profile) |
| 116 : autocomplete_controller_(new AutocompleteController( | 116 : autocomplete_controller_(new AutocompleteController( |
| 117 profile, this, kAndroidAutocompleteProviders)), | 117 profile, this, kAndroidAutocompleteProviders)), |
| 118 inside_classify_(false), | 118 inside_synchronous_start_(false), |
| 119 profile_(profile) { | 119 profile_(profile) { |
| 120 } | 120 } |
| 121 | 121 |
| 122 void AutocompleteControllerAndroid::Start(JNIEnv* env, | 122 void AutocompleteControllerAndroid::Start(JNIEnv* env, |
| 123 jobject obj, | 123 jobject obj, |
| 124 jstring j_text, | 124 jstring j_text, |
| 125 jstring j_desired_tld, | 125 jstring j_desired_tld, |
| 126 jstring j_current_url, | 126 jstring j_current_url, |
| 127 bool prevent_inline_autocomplete, | 127 bool prevent_inline_autocomplete, |
| 128 bool prefer_keyword, | 128 bool prefer_keyword, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 149 prefer_keyword, | 149 prefer_keyword, |
| 150 allow_exact_keyword_match, | 150 allow_exact_keyword_match, |
| 151 want_asynchronous_matches); | 151 want_asynchronous_matches); |
| 152 autocomplete_controller_->Start(input_); | 152 autocomplete_controller_->Start(input_); |
| 153 } | 153 } |
| 154 | 154 |
| 155 ScopedJavaLocalRef<jobject> AutocompleteControllerAndroid::Classify( | 155 ScopedJavaLocalRef<jobject> AutocompleteControllerAndroid::Classify( |
| 156 JNIEnv* env, | 156 JNIEnv* env, |
| 157 jobject obj, | 157 jobject obj, |
| 158 jstring j_text) { | 158 jstring j_text) { |
| 159 if (!autocomplete_controller_) | 159 return GetTopSynchronousResult(env, obj, j_text, true); |
| 160 return ScopedJavaLocalRef<jobject>(); | |
| 161 | |
| 162 inside_classify_ = true; | |
| 163 Start(env, obj, j_text, NULL, NULL, true, false, false, false); | |
| 164 inside_classify_ = false; | |
| 165 DCHECK(autocomplete_controller_->done()); | |
| 166 const AutocompleteResult& result = autocomplete_controller_->result(); | |
| 167 if (result.empty()) | |
| 168 return ScopedJavaLocalRef<jobject>(); | |
| 169 | |
| 170 return BuildOmniboxSuggestion(env, *result.begin()); | |
| 171 } | 160 } |
| 172 | 161 |
| 173 void AutocompleteControllerAndroid::StartZeroSuggest( | 162 void AutocompleteControllerAndroid::StartZeroSuggest( |
| 174 JNIEnv* env, | 163 JNIEnv* env, |
| 175 jobject obj, | 164 jobject obj, |
| 176 jstring j_omnibox_text, | 165 jstring j_omnibox_text, |
| 177 jstring j_current_url, | 166 jstring j_current_url, |
| 178 jboolean is_query_in_omnibox, | 167 jboolean is_query_in_omnibox, |
| 179 jboolean focused_from_fakebox) { | 168 jboolean focused_from_fakebox) { |
| 180 if (!autocomplete_controller_) | 169 if (!autocomplete_controller_) |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 return ScopedJavaLocalRef<jstring>(); | 256 return ScopedJavaLocalRef<jstring>(); |
| 268 | 257 |
| 269 AutocompleteMatch match( | 258 AutocompleteMatch match( |
| 270 autocomplete_controller_->result().match_at(selected_index)); | 259 autocomplete_controller_->result().match_at(selected_index)); |
| 271 autocomplete_controller_->UpdateMatchDestinationURL( | 260 autocomplete_controller_->UpdateMatchDestinationURL( |
| 272 base::TimeDelta::FromMilliseconds(elapsed_time_since_input_change), | 261 base::TimeDelta::FromMilliseconds(elapsed_time_since_input_change), |
| 273 &match); | 262 &match); |
| 274 return ConvertUTF8ToJavaString(env, match.destination_url.spec()); | 263 return ConvertUTF8ToJavaString(env, match.destination_url.spec()); |
| 275 } | 264 } |
| 276 | 265 |
| 266 ScopedJavaLocalRef<jobject> |
| 267 AutocompleteControllerAndroid::GetTopSynchronousMatch(JNIEnv* env, |
| 268 jobject obj, |
| 269 jstring query) { |
| 270 return GetTopSynchronousResult(env, obj, query, false); |
| 271 } |
| 272 |
| 277 void AutocompleteControllerAndroid::Shutdown() { | 273 void AutocompleteControllerAndroid::Shutdown() { |
| 278 autocomplete_controller_.reset(); | 274 autocomplete_controller_.reset(); |
| 279 | 275 |
| 280 JNIEnv* env = AttachCurrentThread(); | 276 JNIEnv* env = AttachCurrentThread(); |
| 281 ScopedJavaLocalRef<jobject> java_bridge = | 277 ScopedJavaLocalRef<jobject> java_bridge = |
| 282 weak_java_autocomplete_controller_android_.get(env); | 278 weak_java_autocomplete_controller_android_.get(env); |
| 283 if (java_bridge.obj()) | 279 if (java_bridge.obj()) |
| 284 Java_AutocompleteController_notifyNativeDestroyed(env, java_bridge.obj()); | 280 Java_AutocompleteController_notifyNativeDestroyed(env, java_bridge.obj()); |
| 285 | 281 |
| 286 weak_java_autocomplete_controller_android_.reset(); | 282 weak_java_autocomplete_controller_android_.reset(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 AutocompleteControllerAndroid::~AutocompleteControllerAndroid() { | 322 AutocompleteControllerAndroid::~AutocompleteControllerAndroid() { |
| 327 } | 323 } |
| 328 | 324 |
| 329 void AutocompleteControllerAndroid::InitJNI(JNIEnv* env, jobject obj) { | 325 void AutocompleteControllerAndroid::InitJNI(JNIEnv* env, jobject obj) { |
| 330 weak_java_autocomplete_controller_android_ = | 326 weak_java_autocomplete_controller_android_ = |
| 331 JavaObjectWeakGlobalRef(env, obj); | 327 JavaObjectWeakGlobalRef(env, obj); |
| 332 } | 328 } |
| 333 | 329 |
| 334 void AutocompleteControllerAndroid::OnResultChanged( | 330 void AutocompleteControllerAndroid::OnResultChanged( |
| 335 bool default_match_changed) { | 331 bool default_match_changed) { |
| 336 if (autocomplete_controller_.get() != NULL && !inside_classify_) | 332 if (autocomplete_controller_.get() != NULL && !inside_synchronous_start_) |
| 337 NotifySuggestionsReceived(autocomplete_controller_->result()); | 333 NotifySuggestionsReceived(autocomplete_controller_->result()); |
| 338 } | 334 } |
| 339 | 335 |
| 340 void AutocompleteControllerAndroid::NotifySuggestionsReceived( | 336 void AutocompleteControllerAndroid::NotifySuggestionsReceived( |
| 341 const AutocompleteResult& autocomplete_result) { | 337 const AutocompleteResult& autocomplete_result) { |
| 342 JNIEnv* env = AttachCurrentThread(); | 338 JNIEnv* env = AttachCurrentThread(); |
| 343 ScopedJavaLocalRef<jobject> java_bridge = | 339 ScopedJavaLocalRef<jobject> java_bridge = |
| 344 weak_java_autocomplete_controller_android_.get(env); | 340 weak_java_autocomplete_controller_android_.get(env); |
| 345 if (!java_bridge.obj()) | 341 if (!java_bridge.obj()) |
| 346 return; | 342 return; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 366 ConvertUTF16ToJavaString(env, inline_autocomplete_text); | 362 ConvertUTF16ToJavaString(env, inline_autocomplete_text); |
| 367 jlong j_autocomplete_result = | 363 jlong j_autocomplete_result = |
| 368 reinterpret_cast<intptr_t>(&(autocomplete_result)); | 364 reinterpret_cast<intptr_t>(&(autocomplete_result)); |
| 369 Java_AutocompleteController_onSuggestionsReceived(env, | 365 Java_AutocompleteController_onSuggestionsReceived(env, |
| 370 java_bridge.obj(), | 366 java_bridge.obj(), |
| 371 suggestion_list_obj.obj(), | 367 suggestion_list_obj.obj(), |
| 372 inline_text.obj(), | 368 inline_text.obj(), |
| 373 j_autocomplete_result); | 369 j_autocomplete_result); |
| 374 } | 370 } |
| 375 | 371 |
| 372 AutocompleteInput::PageClassification |
| 373 AutocompleteControllerAndroid::ClassifyPage(const GURL& gurl, |
| 374 bool is_query_in_omnibox, |
| 375 bool focused_from_fakebox) const { |
| 376 if (!gurl.is_valid()) |
| 377 return AutocompleteInput::INVALID_SPEC; |
| 378 |
| 379 const std::string& url = gurl.spec(); |
| 380 |
| 381 if (gurl.SchemeIs(content::kChromeUIScheme) && |
| 382 gurl.host() == chrome::kChromeUINewTabHost) { |
| 383 return AutocompleteInput::NTP; |
| 384 } |
| 385 |
| 386 if (url == chrome::kChromeUINativeNewTabURL) { |
| 387 return focused_from_fakebox ? |
| 388 AutocompleteInput::INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS : |
| 389 AutocompleteInput::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS; |
| 390 } |
| 391 |
| 392 if (url == content::kAboutBlankURL) |
| 393 return AutocompleteInput::BLANK; |
| 394 |
| 395 if (url == profile_->GetPrefs()->GetString(prefs::kHomePage)) |
| 396 return AutocompleteInput::HOME_PAGE; |
| 397 |
| 398 if (is_query_in_omnibox) |
| 399 return AutocompleteInput::SEARCH_RESULT_PAGE_DOING_SEARCH_TERM_REPLACEMENT; |
| 400 |
| 401 bool is_search_url = TemplateURLServiceFactory::GetForProfile(profile_)-> |
| 402 IsSearchResultsPageFromDefaultSearchProvider(gurl); |
| 403 if (is_search_url) |
| 404 return AutocompleteInput::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT; |
| 405 |
| 406 return AutocompleteInput::OTHER; |
| 407 } |
| 408 |
| 376 ScopedJavaLocalRef<jobject> | 409 ScopedJavaLocalRef<jobject> |
| 377 AutocompleteControllerAndroid::BuildOmniboxSuggestion( | 410 AutocompleteControllerAndroid::BuildOmniboxSuggestion( |
| 378 JNIEnv* env, | 411 JNIEnv* env, |
| 379 const AutocompleteMatch& match) { | 412 const AutocompleteMatch& match) { |
| 380 ScopedJavaLocalRef<jstring> contents = | 413 ScopedJavaLocalRef<jstring> contents = |
| 381 ConvertUTF16ToJavaString(env, match.contents); | 414 ConvertUTF16ToJavaString(env, match.contents); |
| 382 ScopedJavaLocalRef<jstring> description = | 415 ScopedJavaLocalRef<jstring> description = |
| 383 ConvertUTF16ToJavaString(env, match.description); | 416 ConvertUTF16ToJavaString(env, match.description); |
| 384 ScopedJavaLocalRef<jstring> answer_contents = | 417 ScopedJavaLocalRef<jstring> answer_contents = |
| 385 ConvertUTF16ToJavaString(env, match.answer_contents); | 418 ConvertUTF16ToJavaString(env, match.answer_contents); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 413 if (profile_ == NULL) | 446 if (profile_ == NULL) |
| 414 return base::string16(); | 447 return base::string16(); |
| 415 | 448 |
| 416 std::string languages( | 449 std::string languages( |
| 417 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); | 450 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
| 418 | 451 |
| 419 return net::FormatUrl(url, languages, net::kFormatUrlOmitAll, | 452 return net::FormatUrl(url, languages, net::kFormatUrlOmitAll, |
| 420 net::UnescapeRule::SPACES, NULL, NULL, NULL); | 453 net::UnescapeRule::SPACES, NULL, NULL, NULL); |
| 421 } | 454 } |
| 422 | 455 |
| 423 AutocompleteInput::PageClassification | 456 ScopedJavaLocalRef<jobject> |
| 424 AutocompleteControllerAndroid::ClassifyPage(const GURL& gurl, | 457 AutocompleteControllerAndroid::GetTopSynchronousResult( |
| 425 bool is_query_in_omnibox, | 458 JNIEnv* env, |
| 426 bool focused_from_fakebox) const { | 459 jobject obj, |
| 427 if (!gurl.is_valid()) | 460 jstring j_text, |
| 428 return AutocompleteInput::INVALID_SPEC; | 461 bool prevent_inline_autocomplete) { |
| 462 if (!autocomplete_controller_) |
| 463 return ScopedJavaLocalRef<jobject>(); |
| 429 | 464 |
| 430 const std::string& url = gurl.spec(); | 465 inside_synchronous_start_ = true; |
| 466 Start(env, |
| 467 obj, |
| 468 j_text, |
| 469 NULL, |
| 470 NULL, |
| 471 prevent_inline_autocomplete, |
| 472 false, |
| 473 false, |
| 474 false); |
| 475 inside_synchronous_start_ = false; |
| 476 DCHECK(autocomplete_controller_->done()); |
| 477 const AutocompleteResult& result = autocomplete_controller_->result(); |
| 478 if (result.empty()) |
| 479 return ScopedJavaLocalRef<jobject>(); |
| 431 | 480 |
| 432 if (gurl.SchemeIs(content::kChromeUIScheme) && | 481 return BuildOmniboxSuggestion(env, *result.begin()); |
| 433 gurl.host() == chrome::kChromeUINewTabHost) { | |
| 434 return AutocompleteInput::NTP; | |
| 435 } | |
| 436 if (url == chrome::kChromeUINativeNewTabURL) { | |
| 437 return focused_from_fakebox ? | |
| 438 AutocompleteInput::INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS : | |
| 439 AutocompleteInput::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS; | |
| 440 } | |
| 441 if (url == content::kAboutBlankURL) | |
| 442 return AutocompleteInput::BLANK; | |
| 443 | |
| 444 if (url == profile_->GetPrefs()->GetString(prefs::kHomePage)) | |
| 445 return AutocompleteInput::HOME_PAGE; | |
| 446 if (is_query_in_omnibox) | |
| 447 return AutocompleteInput::SEARCH_RESULT_PAGE_DOING_SEARCH_TERM_REPLACEMENT; | |
| 448 | |
| 449 bool is_search_url = TemplateURLServiceFactory::GetForProfile(profile_)-> | |
| 450 IsSearchResultsPageFromDefaultSearchProvider(gurl); | |
| 451 if (is_search_url) | |
| 452 return AutocompleteInput::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT; | |
| 453 return AutocompleteInput::OTHER; | |
| 454 } | 482 } |
| 455 | 483 |
| 456 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) { | 484 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) { |
| 457 Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); | 485 Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); |
| 458 if (!profile) | 486 if (!profile) |
| 459 return 0; | 487 return 0; |
| 460 | 488 |
| 461 AutocompleteControllerAndroid* native_bridge = | 489 AutocompleteControllerAndroid* native_bridge = |
| 462 AutocompleteControllerAndroid::Factory::GetForProfile(profile, env, obj); | 490 AutocompleteControllerAndroid::Factory::GetForProfile(profile, env, obj); |
| 463 return reinterpret_cast<intptr_t>(native_bridge); | 491 return reinterpret_cast<intptr_t>(native_bridge); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 return; | 527 return; |
| 500 | 528 |
| 501 // ZeroSuggestPrefetcher deletes itself after it's done prefetching. | 529 // ZeroSuggestPrefetcher deletes itself after it's done prefetching. |
| 502 new ZeroSuggestPrefetcher(profile); | 530 new ZeroSuggestPrefetcher(profile); |
| 503 } | 531 } |
| 504 | 532 |
| 505 // Register native methods | 533 // Register native methods |
| 506 bool RegisterAutocompleteControllerAndroid(JNIEnv* env) { | 534 bool RegisterAutocompleteControllerAndroid(JNIEnv* env) { |
| 507 return RegisterNativesImpl(env); | 535 return RegisterNativesImpl(env); |
| 508 } | 536 } |
| OLD | NEW |