Introduce AutocompleteProviderDelegate
This delegate isolates SearchProvider from chrome dependencies
Add AutocompleteProviderDelegate and its chrome implementation ChromeAutocompleteProviderDelegate.
BUG=388515
[email protected] for the new DEPS line
Review URL: https://codereview.chromium.org/500023002
Cr-Commit-Position: refs/heads/master@{#291839}
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
index c206483..9017252 100644
--- a/chrome/browser/autocomplete/search_provider.cc
+++ b/chrome/browser/autocomplete/search_provider.cc
@@ -9,28 +9,18 @@
#include "base/base64.h"
#include "base/callback.h"
-#include "base/command_line.h"
#include "base/i18n/break_iterator.h"
#include "base/i18n/case_conversion.h"
#include "base/json/json_string_value_serializer.h"
-#include "base/message_loop/message_loop.h"
#include "base/metrics/histogram.h"
#include "base/metrics/user_metrics.h"
-#include "base/prefs/pref_service.h"
#include "base/rand_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/autocomplete/autocomplete_classifier.h"
-#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
-#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
-#include "chrome/browser/history/history_service.h"
-#include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/pref_names.h"
-#include "components/google/core/browser/google_util.h"
#include "components/history/core/browser/in_memory_database.h"
#include "components/history/core/browser/keyword_search_term.h"
#include "components/metrics/proto/omnibox_input_type.pb.h"
+#include "components/omnibox/autocomplete_provider_delegate.h"
#include "components/omnibox/autocomplete_provider_listener.h"
#include "components/omnibox/autocomplete_result.h"
#include "components/omnibox/keyword_provider.h"
@@ -129,10 +119,11 @@
// static
int SearchProvider::kMinimumTimeBetweenSuggestQueriesMs = 100;
-SearchProvider::SearchProvider(AutocompleteProviderListener* listener,
- TemplateURLService* template_url_service,
- Profile* profile)
- : BaseSearchProvider(template_url_service, profile,
+SearchProvider::SearchProvider(
+ AutocompleteProviderListener* listener,
+ TemplateURLService* template_url_service,
+ scoped_ptr<AutocompleteProviderDelegate> delegate)
+ : BaseSearchProvider(template_url_service, delegate.Pass(),
AutocompleteProvider::TYPE_SEARCH),
listener_(listener),
suggest_results_pending_(0),
@@ -182,8 +173,8 @@
matches_.clear();
field_trial_triggered_ = false;
- // Can't return search/suggest results for bogus input or without a profile.
- if (!profile_ || (input.type() == metrics::OmniboxInputType::INVALID)) {
+ // Can't return search/suggest results for bogus input.
+ if (input.type() == metrics::OmniboxInputType::INVALID) {
Stop(true);
return;
}
@@ -341,8 +332,7 @@
sug_it != results->suggest_results.end(); ++sug_it) {
sug_it->ClassifyMatchContents(false, input_text);
}
- const std::string languages(
- profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
+ const std::string languages(delegate_->AcceptLanguages());
for (SearchSuggestionParser::NavigationResults::iterator nav_it =
results->navigation_results.begin();
nav_it != results->navigation_results.end(); ++nav_it) {
@@ -483,10 +473,7 @@
input_.current_page_classification()))
return;
- HistoryService* const history_service =
- HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
- history::URLDatabase* url_db = history_service ?
- history_service->InMemoryDatabase() : NULL;
+ history::URLDatabase* url_db = delegate_->InMemoryDatabase();
if (!url_db)
return;
@@ -567,10 +554,10 @@
// if the user has disabled it.
const TemplateURL* default_url = providers_.GetDefaultProviderURL();
const TemplateURL* keyword_url = providers_.GetKeywordProviderURL();
- if (profile_->IsOffTheRecord() ||
+ if (delegate_->IsOffTheRecord() ||
((!default_url || default_url->suggestions_url().empty()) &&
(!keyword_url || keyword_url->suggestions_url().empty())) ||
- !profile_->GetPrefs()->GetBoolean(prefs::kSearchSuggestEnabled))
+ !delegate_->SearchSuggestEnabled())
return false;
// If the input type might be a URL, we take extra care so that private data
@@ -691,7 +678,7 @@
// the user is in the field trial.
if (CanSendURL(current_page_url_, suggest_url, template_url,
input.current_page_classification(),
- template_url_service_->search_terms_data(), profile_) &&
+ template_url_service_->search_terms_data(), delegate_.get()) &&
OmniboxFieldTrial::InZeroSuggestAfterTypingFieldTrial()) {
search_term_args.current_page_url = current_page_url_.spec();
// Create the suggest URL again with the current page URL.
@@ -705,12 +692,12 @@
net::URLFetcher* fetcher =
net::URLFetcher::Create(id, suggest_url, net::URLFetcher::GET, this);
- fetcher->SetRequestContext(profile_->GetRequestContext());
+ fetcher->SetRequestContext(delegate_->RequestContext());
fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES);
// Add Chrome experiment state to the request headers.
net::HttpRequestHeaders headers;
variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders(
- fetcher->GetOriginalURL(), profile_->IsOffTheRecord(), false, &headers);
+ fetcher->GetOriginalURL(), delegate_->IsOffTheRecord(), false, &headers);
fetcher->SetExtraRequestHeaders(headers.ToString());
fetcher->Start();
return fetcher;
@@ -993,14 +980,12 @@
// likely the user has no expectation that term should be interpreted as
// as a URL, so we need not do anything special to preserve user
// expectation.
- AutocompleteClassifier* classifier =
- AutocompleteClassifierFactory::GetForProfile(profile_);
int last_relevance = 0;
if (!base_prevent_inline_autocomplete && !found_what_you_typed_match &&
- classifier && (scored_results.front().relevance() >= 1200)) {
+ scored_results.front().relevance() >= 1200) {
AutocompleteMatch match;
- classifier->Classify(scored_results.front().suggestion(), false, false,
- input_.current_page_classification(), &match, NULL);
+ delegate_->Classify(scored_results.front().suggestion(), false, false,
+ input_.current_page_classification(), &match, NULL);
// Demote this match that would normally be interpreted as a URL to have
// the highest score a previously-issued search query could have when
// scoring with the non-aggressive method. A consequence of demoting
@@ -1170,8 +1155,7 @@
const net::FormatUrlTypes format_types =
net::kFormatUrlOmitAll & ~(trim_http ? 0 : net::kFormatUrlOmitHTTP);
- const std::string languages(
- profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
+ const std::string languages(delegate_->AcceptLanguages());
size_t inline_autocomplete_offset = (prefix == NULL) ?
base::string16::npos : (match_start + input.length());
match.fill_into_edit +=
@@ -1180,7 +1164,7 @@
net::FormatUrl(navigation.url(), languages, format_types,
net::UnescapeRule::SPACES, NULL, NULL,
&inline_autocomplete_offset),
- ChromeAutocompleteSchemeClassifier(profile_));
+ delegate_->SchemeClassifier());
// Preserve the forced query '?' prefix in |match.fill_into_edit|.
// Otherwise, user edits to a suggestion would show non-Search results.
if (input_.type() == metrics::OmniboxInputType::FORCED_QUERY) {