diff options
19 files changed, 63 insertions, 28 deletions
diff --git a/athena/extensions/shell/url_search_provider.cc b/athena/extensions/shell/url_search_provider.cc index 7cc066d..9019c17 100644 --- a/athena/extensions/shell/url_search_provider.cc +++ b/athena/extensions/shell/url_search_provider.cc @@ -223,7 +223,8 @@ UrlSearchProvider::UrlSearchProvider(content::BrowserContext* browser_context) UrlSearchProvider::~UrlSearchProvider() { } -void UrlSearchProvider::Start(const base::string16& query) { +void UrlSearchProvider::Start(bool /*is_voice_query*/, + const base::string16& query) { const bool minimal_changes = query == input_.text(); input_ = AutocompleteInput(query, base::string16::npos /* cursor_position */, diff --git a/athena/extensions/shell/url_search_provider.h b/athena/extensions/shell/url_search_provider.h index 4782481..32d03d0 100644 --- a/athena/extensions/shell/url_search_provider.h +++ b/athena/extensions/shell/url_search_provider.h @@ -28,7 +28,7 @@ class UrlSearchProvider : public app_list::SearchProvider, ~UrlSearchProvider() override; // Overridden from app_list::SearchProvider - void Start(const base::string16& query) override; + void Start(bool is_voice_query, const base::string16& query) override; void Stop() override; // Overridden from AutocompleteProviderListener diff --git a/chrome/browser/ui/app_list/search/app_search_provider.cc b/chrome/browser/ui/app_list/search/app_search_provider.cc index a7d7fa8..4314933 100644 --- a/chrome/browser/ui/app_list/search/app_search_provider.cc +++ b/chrome/browser/ui/app_list/search/app_search_provider.cc @@ -59,7 +59,8 @@ AppSearchProvider::AppSearchProvider(Profile* profile, AppSearchProvider::~AppSearchProvider() {} -void AppSearchProvider::Start(const base::string16& query) { +void AppSearchProvider::Start(bool /*is_voice_query*/, + const base::string16& query) { query_ = query; const TokenizedString query_terms(query); diff --git a/chrome/browser/ui/app_list/search/app_search_provider.h b/chrome/browser/ui/app_list/search/app_search_provider.h index 5b74ff1..eb014f5 100644 --- a/chrome/browser/ui/app_list/search/app_search_provider.h +++ b/chrome/browser/ui/app_list/search/app_search_provider.h @@ -38,7 +38,7 @@ class AppSearchProvider : public SearchProvider, ~AppSearchProvider() override; // SearchProvider overrides: - void Start(const base::string16& query) override; + void Start(bool is_voice_query, const base::string16& query) override; void Stop() override; private: diff --git a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc index b548936..7b34130 100644 --- a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc +++ b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc @@ -45,7 +45,7 @@ class AppSearchProviderTest : public AppListTestBase { } std::string RunQuery(const std::string& query) { - app_search_->Start(base::UTF8ToUTF16(query)); + app_search_->Start(false, base::UTF8ToUTF16(query)); // Sort results by relevance. std::vector<SearchResult*> sorted_results; diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc index 3c5eb9c..0e83e9e 100644 --- a/chrome/browser/ui/app_list/search/omnibox_provider.cc +++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ui/app_list/search/omnibox_provider.h" +#include "base/strings/utf_string_conversions.h" #include "chrome/browser/autocomplete/autocomplete_classifier.h" #include "chrome/browser/autocomplete/autocomplete_controller.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" @@ -19,11 +20,17 @@ #include "grit/theme_resources.h" #include "ui/app_list/search_result.h" #include "ui/base/resource/resource_bundle.h" +#include "url/gurl.h" +#include "url/url_canon.h" namespace app_list { namespace { +// The Omnibox keyword for Google search. This is correct even if the user is +// using an international domain (such as google.com.au). +const char kGoogleSearchKeyword[] = "google.com"; + int ACMatchStyleToTagStyle(int styles) { int tag_styles = 0; if (styles & ACMatchClassification::URL) @@ -67,15 +74,27 @@ void ACMatchClassificationsToTags( } } +// Converts a Google Search URL into a spoken feedback URL, by adding query +// parameters. |search_url| must be a Google Search URL. +GURL MakeGoogleSearchSpokenFeedbackUrl(const GURL& search_url) { + std::string query = search_url.query(); + query += "&gs_ivs=1"; + GURL::Replacements replacements; + replacements.SetQueryStr(query); + return search_url.ReplaceComponents(replacements); +} + class OmniboxResult : public SearchResult { public: OmniboxResult(Profile* profile, AppListControllerDelegate* list_controller, AutocompleteController* autocomplete_controller, + bool is_voice_query, const AutocompleteMatch& match) : profile_(profile), list_controller_(list_controller), autocomplete_controller_(autocomplete_controller), + is_voice_query_(is_voice_query), match_(match) { if (match_.search_terms_args) { match_.search_terms_args->from_app_list = true; @@ -108,15 +127,19 @@ class OmniboxResult : public SearchResult { // SearchResult overrides: void Open(int event_flags) override { RecordHistogram(OMNIBOX_SEARCH_RESULT); - list_controller_->OpenURL(profile_, - match_.destination_url, - match_.transition, + GURL url = match_.destination_url; + if (is_voice_query_ && + base::UTF16ToUTF8(match_.keyword) == kGoogleSearchKeyword) { + url = MakeGoogleSearchSpokenFeedbackUrl(url); + } + list_controller_->OpenURL(profile_, url, match_.transition, ui::DispositionFromEventFlags(event_flags)); } scoped_ptr<SearchResult> Duplicate() override { - return scoped_ptr<SearchResult>(new OmniboxResult( - profile_, list_controller_, autocomplete_controller_, match_)); + return scoped_ptr<SearchResult>( + new OmniboxResult(profile_, list_controller_, autocomplete_controller_, + is_voice_query_, match_)); } private: @@ -150,6 +173,7 @@ class OmniboxResult : public SearchResult { Profile* profile_; AppListControllerDelegate* list_controller_; AutocompleteController* autocomplete_controller_; + bool is_voice_query_; AutocompleteMatch match_; DISALLOW_COPY_AND_ASSIGN(OmniboxResult); @@ -166,12 +190,14 @@ OmniboxProvider::OmniboxProvider(Profile* profile, TemplateURLServiceFactory::GetForProfile(profile), this, AutocompleteClassifier::kDefaultOmniboxProviders & - ~AutocompleteProvider::TYPE_ZERO_SUGGEST)) { + ~AutocompleteProvider::TYPE_ZERO_SUGGEST)), + is_voice_query_(false) { } OmniboxProvider::~OmniboxProvider() {} -void OmniboxProvider::Start(const base::string16& query) { +void OmniboxProvider::Start(bool is_voice_query, const base::string16& query) { + is_voice_query_ = is_voice_query; controller_->Start(AutocompleteInput( query, base::string16::npos, std::string(), GURL(), metrics::OmniboxEventProto::INVALID_SPEC, false, false, true, true, @@ -180,6 +206,7 @@ void OmniboxProvider::Start(const base::string16& query) { void OmniboxProvider::Stop() { controller_->Stop(false); + is_voice_query_ = false; } void OmniboxProvider::PopulateFromACResult(const AutocompleteResult& result) { @@ -190,8 +217,8 @@ void OmniboxProvider::PopulateFromACResult(const AutocompleteResult& result) { if (!it->destination_url.is_valid()) continue; - Add(scoped_ptr<SearchResult>( - new OmniboxResult(profile_, list_controller_, controller_.get(), *it))); + Add(scoped_ptr<SearchResult>(new OmniboxResult( + profile_, list_controller_, controller_.get(), is_voice_query_, *it))); } } diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.h b/chrome/browser/ui/app_list/search/omnibox_provider.h index 56c13d4..a7a8c76 100644 --- a/chrome/browser/ui/app_list/search/omnibox_provider.h +++ b/chrome/browser/ui/app_list/search/omnibox_provider.h @@ -26,7 +26,7 @@ class OmniboxProvider : public SearchProvider, ~OmniboxProvider() override; // SearchProvider overrides: - void Start(const base::string16& query) override; + void Start(bool is_voice_query, const base::string16& query) override; void Stop() override; private: @@ -43,6 +43,9 @@ class OmniboxProvider : public SearchProvider, // eliminates the results as they come in. scoped_ptr<AutocompleteController> controller_; + // Whether the current query is a voice query. + bool is_voice_query_; + DISALLOW_COPY_AND_ASSIGN(OmniboxProvider); }; diff --git a/chrome/browser/ui/app_list/search/people/people_provider.cc b/chrome/browser/ui/app_list/search/people/people_provider.cc index fa11118..1677b18 100644 --- a/chrome/browser/ui/app_list/search/people/people_provider.cc +++ b/chrome/browser/ui/app_list/search/people/people_provider.cc @@ -54,7 +54,8 @@ PeopleProvider::PeopleProvider(Profile* profile, PeopleProvider::~PeopleProvider() {} -void PeopleProvider::Start(const base::string16& query) { +void PeopleProvider::Start(bool /*is_voice_query*/, + const base::string16& query) { ClearResults(); if (!IsValidQuery(query)) { query_.clear(); diff --git a/chrome/browser/ui/app_list/search/people/people_provider.h b/chrome/browser/ui/app_list/search/people/people_provider.h index dfdda7e..1823109 100644 --- a/chrome/browser/ui/app_list/search/people/people_provider.h +++ b/chrome/browser/ui/app_list/search/people/people_provider.h @@ -37,7 +37,7 @@ class PeopleProvider : public WebserviceSearchProvider, ~PeopleProvider() override; // SearchProvider overrides: - void Start(const base::string16& query) override; + void Start(bool is_voice_query, const base::string16& query) override; void Stop() override; // OAuth2TokenService::Consumer overrides: diff --git a/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc b/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc index 7e4beb9..73979b9 100644 --- a/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc +++ b/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc @@ -191,7 +191,7 @@ class PeopleProviderTest : public InProcessBrowserTest { std::string RunQuery(const std::string& query, const std::string& mock_server_response) { - people_provider_->Start(base::UTF8ToUTF16(query)); + people_provider_->Start(false, base::UTF8ToUTF16(query)); if (people_provider_->people_search_ && !mock_server_response.empty()) { mock_server_response_ = mock_server_response; diff --git a/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.cc b/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.cc index 0e672c3..23599fb 100644 --- a/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.cc +++ b/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.cc @@ -53,7 +53,8 @@ SuggestionsSearchProvider::SuggestionsSearchProvider( SuggestionsSearchProvider::~SuggestionsSearchProvider() { } -void SuggestionsSearchProvider::Start(const base::string16& query) { +void SuggestionsSearchProvider::Start(bool /*is_voice_query*/, + const base::string16& query) { ClearResults(); // If the service is not enabled, do not return any results. if (!suggestions_service_) diff --git a/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.h b/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.h index 8f6ea44..ae68fba 100644 --- a/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.h +++ b/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.h @@ -28,7 +28,7 @@ class SuggestionsSearchProvider : public SearchProvider { ~SuggestionsSearchProvider() override; // SearchProvider overrides: - void Start(const base::string16& query) override; + void Start(bool is_voice_query, const base::string16& query) override; void Stop() override; private: diff --git a/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider_unittest.cc index bdd7ac9..428abe5 100644 --- a/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider_unittest.cc +++ b/chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider_unittest.cc @@ -71,7 +71,7 @@ class SuggestionsSearchProviderTest : public AppListTestBase { } std::string RunQuery(const std::string& query) { - suggestions_search_->Start(base::UTF8ToUTF16(query)); + suggestions_search_->Start(false, base::UTF8ToUTF16(query)); // Sort results from most to least relevant. std::vector<SearchResult*> sorted_results( diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc b/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc index 7b30eea..027999d 100644 --- a/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc +++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc @@ -59,7 +59,8 @@ WebstoreProvider::WebstoreProvider(Profile* profile, WebstoreProvider::~WebstoreProvider() {} -void WebstoreProvider::Start(const base::string16& query) { +void WebstoreProvider::Start(bool /*is_voice_query*/, + const base::string16& query) { ClearResults(); if (!IsValidQuery(query)) { query_.clear(); diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider.h b/chrome/browser/ui/app_list/search/webstore/webstore_provider.h index 8762e84..fcc8d7e 100644 --- a/chrome/browser/ui/app_list/search/webstore/webstore_provider.h +++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider.h @@ -34,7 +34,7 @@ class WebstoreProvider : public WebserviceSearchProvider{ ~WebstoreProvider() override; // SearchProvider overrides: - void Start(const base::string16& query) override; + void Start(bool is_voice_query, const base::string16& query) override; void Stop() override; private: diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc b/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc index 1602bff..3652faa 100644 --- a/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc +++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc @@ -129,7 +129,7 @@ class WebstoreProviderTest : public InProcessBrowserTest { void RunQuery(const std::string& query, const std::string& mock_server_response) { - webstore_provider_->Start(base::UTF8ToUTF16(query)); + webstore_provider_->Start(false, base::UTF8ToUTF16(query)); if (webstore_provider_->webstore_search_ && !mock_server_response.empty()) { mock_server_response_ = mock_server_response; diff --git a/ui/app_list/search/mixer_unittest.cc b/ui/app_list/search/mixer_unittest.cc index 4518c299..5562742 100644 --- a/ui/app_list/search/mixer_unittest.cc +++ b/ui/app_list/search/mixer_unittest.cc @@ -61,7 +61,7 @@ class TestSearchProvider : public SearchProvider { ~TestSearchProvider() override {} // SearchProvider overrides: - void Start(const base::string16& query) override { + void Start(bool is_voice_query, const base::string16& query) override { ClearResults(); for (size_t i = 0; i < count_; ++i) { const std::string id = @@ -116,7 +116,7 @@ class MixerTest : public testing::Test { const base::string16 query; for (size_t i = 0; i < providers_.size(); ++i) { - providers_[i]->Start(query); + providers_[i]->Start(is_voice_query_, query); providers_[i]->Stop(); } diff --git a/ui/app_list/search_controller.cc b/ui/app_list/search_controller.cc index f4960e1..66d7593 100644 --- a/ui/app_list/search_controller.cc +++ b/ui/app_list/search_controller.cc @@ -49,7 +49,7 @@ void SearchController::Start(bool is_voice_query) { for (Providers::iterator it = providers_.begin(); it != providers_.end(); ++it) { - (*it)->Start(query); + (*it)->Start(is_voice_query, query); } dispatching_query_ = false; diff --git a/ui/app_list/search_provider.h b/ui/app_list/search_provider.h index d092c7e..92e8e5b 100644 --- a/ui/app_list/search_provider.h +++ b/ui/app_list/search_provider.h @@ -25,7 +25,7 @@ class APP_LIST_EXPORT SearchProvider { virtual ~SearchProvider(); // Invoked to start a query. - virtual void Start(const base::string16& query) = 0; + virtual void Start(bool is_voice_query, const base::string16& query) = 0; // Invoked to stop the current query and no more results changes. virtual void Stop() = 0; |