summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhashimoto <hashimoto@chromium.org>2014-08-25 21:29:20 -0700
committerCommit bot <commit-bot@chromium.org>2014-08-26 04:30:34 +0000
commit663b9f47b6611de54f4e358d50baf7e91717c41c (patch)
tree8e0c128e9b90781bfbd4589948ce0c7070a18f09
parent6c82304c0db1734715cc40f1a6a8b0548ab75491 (diff)
downloadchromium_src-663b9f47b6611de54f4e358d50baf7e91717c41c.zip
chromium_src-663b9f47b6611de54f4e358d50baf7e91717c41c.tar.gz
chromium_src-663b9f47b6611de54f4e358d50baf7e91717c41c.tar.bz2
Introduce AutocompleteProviderDelegate
This delegate isolates SearchProvider from chrome dependencies Add AutocompleteProviderDelegate and its chrome implementation ChromeAutocompleteProviderDelegate. BUG=388515 TBR=blundell@chromium.org for the new DEPS line Review URL: https://codereview.chromium.org/500023002 Cr-Commit-Position: refs/heads/master@{#291839}
-rw-r--r--chrome/browser/autocomplete/autocomplete_controller.cc5
-rw-r--r--chrome/browser/autocomplete/base_search_provider.cc73
-rw-r--r--chrome/browser/autocomplete/base_search_provider.h10
-rw-r--r--chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.cc97
-rw-r--r--chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h46
-rw-r--r--chrome/browser/autocomplete/search_provider.cc56
-rw-r--r--chrome/browser/autocomplete/search_provider.h4
-rw-r--r--chrome/browser/autocomplete/search_provider_unittest.cc39
-rw-r--r--chrome/browser/autocomplete/zero_suggest_provider.cc11
-rw-r--r--chrome/browser/autocomplete/zero_suggest_provider.h2
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--components/omnibox.gypi1
-rw-r--r--components/omnibox/DEPS1
-rw-r--r--components/omnibox/autocomplete_provider_delegate.h73
14 files changed, 307 insertions, 113 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_controller.cc b/chrome/browser/autocomplete/autocomplete_controller.cc
index 020c983..0535cdb 100644
--- a/chrome/browser/autocomplete/autocomplete_controller.cc
+++ b/chrome/browser/autocomplete/autocomplete_controller.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/autocomplete/autocomplete_controller_delegate.h"
#include "chrome/browser/autocomplete/bookmark_provider.h"
#include "chrome/browser/autocomplete/builtin_provider.h"
+#include "chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h"
#include "chrome/browser/autocomplete/history_quick_provider.h"
#include "chrome/browser/autocomplete/history_url_provider.h"
#include "chrome/browser/autocomplete/search_provider.h"
@@ -208,7 +209,9 @@ AutocompleteController::AutocompleteController(
}
#endif
if (provider_types & AutocompleteProvider::TYPE_SEARCH) {
- search_provider_ = new SearchProvider(this, template_url_service, profile);
+ search_provider_ = new SearchProvider(
+ this, template_url_service, scoped_ptr<AutocompleteProviderDelegate>(
+ new ChromeAutocompleteProviderDelegate(profile)));
providers_.push_back(search_provider_);
}
if (provider_types & AutocompleteProvider::TYPE_SHORTCUTS)
diff --git a/chrome/browser/autocomplete/base_search_provider.cc b/chrome/browser/autocomplete/base_search_provider.cc
index e1a0522..71a7049 100644
--- a/chrome/browser/autocomplete/base_search_provider.cc
+++ b/chrome/browser/autocomplete/base_search_provider.cc
@@ -5,28 +5,16 @@
#include "chrome/browser/autocomplete/base_search_provider.h"
#include "base/i18n/case_conversion.h"
-#include "base/prefs/pref_registry_simple.h"
-#include "base/prefs/pref_service.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
-#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h"
-#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h"
-#include "chrome/browser/history/history_service.h"
-#include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/sync/profile_sync_service.h"
-#include "chrome/browser/sync/profile_sync_service_factory.h"
-#include "chrome/common/pref_names.h"
#include "components/metrics/proto/omnibox_event.pb.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/omnibox_field_trial.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_prepopulate_data.h"
#include "components/search_engines/template_url_service.h"
-#include "components/sync_driver/sync_prefs.h"
-#include "net/base/escape.h"
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_fetcher_delegate.h"
@@ -45,7 +33,7 @@ class SuggestionDeletionHandler : public net::URLFetcherDelegate {
SuggestionDeletionHandler(
const std::string& deletion_url,
- Profile* profile,
+ net::URLRequestContextGetter* request_context,
const DeletionCompletedCallback& callback);
virtual ~SuggestionDeletionHandler();
@@ -62,7 +50,7 @@ class SuggestionDeletionHandler : public net::URLFetcherDelegate {
SuggestionDeletionHandler::SuggestionDeletionHandler(
const std::string& deletion_url,
- Profile* profile,
+ net::URLRequestContextGetter* request_context,
const DeletionCompletedCallback& callback) : callback_(callback) {
GURL url(deletion_url);
DCHECK(url.is_valid());
@@ -72,7 +60,7 @@ SuggestionDeletionHandler::SuggestionDeletionHandler(
url,
net::URLFetcher::GET,
this));
- deletion_fetcher_->SetRequestContext(profile->GetRequestContext());
+ deletion_fetcher_->SetRequestContext(request_context);
deletion_fetcher_->Start();
}
@@ -94,12 +82,13 @@ const int BaseSearchProvider::kDefaultProviderURLFetcherID = 1;
const int BaseSearchProvider::kKeywordProviderURLFetcherID = 2;
const int BaseSearchProvider::kDeletionURLFetcherID = 3;
-BaseSearchProvider::BaseSearchProvider(TemplateURLService* template_url_service,
- Profile* profile,
- AutocompleteProvider::Type type)
+BaseSearchProvider::BaseSearchProvider(
+ TemplateURLService* template_url_service,
+ scoped_ptr<AutocompleteProviderDelegate> delegate,
+ AutocompleteProvider::Type type)
: AutocompleteProvider(type),
template_url_service_(template_url_service),
- profile_(profile),
+ delegate_(delegate.Pass()),
field_trial_triggered_(false),
field_trial_triggered_in_session_(false) {
}
@@ -132,20 +121,18 @@ void BaseSearchProvider::DeleteMatch(const AutocompleteMatch& match) {
if (!match.GetAdditionalInfo(BaseSearchProvider::kDeletionUrlKey).empty()) {
deletion_handlers_.push_back(new SuggestionDeletionHandler(
match.GetAdditionalInfo(BaseSearchProvider::kDeletionUrlKey),
- profile_,
+ delegate_->RequestContext(),
base::Bind(&BaseSearchProvider::OnDeletionComplete,
base::Unretained(this))));
}
- HistoryService* const history_service =
- HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
TemplateURL* template_url =
match.GetTemplateURL(template_url_service_, false);
// This may be NULL if the template corresponding to the keyword has been
// deleted or there is no keyword set.
if (template_url != NULL) {
- history_service->DeleteMatchingURLsForKeyword(template_url->id(),
- match.contents);
+ delegate_->DeleteMatchingURLsForKeywordFromHistory(template_url->id(),
+ match.contents);
}
// Immediately update the list of matches to show the match was deleted,
@@ -286,7 +273,7 @@ bool BaseSearchProvider::ZeroSuggestEnabled(
const TemplateURL* template_url,
OmniboxEventProto::PageClassification page_classification,
const SearchTermsData& search_terms_data,
- Profile* profile) {
+ AutocompleteProviderDelegate* delegate) {
if (!OmniboxFieldTrial::InZeroSuggestFieldTrial())
return false;
@@ -304,13 +291,12 @@ bool BaseSearchProvider::ZeroSuggestEnabled(
OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS))
return false;
- // Don't run if there's no profile or in incognito mode.
- if (profile == NULL || profile->IsOffTheRecord())
+ // Don't run if in incognito mode.
+ if (delegate->IsOffTheRecord())
return false;
// Don't run if we can't get preferences or search suggest is not enabled.
- PrefService* prefs = profile->GetPrefs();
- if (!prefs->GetBoolean(prefs::kSearchSuggestEnabled))
+ if (!delegate->SearchSuggestEnabled())
return false;
// Only make the request if we know that the provider supports zero suggest
@@ -331,9 +317,9 @@ bool BaseSearchProvider::CanSendURL(
const TemplateURL* template_url,
OmniboxEventProto::PageClassification page_classification,
const SearchTermsData& search_terms_data,
- Profile* profile) {
+ AutocompleteProviderDelegate* delegate) {
if (!ZeroSuggestEnabled(suggest_url, template_url, page_classification,
- search_terms_data, profile))
+ search_terms_data, delegate))
return false;
if (!current_page_url.is_valid())
@@ -348,15 +334,7 @@ bool BaseSearchProvider::CanSendURL(
net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES)))
return false;
- // Check field trials and settings allow sending the URL on suggest requests.
- ProfileSyncService* service =
- ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile);
- sync_driver::SyncPrefs sync_prefs(profile->GetPrefs());
- if (service == NULL ||
- !service->IsSyncEnabledAndLoggedIn() ||
- !sync_prefs.GetPreferredDataTypes(syncer::UserTypes()).Has(
- syncer::PROXY_TABS) ||
- service->GetEncryptedDataTypes().Has(syncer::SESSIONS))
+ if (!delegate->TabSyncEnabledAndUnencrypted())
return false;
return true;
@@ -376,8 +354,7 @@ void BaseSearchProvider::AddMatchToMap(
ShouldAppendExtraParams(result));
if (!match.destination_url.is_valid())
return;
- match.search_terms_args->bookmark_bar_pinned =
- profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
+ match.search_terms_args->bookmark_bar_pinned = delegate_->ShowBookmarkBar();
match.RecordAdditionalInfo(kRelevanceFromServerKey,
result.relevance_from_server() ? kTrue : kFalse);
match.RecordAdditionalInfo(kShouldPrefetchKey,
@@ -447,18 +424,14 @@ bool BaseSearchProvider::ParseSuggestResults(
SearchSuggestionParser::Results* results) {
if (!SearchSuggestionParser::ParseSuggestResults(
root_val, GetInput(is_keyword_result),
- ChromeAutocompleteSchemeClassifier(profile_), default_result_relevance,
- profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
- is_keyword_result, results))
+ delegate_->SchemeClassifier(), default_result_relevance,
+ delegate_->AcceptLanguages(), is_keyword_result, results))
return false;
- BitmapFetcherService* image_service =
- BitmapFetcherServiceFactory::GetForBrowserContext(profile_);
- DCHECK(image_service);
for (std::vector<GURL>::const_iterator it =
results->answers_image_urls.begin();
it != results->answers_image_urls.end(); ++it)
- image_service->Prefetch(*it);
+ delegate_->PrefetchImage(*it);
field_trial_triggered_ |= results->field_trial_triggered;
field_trial_triggered_in_session_ |= results->field_trial_triggered;
diff --git a/chrome/browser/autocomplete/base_search_provider.h b/chrome/browser/autocomplete/base_search_provider.h
index fbcebc7..477da0a 100644
--- a/chrome/browser/autocomplete/base_search_provider.h
+++ b/chrome/browser/autocomplete/base_search_provider.h
@@ -22,8 +22,8 @@
#include "components/omnibox/autocomplete_provider.h"
#include "components/omnibox/search_suggestion_parser.h"
+class AutocompleteProviderDelegate;
class GURL;
-class Profile;
class SearchTermsData;
class SuggestionDeletionHandler;
class TemplateURL;
@@ -50,7 +50,7 @@ class BaseSearchProvider : public AutocompleteProvider {
static const int kDeletionURLFetcherID;
BaseSearchProvider(TemplateURLService* template_url_service,
- Profile* profile,
+ scoped_ptr<AutocompleteProviderDelegate> delegate,
AutocompleteProvider::Type type);
// Returns whether |match| is flagged as a query that should be prefetched.
@@ -145,7 +145,7 @@ class BaseSearchProvider : public AutocompleteProvider {
const TemplateURL* template_url,
metrics::OmniboxEventProto::PageClassification page_classification,
const SearchTermsData& search_terms_data,
- Profile* profile);
+ AutocompleteProviderDelegate* delegate);
// Returns whether we can send the URL of the current page in any suggest
// requests. Doing this requires that all the following hold:
@@ -169,7 +169,7 @@ class BaseSearchProvider : public AutocompleteProvider {
const TemplateURL* template_url,
metrics::OmniboxEventProto::PageClassification page_classification,
const SearchTermsData& search_terms_data,
- Profile* profile);
+ AutocompleteProviderDelegate* delegate);
// If the |deletion_url| is valid, then set |match.deletable| to true and
// save the |deletion_url| into the |match|'s additional info under
@@ -221,7 +221,7 @@ class BaseSearchProvider : public AutocompleteProvider {
virtual void RecordDeletionResult(bool success) = 0;
TemplateURLService* template_url_service_;
- Profile* profile_;
+ scoped_ptr<AutocompleteProviderDelegate> delegate_;
// Whether a field trial, if any, has triggered in the most recent
// autocomplete query. This field is set to true only if the suggestion
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.cc
new file mode 100644
index 0000000..87f2465
--- /dev/null
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.cc
@@ -0,0 +1,97 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h"
+
+#include "base/prefs/pref_service.h"
+#include "chrome/browser/autocomplete/autocomplete_classifier.h"
+#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
+#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h"
+#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h"
+#include "chrome/browser/history/history_service.h"
+#include "chrome/browser/history/history_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sync/profile_sync_service.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/common/pref_names.h"
+
+ChromeAutocompleteProviderDelegate::ChromeAutocompleteProviderDelegate(
+ Profile* profile)
+ : profile_(profile),
+ scheme_classifier_(profile) {
+}
+
+ChromeAutocompleteProviderDelegate::~ChromeAutocompleteProviderDelegate() {
+}
+
+net::URLRequestContextGetter*
+ChromeAutocompleteProviderDelegate::RequestContext() {
+ return profile_->GetRequestContext();
+}
+
+bool ChromeAutocompleteProviderDelegate::IsOffTheRecord() {
+ return profile_->IsOffTheRecord();
+}
+
+std::string ChromeAutocompleteProviderDelegate::AcceptLanguages() {
+ return profile_->GetPrefs()->GetString(prefs::kAcceptLanguages);
+}
+
+bool ChromeAutocompleteProviderDelegate::SearchSuggestEnabled() {
+ return profile_->GetPrefs()->GetBoolean(prefs::kSearchSuggestEnabled);
+}
+
+bool ChromeAutocompleteProviderDelegate::ShowBookmarkBar() {
+ return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
+}
+
+const AutocompleteSchemeClassifier&
+ChromeAutocompleteProviderDelegate::SchemeClassifier() {
+ return scheme_classifier_;
+}
+
+void ChromeAutocompleteProviderDelegate::Classify(
+ const base::string16& text,
+ bool prefer_keyword,
+ bool allow_exact_keyword_match,
+ metrics::OmniboxEventProto::PageClassification page_classification,
+ AutocompleteMatch* match,
+ GURL* alternate_nav_url) {
+ AutocompleteClassifierFactory::GetForProfile(profile_)->Classify(
+ text, prefer_keyword, allow_exact_keyword_match, page_classification,
+ match, alternate_nav_url);
+}
+
+history::URLDatabase* ChromeAutocompleteProviderDelegate::InMemoryDatabase() {
+ HistoryService* history_service =
+ HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
+ return history_service ? history_service->InMemoryDatabase() : NULL;
+}
+
+void
+ChromeAutocompleteProviderDelegate::DeleteMatchingURLsForKeywordFromHistory(
+ history::KeywordID keyword_id,
+ const base::string16& term) {
+ HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS)
+ ->DeleteMatchingURLsForKeyword(keyword_id, term);
+}
+
+bool ChromeAutocompleteProviderDelegate::TabSyncEnabledAndUnencrypted() {
+ // Check field trials and settings allow sending the URL on suggest requests.
+ ProfileSyncService* service =
+ ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
+ sync_driver::SyncPrefs sync_prefs(profile_->GetPrefs());
+ return service &&
+ service->IsSyncEnabledAndLoggedIn() &&
+ sync_prefs.GetPreferredDataTypes(syncer::UserTypes()).Has(
+ syncer::PROXY_TABS) &&
+ !service->GetEncryptedDataTypes().Has(syncer::SESSIONS);
+}
+
+void ChromeAutocompleteProviderDelegate::PrefetchImage(const GURL& url) {
+ BitmapFetcherService* image_service =
+ BitmapFetcherServiceFactory::GetForBrowserContext(profile_);
+ DCHECK(image_service);
+ image_service->Prefetch(url);
+}
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h b/chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h
new file mode 100644
index 0000000..8d3b467
--- /dev/null
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h
@@ -0,0 +1,46 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_AUTOCOMPLETE_CHROME_AUTOCOMPLETE_PROVIDER_DELEGATE_H_
+#define CHROME_BROWSER_AUTOCOMPLETE_CHROME_AUTOCOMPLETE_PROVIDER_DELEGATE_H_
+
+#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
+#include "components/omnibox/autocomplete_provider_delegate.h"
+
+class Profile;
+
+class ChromeAutocompleteProviderDelegate : public AutocompleteProviderDelegate {
+ public:
+ explicit ChromeAutocompleteProviderDelegate(Profile* profile);
+ virtual ~ChromeAutocompleteProviderDelegate();
+
+ // AutocompleteProviderDelegate:
+ virtual net::URLRequestContextGetter* RequestContext() OVERRIDE;
+ virtual bool IsOffTheRecord() OVERRIDE;
+ virtual std::string AcceptLanguages() OVERRIDE;
+ virtual bool SearchSuggestEnabled() OVERRIDE;
+ virtual bool ShowBookmarkBar() OVERRIDE;
+ virtual const AutocompleteSchemeClassifier& SchemeClassifier() OVERRIDE;
+ virtual void Classify(
+ const base::string16& text,
+ bool prefer_keyword,
+ bool allow_exact_keyword_match,
+ metrics::OmniboxEventProto::PageClassification page_classification,
+ AutocompleteMatch* match,
+ GURL* alternate_nav_url) OVERRIDE;
+ virtual history::URLDatabase* InMemoryDatabase() OVERRIDE;
+ virtual void DeleteMatchingURLsForKeywordFromHistory(
+ history::KeywordID keyword_id,
+ const base::string16& term) OVERRIDE;
+ virtual bool TabSyncEnabledAndUnencrypted() OVERRIDE;
+ virtual void PrefetchImage(const GURL& url) OVERRIDE;
+
+ private:
+ Profile* profile_;
+ ChromeAutocompleteSchemeClassifier scheme_classifier_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChromeAutocompleteProviderDelegate);
+};
+
+#endif // CHROME_BROWSER_AUTOCOMPLETE_CHROME_AUTOCOMPLETE_PROVIDER_DELEGATE_H_
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 @@ class SearchProvider::CompareScoredResults {
// 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 @@ void SearchProvider::Start(const AutocompleteInput& input,
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 @@ void SearchProvider::UpdateMatchContentsClass(
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 @@ void SearchProvider::DoHistoryQuery(bool minimal_changes) {
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 @@ bool SearchProvider::IsQuerySuitableForSuggest() const {
// 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 @@ net::URLFetcher* SearchProvider::CreateSuggestFetcher(
// 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* SearchProvider::CreateSuggestFetcher(
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 @@ SearchSuggestionParser::SuggestResults SearchProvider::ScoreHistoryResults(
// 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 @@ AutocompleteMatch SearchProvider::NavigationToMatch(
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 @@ AutocompleteMatch SearchProvider::NavigationToMatch(
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) {
diff --git a/chrome/browser/autocomplete/search_provider.h b/chrome/browser/autocomplete/search_provider.h
index 8ee4bd8..26ed2df 100644
--- a/chrome/browser/autocomplete/search_provider.h
+++ b/chrome/browser/autocomplete/search_provider.h
@@ -22,9 +22,9 @@
#include "components/search_engines/template_url.h"
#include "net/url_request/url_fetcher_delegate.h"
+class AutocompleteProviderDelegate;
class AutocompleteProviderListener;
class AutocompleteResult;
-class Profile;
class SearchProviderTest;
class TemplateURLService;
@@ -51,7 +51,7 @@ class SearchProvider : public BaseSearchProvider,
public:
SearchProvider(AutocompleteProviderListener* listener,
TemplateURLService* template_url_service,
- Profile* profile);
+ scoped_ptr<AutocompleteProviderDelegate> delegate);
// Extracts the suggest response metadata which SearchProvider previously
// stored for |match|.
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index 3afcbac..bdc9243 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -18,6 +18,7 @@
#include "build/build_config.h"
#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
#include "chrome/browser/autocomplete/autocomplete_controller.h"
+#include "chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h"
#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
#include "chrome/browser/autocomplete/history_url_provider.h"
#include "chrome/browser/history/history_service.h"
@@ -86,7 +87,9 @@ SearchProviderForTest::SearchProviderForTest(
AutocompleteProviderListener* listener,
TemplateURLService* template_url_service,
Profile* profile)
- : SearchProvider(listener, template_url_service, profile),
+ : SearchProvider(listener, template_url_service,
+ scoped_ptr<AutocompleteProviderDelegate>(
+ new ChromeAutocompleteProviderDelegate(profile))),
is_success_(false) {
}
@@ -2945,11 +2948,13 @@ TEST_F(SearchProviderTest, CanSendURL) {
// Create field trial.
CreateZeroSuggestFieldTrial(true);
+ ChromeAutocompleteProviderDelegate delegate(&profile_);
+
// Not signed in.
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
SigninManagerBase* signin = SigninManagerFactory::GetForProfile(&profile_);
signin->SetAuthenticatedUsername("test");
@@ -2957,7 +2962,7 @@ TEST_F(SearchProviderTest, CanSendURL) {
EXPECT_TRUE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
// Not in field trial.
ResetFieldTrialList();
@@ -2965,7 +2970,7 @@ TEST_F(SearchProviderTest, CanSendURL) {
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
ResetFieldTrialList();
CreateZeroSuggestFieldTrial(true);
@@ -2973,61 +2978,63 @@ TEST_F(SearchProviderTest, CanSendURL) {
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("badpageurl"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
// Invalid page classification.
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
metrics::OmniboxEventProto::INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS,
- SearchTermsData(), &profile_));
+ SearchTermsData(), &delegate));
// Invalid page classification.
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS,
- SearchTermsData(), &profile_));
+ SearchTermsData(), &delegate));
// HTTPS page URL on same domain as provider.
EXPECT_TRUE(SearchProvider::CanSendURL(
GURL("https://www.google.com/search"),
GURL("https://www.google.com/complete/search"),
&google_template_url, metrics::OmniboxEventProto::OTHER,
- SearchTermsData(), &profile_));
+ SearchTermsData(), &delegate));
// Non-HTTP[S] page URL on same domain as provider.
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("ftp://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
// Non-HTTP page URL on different domain.
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("https://www.notgoogle.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
// Non-HTTPS provider.
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("http://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
// Suggest disabled.
profile_.GetPrefs()->SetBoolean(prefs::kSearchSuggestEnabled, false);
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
profile_.GetPrefs()->SetBoolean(prefs::kSearchSuggestEnabled, true);
// Incognito.
+ ChromeAutocompleteProviderDelegate delegate_incognito(
+ profile_.GetOffTheRecordProfile());
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
metrics::OmniboxEventProto::OTHER, SearchTermsData(),
- profile_.GetOffTheRecordProfile()));
+ &delegate_incognito));
// Tab sync not enabled.
profile_.GetPrefs()->SetBoolean(sync_driver::prefs::kSyncKeepEverythingSynced,
@@ -3036,7 +3043,7 @@ TEST_F(SearchProviderTest, CanSendURL) {
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
profile_.GetPrefs()->SetBoolean(sync_driver::prefs::kSyncTabs, true);
// Tab sync is encrypted.
@@ -3048,7 +3055,7 @@ TEST_F(SearchProviderTest, CanSendURL) {
EXPECT_FALSE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
encrypted_types.Remove(syncer::SESSIONS);
service->OnEncryptedTypesChanged(encrypted_types, false);
@@ -3056,7 +3063,7 @@ TEST_F(SearchProviderTest, CanSendURL) {
EXPECT_TRUE(SearchProvider::CanSendURL(
GURL("http://www.google.com/search"),
GURL("https://www.google.com/complete/search"), &google_template_url,
- metrics::OmniboxEventProto::OTHER, SearchTermsData(), &profile_));
+ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &delegate));
}
TEST_F(SearchProviderTest, TestDeleteMatch) {
diff --git a/chrome/browser/autocomplete/zero_suggest_provider.cc b/chrome/browser/autocomplete/zero_suggest_provider.cc
index 6886770..9820e71 100644
--- a/chrome/browser/autocomplete/zero_suggest_provider.cc
+++ b/chrome/browser/autocomplete/zero_suggest_provider.cc
@@ -16,6 +16,7 @@
#include "base/time/time.h"
#include "chrome/browser/autocomplete/autocomplete_classifier.h"
#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
+#include "chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h"
#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
#include "chrome/browser/autocomplete/history_url_provider.h"
#include "chrome/browser/autocomplete/search_provider.h"
@@ -118,7 +119,7 @@ void ZeroSuggestProvider::Start(const AutocompleteInput& input,
// No need to send the current page URL in personalized suggest field trial.
if (CanSendURL(input.current_url(), suggest_url, default_provider,
current_page_classification_,
- template_url_service_->search_terms_data(), profile_) &&
+ template_url_service_->search_terms_data(), delegate_.get()) &&
!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) {
// Update suggest_url to include the current_page_url.
search_term_args.current_page_url = current_query_;
@@ -183,9 +184,12 @@ ZeroSuggestProvider::ZeroSuggestProvider(
AutocompleteProviderListener* listener,
TemplateURLService* template_url_service,
Profile* profile)
- : BaseSearchProvider(template_url_service, profile,
+ : BaseSearchProvider(template_url_service,
+ scoped_ptr<AutocompleteProviderDelegate>(
+ new ChromeAutocompleteProviderDelegate(profile)),
AutocompleteProvider::TYPE_ZERO_SUGGEST),
listener_(listener),
+ profile_(profile),
results_from_cache_(false),
weak_ptr_factory_(this) {
}
@@ -426,7 +430,8 @@ bool ZeroSuggestProvider::CanShowZeroSuggestWithoutSendingURL(
if (!ZeroSuggestEnabled(suggest_url,
template_url_service_->GetDefaultSearchProvider(),
current_page_classification_,
- template_url_service_->search_terms_data(), profile_))
+ template_url_service_->search_terms_data(),
+ delegate_.get()))
return false;
// If we cannot send URLs, then only the MostVisited and Personalized
diff --git a/chrome/browser/autocomplete/zero_suggest_provider.h b/chrome/browser/autocomplete/zero_suggest_provider.h
index 869a3da..ec24a3f 100644
--- a/chrome/browser/autocomplete/zero_suggest_provider.h
+++ b/chrome/browser/autocomplete/zero_suggest_provider.h
@@ -19,6 +19,7 @@
#include "net/url_request/url_fetcher_delegate.h"
class AutocompleteProviderListener;
+class Profile;
class TemplateURLService;
namespace base {
@@ -129,6 +130,7 @@ class ZeroSuggestProvider : public BaseSearchProvider,
void MaybeUseCachedSuggestions();
AutocompleteProviderListener* listener_;
+ Profile* profile_;
// The URL for which a suggestion fetch is pending.
std::string current_query_;
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 88483be..41134c8 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -141,6 +141,8 @@
'browser/autocomplete/bookmark_provider.h',
'browser/autocomplete/builtin_provider.cc',
'browser/autocomplete/builtin_provider.h',
+ 'browser/autocomplete/chrome_autocomplete_provider_delegate.cc',
+ 'browser/autocomplete/chrome_autocomplete_provider_delegate.h',
'browser/autocomplete/chrome_autocomplete_scheme_classifier.cc',
'browser/autocomplete/chrome_autocomplete_scheme_classifier.h',
'browser/autocomplete/history_provider.cc',
diff --git a/components/omnibox.gypi b/components/omnibox.gypi
index f7401b5..314fccd 100644
--- a/components/omnibox.gypi
+++ b/components/omnibox.gypi
@@ -34,6 +34,7 @@
'omnibox/autocomplete_match_type.h',
'omnibox/autocomplete_provider.cc',
'omnibox/autocomplete_provider.h',
+ 'omnibox/autocomplete_provider_delegate.h',
'omnibox/autocomplete_provider_listener.h',
'omnibox/autocomplete_result.cc',
'omnibox/autocomplete_result.h',
diff --git a/components/omnibox/DEPS b/components/omnibox/DEPS
index df87bb8..7163423 100644
--- a/components/omnibox/DEPS
+++ b/components/omnibox/DEPS
@@ -1,4 +1,5 @@
include_rules = [
+ "+components/history",
"+components/metrics/proto",
"+components/search",
"+components/search_engines",
diff --git a/components/omnibox/autocomplete_provider_delegate.h b/components/omnibox/autocomplete_provider_delegate.h
new file mode 100644
index 0000000..ef4d060
--- /dev/null
+++ b/components/omnibox/autocomplete_provider_delegate.h
@@ -0,0 +1,73 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_OMNIBOX_AUTOCOMPLETE_PROVIDER_DELEGATE_H_
+#define COMPONENTS_OMNIBOX_AUTOCOMPLETE_PROVIDER_DELEGATE_H_
+
+#include "base/strings/string16.h"
+#include "components/history/core/browser/keyword_id.h"
+#include "components/metrics/proto/omnibox_event.pb.h"
+
+struct AutocompleteMatch;
+class AutocompleteSchemeClassifier;
+class GURL;
+
+namespace history {
+class URLDatabase;
+}
+
+namespace net {
+class URLRequestContextGetter;
+}
+
+class AutocompleteProviderDelegate {
+ public:
+ virtual ~AutocompleteProviderDelegate() {}
+
+ // Returns the request context.
+ virtual net::URLRequestContextGetter* RequestContext() = 0;
+
+ // Returns whether the provider should work in incognito mode.
+ virtual bool IsOffTheRecord() = 0;
+
+ // The value to use for Accept-Languages HTTP header when making an HTTP
+ // request.
+ virtual std::string AcceptLanguages() = 0;
+
+ // Returns true when suggest support is enabled.
+ virtual bool SearchSuggestEnabled() = 0;
+
+ // Returns whether the bookmark bar is visible on all tabs.
+ virtual bool ShowBookmarkBar() = 0;
+
+ // Returns the scheme classifier.
+ virtual const AutocompleteSchemeClassifier& SchemeClassifier() = 0;
+
+ // Given some string |text| that the user wants to use for navigation,
+ // determines how it should be interpreted.
+ virtual void Classify(
+ const base::string16& text,
+ bool prefer_keyword,
+ bool allow_exact_keyword_match,
+ metrics::OmniboxEventProto::PageClassification page_classification,
+ AutocompleteMatch* match,
+ GURL* alternate_nav_url) = 0;
+
+ // Returns the in-memory URL database.
+ virtual history::URLDatabase* InMemoryDatabase() = 0;
+
+ // Deletes all URL and search term entries matching the given |term| and
+ // |keyword_id| from history.
+ virtual void DeleteMatchingURLsForKeywordFromHistory(
+ history::KeywordID keyword_id,
+ const base::string16& term) = 0;
+
+ // Returns whether the user has tab sync enabled and tab sync is unencrypted.
+ virtual bool TabSyncEnabledAndUnencrypted() = 0;
+
+ // Starts prefetching the image at the given |url|.
+ virtual void PrefetchImage(const GURL& url) = 0;
+};
+
+#endif // COMPONENTS_OMNIBOX_AUTOCOMPLETE_PROVIDER_DELEGATE_H_