| 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 29 matching lines...) Expand all Loading... |
| 40 #include "jni/AutocompleteController_jni.h" | 40 #include "jni/AutocompleteController_jni.h" |
| 41 #include "net/base/escape.h" | 41 #include "net/base/escape.h" |
| 42 #include "net/base/net_util.h" | 42 #include "net/base/net_util.h" |
| 43 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 43 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| 44 #include "ui/base/resource/resource_bundle.h" | 44 #include "ui/base/resource/resource_bundle.h" |
| 45 | 45 |
| 46 using base::android::AttachCurrentThread; | 46 using base::android::AttachCurrentThread; |
| 47 using base::android::ConvertJavaStringToUTF16; | 47 using base::android::ConvertJavaStringToUTF16; |
| 48 using base::android::ConvertUTF8ToJavaString; | 48 using base::android::ConvertUTF8ToJavaString; |
| 49 using base::android::ConvertUTF16ToJavaString; | 49 using base::android::ConvertUTF16ToJavaString; |
| 50 using metrics::OmniboxEventProto; |
| 50 | 51 |
| 51 namespace { | 52 namespace { |
| 52 | 53 |
| 53 const int kAndroidAutocompleteProviders = | 54 const int kAndroidAutocompleteProviders = |
| 54 AutocompleteClassifier::kDefaultOmniboxProviders; | 55 AutocompleteClassifier::kDefaultOmniboxProviders; |
| 55 | 56 |
| 56 /** | 57 /** |
| 57 * A prefetcher class responsible for triggering zero suggest prefetch. | 58 * A prefetcher class responsible for triggering zero suggest prefetch. |
| 58 * The prefetch occurs as a side-effect of calling StartZeroSuggest() on | 59 * The prefetch occurs as a side-effect of calling StartZeroSuggest() on |
| 59 * the AutocompleteController object. | 60 * the AutocompleteController object. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 78 AutocompleteProvider::TYPE_ZERO_SUGGEST)) { | 79 AutocompleteProvider::TYPE_ZERO_SUGGEST)) { |
| 79 // Creating an arbitrary fake_request_source to avoid passing in an invalid | 80 // Creating an arbitrary fake_request_source to avoid passing in an invalid |
| 80 // AutocompleteInput object. | 81 // AutocompleteInput object. |
| 81 base::string16 fake_request_source(base::ASCIIToUTF16( | 82 base::string16 fake_request_source(base::ASCIIToUTF16( |
| 82 "http://www.foobarbazblah.com")); | 83 "http://www.foobarbazblah.com")); |
| 83 controller_->StartZeroSuggest(AutocompleteInput( | 84 controller_->StartZeroSuggest(AutocompleteInput( |
| 84 fake_request_source, | 85 fake_request_source, |
| 85 base::string16::npos, | 86 base::string16::npos, |
| 86 base::string16(), | 87 base::string16(), |
| 87 GURL(fake_request_source), | 88 GURL(fake_request_source), |
| 88 AutocompleteInput::INVALID_SPEC, | 89 OmniboxEventProto::INVALID_SPEC, |
| 89 false, | 90 false, |
| 90 false, | 91 false, |
| 91 true, | 92 true, |
| 92 true)); | 93 true)); |
| 93 // Delete ourselves after 10s. This is enough time to cache results or | 94 // Delete ourselves after 10s. This is enough time to cache results or |
| 94 // give up if the results haven't been received. | 95 // give up if the results haven't been received. |
| 95 expire_timer_.Start(FROM_HERE, | 96 expire_timer_.Start(FROM_HERE, |
| 96 base::TimeDelta::FromMilliseconds(10000), | 97 base::TimeDelta::FromMilliseconds(10000), |
| 97 this, &ZeroSuggestPrefetcher::SelfDestruct); | 98 this, &ZeroSuggestPrefetcher::SelfDestruct); |
| 98 } | 99 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 if (!autocomplete_controller_) | 132 if (!autocomplete_controller_) |
| 132 return; | 133 return; |
| 133 | 134 |
| 134 base::string16 desired_tld; | 135 base::string16 desired_tld; |
| 135 GURL current_url; | 136 GURL current_url; |
| 136 if (j_current_url != NULL) | 137 if (j_current_url != NULL) |
| 137 current_url = GURL(ConvertJavaStringToUTF16(env, j_current_url)); | 138 current_url = GURL(ConvertJavaStringToUTF16(env, j_current_url)); |
| 138 if (j_desired_tld != NULL) | 139 if (j_desired_tld != NULL) |
| 139 desired_tld = ConvertJavaStringToUTF16(env, j_desired_tld); | 140 desired_tld = ConvertJavaStringToUTF16(env, j_desired_tld); |
| 140 base::string16 text = ConvertJavaStringToUTF16(env, j_text); | 141 base::string16 text = ConvertJavaStringToUTF16(env, j_text); |
| 141 AutocompleteInput::PageClassification page_classification = | 142 OmniboxEventProto::PageClassification page_classification = |
| 142 AutocompleteInput::OTHER; | 143 OmniboxEventProto::OTHER; |
| 143 input_ = AutocompleteInput(text, | 144 input_ = AutocompleteInput(text, |
| 144 base::string16::npos, | 145 base::string16::npos, |
| 145 desired_tld, | 146 desired_tld, |
| 146 current_url, | 147 current_url, |
| 147 page_classification, | 148 page_classification, |
| 148 prevent_inline_autocomplete, | 149 prevent_inline_autocomplete, |
| 149 prefer_keyword, | 150 prefer_keyword, |
| 150 allow_exact_keyword_match, | 151 allow_exact_keyword_match, |
| 151 want_asynchronous_matches); | 152 want_asynchronous_matches); |
| 152 autocomplete_controller_->Start(input_); | 153 autocomplete_controller_->Start(input_); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 JNIEnv* env, | 202 JNIEnv* env, |
| 202 jobject obj, | 203 jobject obj, |
| 203 jint selected_index, | 204 jint selected_index, |
| 204 jstring j_current_url, | 205 jstring j_current_url, |
| 205 jboolean is_query_in_omnibox, | 206 jboolean is_query_in_omnibox, |
| 206 jboolean focused_from_fakebox, | 207 jboolean focused_from_fakebox, |
| 207 jlong elapsed_time_since_first_modified, | 208 jlong elapsed_time_since_first_modified, |
| 208 jobject j_web_contents) { | 209 jobject j_web_contents) { |
| 209 base::string16 url = ConvertJavaStringToUTF16(env, j_current_url); | 210 base::string16 url = ConvertJavaStringToUTF16(env, j_current_url); |
| 210 const GURL current_url = GURL(url); | 211 const GURL current_url = GURL(url); |
| 211 AutocompleteInput::PageClassification current_page_classification = | 212 OmniboxEventProto::PageClassification current_page_classification = |
| 212 ClassifyPage(current_url, is_query_in_omnibox, focused_from_fakebox); | 213 ClassifyPage(current_url, is_query_in_omnibox, focused_from_fakebox); |
| 213 const base::TimeTicks& now(base::TimeTicks::Now()); | 214 const base::TimeTicks& now(base::TimeTicks::Now()); |
| 214 content::WebContents* web_contents = | 215 content::WebContents* web_contents = |
| 215 content::WebContents::FromJavaWebContents(j_web_contents); | 216 content::WebContents::FromJavaWebContents(j_web_contents); |
| 216 | 217 |
| 217 OmniboxLog log( | 218 OmniboxLog log( |
| 218 input_.text(), | 219 input_.text(), |
| 219 false, /* don't know */ | 220 false, /* don't know */ |
| 220 input_.type(), | 221 input_.type(), |
| 221 true, | 222 true, |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 ConvertUTF16ToJavaString(env, inline_autocomplete_text); | 363 ConvertUTF16ToJavaString(env, inline_autocomplete_text); |
| 363 jlong j_autocomplete_result = | 364 jlong j_autocomplete_result = |
| 364 reinterpret_cast<intptr_t>(&(autocomplete_result)); | 365 reinterpret_cast<intptr_t>(&(autocomplete_result)); |
| 365 Java_AutocompleteController_onSuggestionsReceived(env, | 366 Java_AutocompleteController_onSuggestionsReceived(env, |
| 366 java_bridge.obj(), | 367 java_bridge.obj(), |
| 367 suggestion_list_obj.obj(), | 368 suggestion_list_obj.obj(), |
| 368 inline_text.obj(), | 369 inline_text.obj(), |
| 369 j_autocomplete_result); | 370 j_autocomplete_result); |
| 370 } | 371 } |
| 371 | 372 |
| 372 AutocompleteInput::PageClassification | 373 OmniboxEventProto::PageClassification |
| 373 AutocompleteControllerAndroid::ClassifyPage(const GURL& gurl, | 374 AutocompleteControllerAndroid::ClassifyPage(const GURL& gurl, |
| 374 bool is_query_in_omnibox, | 375 bool is_query_in_omnibox, |
| 375 bool focused_from_fakebox) const { | 376 bool focused_from_fakebox) const { |
| 376 if (!gurl.is_valid()) | 377 if (!gurl.is_valid()) |
| 377 return AutocompleteInput::INVALID_SPEC; | 378 return OmniboxEventProto::INVALID_SPEC; |
| 378 | 379 |
| 379 const std::string& url = gurl.spec(); | 380 const std::string& url = gurl.spec(); |
| 380 | 381 |
| 381 if (gurl.SchemeIs(content::kChromeUIScheme) && | 382 if (gurl.SchemeIs(content::kChromeUIScheme) && |
| 382 gurl.host() == chrome::kChromeUINewTabHost) { | 383 gurl.host() == chrome::kChromeUINewTabHost) { |
| 383 return AutocompleteInput::NTP; | 384 return OmniboxEventProto::NTP; |
| 384 } | 385 } |
| 385 | 386 |
| 386 if (url == chrome::kChromeUINativeNewTabURL) { | 387 if (url == chrome::kChromeUINativeNewTabURL) { |
| 387 return focused_from_fakebox ? | 388 return focused_from_fakebox ? |
| 388 AutocompleteInput::INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS : | 389 OmniboxEventProto::INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS : |
| 389 AutocompleteInput::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS; | 390 OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS; |
| 390 } | 391 } |
| 391 | 392 |
| 392 if (url == url::kAboutBlankURL) | 393 if (url == url::kAboutBlankURL) |
| 393 return AutocompleteInput::BLANK; | 394 return OmniboxEventProto::BLANK; |
| 394 | 395 |
| 395 if (url == profile_->GetPrefs()->GetString(prefs::kHomePage)) | 396 if (url == profile_->GetPrefs()->GetString(prefs::kHomePage)) |
| 396 return AutocompleteInput::HOME_PAGE; | 397 return OmniboxEventProto::HOME_PAGE; |
| 397 | 398 |
| 398 if (is_query_in_omnibox) | 399 if (is_query_in_omnibox) |
| 399 return AutocompleteInput::SEARCH_RESULT_PAGE_DOING_SEARCH_TERM_REPLACEMENT; | 400 return OmniboxEventProto::SEARCH_RESULT_PAGE_DOING_SEARCH_TERM_REPLACEMENT; |
| 400 | 401 |
| 401 bool is_search_url = TemplateURLServiceFactory::GetForProfile(profile_)-> | 402 bool is_search_url = TemplateURLServiceFactory::GetForProfile(profile_)-> |
| 402 IsSearchResultsPageFromDefaultSearchProvider(gurl); | 403 IsSearchResultsPageFromDefaultSearchProvider(gurl); |
| 403 if (is_search_url) | 404 if (is_search_url) |
| 404 return AutocompleteInput::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT; | 405 return OmniboxEventProto::SEARCH_RESULT_PAGE_NO_SEARCH_TERM_REPLACEMENT; |
| 405 | 406 |
| 406 return AutocompleteInput::OTHER; | 407 return OmniboxEventProto::OTHER; |
| 407 } | 408 } |
| 408 | 409 |
| 409 ScopedJavaLocalRef<jobject> | 410 ScopedJavaLocalRef<jobject> |
| 410 AutocompleteControllerAndroid::BuildOmniboxSuggestion( | 411 AutocompleteControllerAndroid::BuildOmniboxSuggestion( |
| 411 JNIEnv* env, | 412 JNIEnv* env, |
| 412 const AutocompleteMatch& match) { | 413 const AutocompleteMatch& match) { |
| 413 ScopedJavaLocalRef<jstring> contents = | 414 ScopedJavaLocalRef<jstring> contents = |
| 414 ConvertUTF16ToJavaString(env, match.contents); | 415 ConvertUTF16ToJavaString(env, match.contents); |
| 415 ScopedJavaLocalRef<jstring> description = | 416 ScopedJavaLocalRef<jstring> description = |
| 416 ConvertUTF16ToJavaString(env, match.description); | 417 ConvertUTF16ToJavaString(env, match.description); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 JNIEnv* env, jclass clazz, jstring jquery) { | 496 JNIEnv* env, jclass clazz, jstring jquery) { |
| 496 Profile* profile = ProfileManager::GetActiveUserProfile(); | 497 Profile* profile = ProfileManager::GetActiveUserProfile(); |
| 497 if (!profile) | 498 if (!profile) |
| 498 return NULL; | 499 return NULL; |
| 499 AutocompleteMatch match; | 500 AutocompleteMatch match; |
| 500 base::string16 query_string(ConvertJavaStringToUTF16(env, jquery)); | 501 base::string16 query_string(ConvertJavaStringToUTF16(env, jquery)); |
| 501 AutocompleteClassifierFactory::GetForProfile(profile)->Classify( | 502 AutocompleteClassifierFactory::GetForProfile(profile)->Classify( |
| 502 query_string, | 503 query_string, |
| 503 false, | 504 false, |
| 504 false, | 505 false, |
| 505 AutocompleteInput::INVALID_SPEC, | 506 OmniboxEventProto::INVALID_SPEC, |
| 506 &match, | 507 &match, |
| 507 NULL); | 508 NULL); |
| 508 if (!match.destination_url.is_valid()) | 509 if (!match.destination_url.is_valid()) |
| 509 return NULL; | 510 return NULL; |
| 510 | 511 |
| 511 // Only return a URL if the match is a URL type. | 512 // Only return a URL if the match is a URL type. |
| 512 if (match.type != AutocompleteMatchType::URL_WHAT_YOU_TYPED && | 513 if (match.type != AutocompleteMatchType::URL_WHAT_YOU_TYPED && |
| 513 match.type != AutocompleteMatchType::HISTORY_URL && | 514 match.type != AutocompleteMatchType::HISTORY_URL && |
| 514 match.type != AutocompleteMatchType::NAVSUGGEST) | 515 match.type != AutocompleteMatchType::NAVSUGGEST) |
| 515 return NULL; | 516 return NULL; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 527 return; | 528 return; |
| 528 | 529 |
| 529 // ZeroSuggestPrefetcher deletes itself after it's done prefetching. | 530 // ZeroSuggestPrefetcher deletes itself after it's done prefetching. |
| 530 new ZeroSuggestPrefetcher(profile); | 531 new ZeroSuggestPrefetcher(profile); |
| 531 } | 532 } |
| 532 | 533 |
| 533 // Register native methods | 534 // Register native methods |
| 534 bool RegisterAutocompleteControllerAndroid(JNIEnv* env) { | 535 bool RegisterAutocompleteControllerAndroid(JNIEnv* env) { |
| 535 return RegisterNativesImpl(env); | 536 return RegisterNativesImpl(env); |
| 536 } | 537 } |
| OLD | NEW |