172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h" 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/search_provider.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h" 123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/browser/prefs/pref_service.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url_model.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/test_url_fetcher_factory.h" 163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/common/pref_names.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process_test.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_status.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following environment is configured for these tests: 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The TemplateURL default_t_url_ is set as the default provider. 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The TemplateURL keyword_t_url_ is added to the TemplateURLModel. This 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURL has a valid suggest and search URL. 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The URL created by using the search term term1_ with default_t_url_ is 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// added to history. 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The URL created by using the search term keyword_term_ with keyword_t_url_ 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is added to history. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . test_factory_ is set as the URLFetcher::Factory. 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SearchProviderTest : public TestingBrowserProcessTest, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public AutocompleteProvider::ACProviderListener { 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SearchProviderTest() 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : default_t_url_(NULL), 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch term1_(UTF8ToUTF16("term1")), 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_t_url_(NULL), 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_term_(UTF8ToUTF16("keyword")), 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick io_thread_(BrowserThread::IO), 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch quit_when_done_(false) { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread_.Start(); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See description above class for what this registers. 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp(); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void TearDown(); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns an AutocompleteMatch in provider_'s set of matches that matches 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |url|. If there is no matching URL, an empty match is returned. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch FindMatchWithDestination(const GURL& url); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ACProviderListener method. If we're waiting for the provider to finish, 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this exits the message loop. 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnProviderUpdate(bool updated_matches); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Runs a nested message loop until provider_ is done. The message loop is 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // exited by way of OnProviderUPdate. 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RunTillProviderDone(); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Invokes Start on provider_, then runs all pending tasks. 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void QueryForInput(const string16& text, 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool prevent_inline_autocomplete, 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool minimal_changes); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Notifies the URLFetcher for the suggest query corresponding to the default 703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // search provider that it's done. 713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE. 723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void FinishDefaultSuggestQuery(); 733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See description above class for details of these fields. 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL* default_t_url_; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16 term1_; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL term1_url_; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL* keyword_t_url_; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16 keyword_term_; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL keyword_url_; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopForUI message_loop_; 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread io_thread_; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URLFetcher::Factory implementation registered. 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestURLFetcherFactory test_factory_; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Profile we use. 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestingProfile profile_; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The provider. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SearchProvider> provider_; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If true, OnProviderUpdate exits out of the current message loop. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool quit_when_done_; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(SearchProviderTest); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::SetUp() { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SearchProvider::set_query_suggest_immediately(true); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need both the history service and template url model loaded. 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_.CreateHistoryService(true, false); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_.CreateTemplateURLModel(); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLModel* turl_model = profile_.GetTemplateURLModel(); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Reset the default TemplateURL. 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_t_url_ = new TemplateURL(); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_t_url_->SetURL("http://defaultturl/{searchTerms}", 0, 0); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_t_url_->SetSuggestionsURL("http://defaultturl2/{searchTerms}", 0, 0); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch turl_model->Add(default_t_url_); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch turl_model->SetDefaultSearchProvider(default_t_url_); 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TemplateURLID default_provider_id = default_t_url_->id(); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_NE(0, default_provider_id); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add url1, with search term term1_. 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* history = 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch term1_url_ = GURL(default_t_url_->url()->ReplaceSearchTerms( 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *default_t_url_, term1_, 0, string16())); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->AddPageWithDetails(term1_url_, string16(), 1, 1, 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::Time::Now(), false, 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick history::SOURCE_BROWSED); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->SetKeywordSearchTermsForURL(term1_url_, default_t_url_->id(), 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch term1_); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create another TemplateURL. 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_t_url_ = new TemplateURL(); 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen keyword_t_url_->set_keyword(ASCIIToUTF16("k")); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_t_url_->SetURL("http://keyword/{searchTerms}", 0, 0); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_t_url_->SetSuggestionsURL("http://suggest_keyword/{searchTerms}", 0, 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_.GetTemplateURLModel()->Add(keyword_t_url_); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_NE(0, keyword_t_url_->id()); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add a page and search term for keyword_t_url_. 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_url_ = GURL(keyword_t_url_->url()->ReplaceSearchTerms( 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *keyword_t_url_, keyword_term_, 0, string16())); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->AddPageWithDetails(keyword_url_, string16(), 1, 1, 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::Time::Now(), false, 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick history::SOURCE_BROWSED); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->SetKeywordSearchTermsForURL(keyword_url_, keyword_t_url_->id(), 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_term_); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Keywords are updated by the InMemoryHistoryBackend only after the message 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // has been processed on the history thread. Block until history processes all 149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // requests to ensure the InMemoryDatabase is the state we expect it. 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch profile_.BlockUntilHistoryProcessesPendingRequests(); 151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch provider_ = new SearchProvider(this, &profile_); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLFetcher::set_factory(&test_factory_); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::OnProviderUpdate(bool updated_matches) { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (quit_when_done_ && provider_->done()) { 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch quit_when_done_ = false; 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_.Quit(); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::RunTillProviderDone() { 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (provider_->done()) 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch quit_when_done_ = true; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_.Run(); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_.Run(NULL); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid SearchProviderTest::QueryForInput(const string16& text, 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool prevent_inline_autocomplete, 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool minimal_changes) { 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a query. 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput input(text, string16(), prevent_inline_autocomplete, 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen false, true, AutocompleteInput::ALL_MATCHES); 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen provider_->Start(input, minimal_changes); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // RunAllPending so that the task scheduled by SearchProvider to create the 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URLFetchers runs. 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_.RunAllPending(); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::TearDown() { 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_.RunAllPending(); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLFetcher::set_factory(NULL); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Shutdown the provider before the profile. 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch provider_ = NULL; 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutocompleteMatch SearchProviderTest::FindMatchWithDestination( 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (ACMatches::const_iterator i = provider_->matches().begin(); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != provider_->matches().end(); ++i) { 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i->destination_url == url) 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return *i; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return AutocompleteMatch(NULL, 1, false, AutocompleteMatch::HISTORY_URL); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenvoid SearchProviderTest::FinishDefaultSuggestQuery() { 2093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID( 2103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen SearchProvider::kDefaultProviderURLFetcherID); 2113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ASSERT_TRUE(default_fetcher); 2123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 2133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Tell the SearchProvider the default suggest query is done. 2143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen default_fetcher->delegate()->OnURLFetchComplete( 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default_fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(), 2163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen std::string()); 2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 2183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests ----------------------------------------------------------------------- 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure we query history for the default provider and a URLFetcher is 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// created for the default provider suggest results. 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SearchProviderTest, QueryDefaultProvider) { 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 term = term1_.substr(0, term1_.size() - 1); 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(term, false, false); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the default providers suggest service was queried. 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestURLFetcher* fetcher = test_factory_.GetFetcherByID( 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SearchProvider::kDefaultProviderURLFetcherID); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(fetcher); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // And the URL matches what we expected. 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL expected_url = GURL(default_t_url_->suggestions_url()-> 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ReplaceSearchTerms(*default_t_url_, term, 0, string16())); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(fetcher->original_url() == expected_url); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the SearchProvider the suggest query is done. 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fetcher->delegate()->OnURLFetchComplete( 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(), 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string()); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fetcher = NULL; 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run till the history results complete. 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunTillProviderDone(); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The SearchProvider is done. Make sure it has a result for the history 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // term term1. 2483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen AutocompleteMatch term1_match = FindMatchWithDestination(term1_url_); 2493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(!term1_match.destination_url.is_empty()); 2503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Term1 should have a description. 2513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_FALSE(term1_match.description.empty()); 2523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 2533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *default_t_url_, term, 0, string16())); 2553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen AutocompleteMatch what_you_typed_match = 2563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen FindMatchWithDestination(what_you_typed_url); 2573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(!what_you_typed_match.destination_url.is_empty()); 2583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(what_you_typed_match.description.empty()); 2593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 2603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // The match for term1 should be more relevant than the what you typed result. 2613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_GT(term1_match.relevance, what_you_typed_match.relevance); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(SearchProviderTest, HonorPreventInlineAutocomplete) { 2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch string16 term = term1_.substr(0, term1_.size() - 1); 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(term, true, false); 2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_FALSE(provider_->matches().empty()); 2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED, 2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch provider_->matches()[0].type); 2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Issues a query that matches the registered keyword and makes sure history 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is queried as well as URLFetchers getting created. 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SearchProviderTest, QueryKeywordProvider) { 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 term = keyword_term_.substr(0, keyword_term_.size() - 1); 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(keyword_t_url_->keyword() + UTF8ToUTF16(" ") + term, false, 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the default providers suggest service was queried. 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID( 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SearchProvider::kDefaultProviderURLFetcherID); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(default_fetcher); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the SearchProvider the default suggest query is done. 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_fetcher->delegate()->OnURLFetchComplete( 28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default_fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(), 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string()); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_fetcher = NULL; 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the keyword providers suggest service was queried. 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestURLFetcher* keyword_fetcher = test_factory_.GetFetcherByID( 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SearchProvider::kKeywordProviderURLFetcherID); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(keyword_fetcher); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // And the URL matches what we expected. 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL expected_url = GURL(keyword_t_url_->suggestions_url()-> 29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ReplaceSearchTerms(*keyword_t_url_, term, 0, string16())); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(keyword_fetcher->original_url() == expected_url); 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the SearchProvider the keyword suggest query is done. 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_fetcher->delegate()->OnURLFetchComplete( 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen keyword_fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(), 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string()); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch keyword_fetcher = NULL; 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run till the history results complete. 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunTillProviderDone(); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The SearchProvider is done. Make sure it has a result for the history 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // term keyword. 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch match = FindMatchWithDestination(keyword_url_); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(!match.destination_url.is_empty()); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The match should have a TemplateURL. 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(match.template_url); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The fill into edit should contain the keyword. 31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(keyword_t_url_->keyword() + char16(' ') + keyword_term_, 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch match.fill_into_edit); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(SearchProviderTest, DontSendPrivateDataToSuggest) { 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // None of the following input strings should be sent to the suggest server, 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // because they may contain private data. 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* inputs[] = { 3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "username:password", 3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "http://username:password", 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "https://username:password", 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "username:password@hostname", 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "http://username:password@hostname/", 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "file://filename", 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "data://data", 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "unknownscheme:anything", 3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "http://hostname/?query=q", 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "http://hostname/path#ref", 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "https://hostname/path", 3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < arraysize(inputs); ++i) { 34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(ASCIIToUTF16(inputs[i]), false, false); 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Make sure the default providers suggest service was not queried. 3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_factory_.GetFetcherByID( 3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SearchProvider::kDefaultProviderURLFetcherID) == NULL); 3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Run till the history results complete. 3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RunTillProviderDone(); 3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Make sure FinalizeInstantQuery works. 3513f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SearchProviderTest, FinalizeInstantQuery) { 3523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen PrefService* service = profile_.GetPrefs(); 3533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen service->SetBoolean(prefs::kInstantEnabled, true); 3543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(ASCIIToUTF16("foo"), false, false); 3563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Wait until history and the suggest query complete. 3583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen profile_.BlockUntilHistoryProcessesPendingRequests(); 3593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); 3603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // When instant is enabled the provider isn't done until it hears from 3623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // instant. 3633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_FALSE(provider_->done()); 3643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Tell the provider instant is done. 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); 3673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // The provider should now be done. 3693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(provider_->done()); 3703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // There should be two matches, one for what you typed, the other for 3723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // 'foobar'. 3733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_EQ(2u, provider_->matches().size()); 3743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *default_t_url_, ASCIIToUTF16("foobar"), 0, string16())); 3763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen AutocompleteMatch instant_match = FindMatchWithDestination(instant_url); 3773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(!instant_match.destination_url.is_empty()); 3783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // And the 'foobar' match should have a description. 3803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_FALSE(instant_match.description.empty()); 3813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Make sure the what you typed match has no description. 3833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( 38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *default_t_url_, ASCIIToUTF16("foo"), 0, string16())); 3853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen AutocompleteMatch what_you_typed_match = 3863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen FindMatchWithDestination(what_you_typed_url); 3873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(!what_you_typed_match.destination_url.is_empty()); 3883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_TRUE(what_you_typed_match.description.empty()); 3893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 3903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // The instant search should be more relevant. 3913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen EXPECT_GT(instant_match.relevance, what_you_typed_match.relevance); 3923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 39472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Make sure that if FinalizeInstantQuery is invoked before suggest results 39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// return, the suggest text from FinalizeInstantQuery is remembered. 39672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(SearchProviderTest, RememberInstantQuery) { 39772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefService* service = profile_.GetPrefs(); 39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->SetBoolean(prefs::kInstantEnabled, true); 39972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(ASCIIToUTF16("foo"), false, false); 40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Finalize the instant query immediately. 40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); 40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // There should be two matches, one for what you typed, the other for 40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // 'foobar'. 40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(2u, provider_->matches().size()); 40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( 40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *default_t_url_, ASCIIToUTF16("foobar"), 0, string16())); 41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteMatch instant_match = FindMatchWithDestination(instant_url); 41172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(instant_match.destination_url.is_empty()); 41272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 41372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Wait until history and the suggest query complete. 41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile_.BlockUntilHistoryProcessesPendingRequests(); 41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); 41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Provider should be done. 41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(provider_->done()); 41972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 42072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // There should be two matches, one for what you typed, the other for 42172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // 'foobar'. 42272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(2u, provider_->matches().size()); 42372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen instant_match = FindMatchWithDestination(instant_url); 42472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(instant_match.destination_url.is_empty()); 42572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // And the 'foobar' match should have a description. 42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(instant_match.description.empty()); 42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Make sure that if trailing whitespace is added to the text supplied to 43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteInput the default suggest text is cleared. 43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(SearchProviderTest, DifferingText) { 43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefService* service = profile_.GetPrefs(); 43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->SetBoolean(prefs::kInstantEnabled, true); 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(ASCIIToUTF16("foo"), false, false); 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Wait until history and the suggest query complete. 43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile_.BlockUntilHistoryProcessesPendingRequests(); 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); 44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Finalize the instant query immediately. 44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); 44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Query with input that ends up getting trimmed to be the same as was 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // originally supplied. 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QueryForInput(ASCIIToUTF16("foo "), false, true); 44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // There should only one match, for what you typed. 45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1u, provider_->matches().size()); 45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( 45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *default_t_url_, ASCIIToUTF16("foo"), 0, string16())); 45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteMatch instant_match = FindMatchWithDestination(instant_url); 45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(instant_match.destination_url.is_empty()); 45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SearchProviderTest, DontAutocompleteURLLikeTerms) { 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_.CreateAutocompleteClassifier(); 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 term(ASCIIToUTF16("docs.google.com")); 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HistoryService* history = 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); 462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url = GURL(default_t_url_->url()->ReplaceSearchTerms( 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *default_t_url_, term, 0, string16())); 464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history->AddPageWithDetails( 465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen url, string16(), 1, 1, base::Time::Now(), false, history::SOURCE_BROWSED); 466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history->SetKeywordSearchTermsForURL(url, default_t_url_->id(), term); 467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add the term as a url. 469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history->AddPageWithDetails( 470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL("http://docs.google.com"), string16(), 1, 1, base::Time::Now(), 471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen false, history::SOURCE_BROWSED); 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_.BlockUntilHistoryProcessesPendingRequests(); 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen QueryForInput(ASCIIToUTF16("docs"), false, false); 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Wait until history and the suggest query complete. 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_.BlockUntilHistoryProcessesPendingRequests(); 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Provider should be done. 482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(provider_->done()); 483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // There should be two matches, one for what you typed, the other for 485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // 'docs.google.com'. The search term should have a lower priority than the 486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // what you typed match. 487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(2u, provider_->matches().size()); 488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutocompleteMatch term_match = FindMatchWithDestination(url); 489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( 490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *default_t_url_, ASCIIToUTF16("docs"), 0, string16())); 491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutocompleteMatch what_you_typed_match = 492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FindMatchWithDestination(what_you_typed_url); 493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_GT(what_you_typed_match.relevance, term_match.relevance); 494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 495