diff options
author | hashimoto <hashimoto@chromium.org> | 2014-08-25 21:29:20 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-26 04:30:34 +0000 |
commit | 663b9f47b6611de54f4e358d50baf7e91717c41c (patch) | |
tree | 8e0c128e9b90781bfbd4589948ce0c7070a18f09 | |
parent | 6c82304c0db1734715cc40f1a6a8b0548ab75491 (diff) | |
download | chromium_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.cc | 5 | ||||
-rw-r--r-- | chrome/browser/autocomplete/base_search_provider.cc | 73 | ||||
-rw-r--r-- | chrome/browser/autocomplete/base_search_provider.h | 10 | ||||
-rw-r--r-- | chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.cc | 97 | ||||
-rw-r--r-- | chrome/browser/autocomplete/chrome_autocomplete_provider_delegate.h | 46 | ||||
-rw-r--r-- | chrome/browser/autocomplete/search_provider.cc | 56 | ||||
-rw-r--r-- | chrome/browser/autocomplete/search_provider.h | 4 | ||||
-rw-r--r-- | chrome/browser/autocomplete/search_provider_unittest.cc | 39 | ||||
-rw-r--r-- | chrome/browser/autocomplete/zero_suggest_provider.cc | 11 | ||||
-rw-r--r-- | chrome/browser/autocomplete/zero_suggest_provider.h | 2 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | components/omnibox.gypi | 1 | ||||
-rw-r--r-- | components/omnibox/DEPS | 1 | ||||
-rw-r--r-- | components/omnibox/autocomplete_provider_delegate.h | 73 |
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_ |