OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autocomplete/search_provider.h" | 5 #include "chrome/browser/autocomplete/search_provider.h" |
6 | 6 |
7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
8 #include "base/time.h" | 8 #include "base/time.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 quit_when_done_(false) { | 45 quit_when_done_(false) { |
46 io_thread_.Start(); | 46 io_thread_.Start(); |
47 } | 47 } |
48 | 48 |
49 // See description above class for what this registers. | 49 // See description above class for what this registers. |
50 virtual void SetUp(); | 50 virtual void SetUp(); |
51 | 51 |
52 virtual void TearDown(); | 52 virtual void TearDown(); |
53 | 53 |
54 protected: | 54 protected: |
55 // Returns an AutocompleteMatch in provider_'s set of matches that matches | 55 // Adds a search for |term|, using the engine |t_url| to the history, and |
56 // |url|. If there is no matching URL, an empty match is returned. | 56 // returns the URL for that search. |
57 AutocompleteMatch FindMatchWithDestination(const GURL& url); | 57 GURL AddSearchToHistory(TemplateURL* t_url, string16 term, int visit_count); |
| 58 |
| 59 // Looks for a match in |provider_| with destination |url|. Sets |match| to |
| 60 // it if found. Returns whether |match| was set. |
| 61 bool FindMatchWithDestination(const GURL& url, AutocompleteMatch* match); |
58 | 62 |
59 // ACProviderListener method. If we're waiting for the provider to finish, | 63 // ACProviderListener method. If we're waiting for the provider to finish, |
60 // this exits the message loop. | 64 // this exits the message loop. |
61 virtual void OnProviderUpdate(bool updated_matches); | 65 virtual void OnProviderUpdate(bool updated_matches); |
62 | 66 |
63 // Runs a nested message loop until provider_ is done. The message loop is | 67 // Runs a nested message loop until provider_ is done. The message loop is |
64 // exited by way of OnProviderUPdate. | 68 // exited by way of OnProviderUPdate. |
65 void RunTillProviderDone(); | 69 void RunTillProviderDone(); |
66 | 70 |
67 // Invokes Start on provider_, then runs all pending tasks. | 71 // Invokes Start on provider_, then runs all pending tasks. |
68 void QueryForInput(const string16& text, | 72 void QueryForInput(const string16& text, bool prevent_inline_autocomplete); |
69 bool prevent_inline_autocomplete, | 73 |
70 bool minimal_changes); | 74 // Calls QueryForInput(), finishes any suggest query, then if |wyt_match| is |
| 75 // non-NULL, sets it to the "what you typed" entry for |text|. |
| 76 void QueryForInputAndSetWYTMatch(const string16& text, |
| 77 AutocompleteMatch* wyt_match); |
71 | 78 |
72 // Notifies the URLFetcher for the suggest query corresponding to the default | 79 // Notifies the URLFetcher for the suggest query corresponding to the default |
73 // search provider that it's done. | 80 // search provider that it's done. |
74 // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE. | 81 // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE. |
75 void FinishDefaultSuggestQuery(); | 82 void FinishDefaultSuggestQuery(); |
76 | 83 |
77 // See description above class for details of these fields. | 84 // See description above class for details of these fields. |
78 TemplateURL* default_t_url_; | 85 TemplateURL* default_t_url_; |
79 const string16 term1_; | 86 const string16 term1_; |
80 GURL term1_url_; | 87 GURL term1_url_; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 default_t_url_ = new TemplateURL(); | 123 default_t_url_ = new TemplateURL(); |
117 default_t_url_->SetURL("http://defaultturl/{searchTerms}", 0, 0); | 124 default_t_url_->SetURL("http://defaultturl/{searchTerms}", 0, 0); |
118 default_t_url_->SetSuggestionsURL("http://defaultturl2/{searchTerms}", 0, 0); | 125 default_t_url_->SetSuggestionsURL("http://defaultturl2/{searchTerms}", 0, 0); |
119 default_t_url_->set_short_name(ASCIIToUTF16("t")); | 126 default_t_url_->set_short_name(ASCIIToUTF16("t")); |
120 turl_model->Add(default_t_url_); | 127 turl_model->Add(default_t_url_); |
121 turl_model->SetDefaultSearchProvider(default_t_url_); | 128 turl_model->SetDefaultSearchProvider(default_t_url_); |
122 TemplateURLID default_provider_id = default_t_url_->id(); | 129 TemplateURLID default_provider_id = default_t_url_->id(); |
123 ASSERT_NE(0, default_provider_id); | 130 ASSERT_NE(0, default_provider_id); |
124 | 131 |
125 // Add url1, with search term term1_. | 132 // Add url1, with search term term1_. |
126 HistoryService* history = | 133 term1_url_ = AddSearchToHistory(default_t_url_, term1_, 1); |
127 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); | |
128 term1_url_ = GURL(default_t_url_->url()->ReplaceSearchTerms( | |
129 *default_t_url_, term1_, 0, string16())); | |
130 history->AddPageWithDetails(term1_url_, string16(), 1, 1, | |
131 base::Time::Now(), false, | |
132 history::SOURCE_BROWSED); | |
133 history->SetKeywordSearchTermsForURL(term1_url_, default_t_url_->id(), | |
134 term1_); | |
135 | 134 |
136 // Create another TemplateURL. | 135 // Create another TemplateURL. |
137 keyword_t_url_ = new TemplateURL(); | 136 keyword_t_url_ = new TemplateURL(); |
138 keyword_t_url_->set_keyword(ASCIIToUTF16("k")); | 137 keyword_t_url_->set_keyword(ASCIIToUTF16("k")); |
139 keyword_t_url_->set_short_name(ASCIIToUTF16("k")); | 138 keyword_t_url_->set_short_name(ASCIIToUTF16("k")); |
140 keyword_t_url_->SetURL("http://keyword/{searchTerms}", 0, 0); | 139 keyword_t_url_->SetURL("http://keyword/{searchTerms}", 0, 0); |
141 keyword_t_url_->SetSuggestionsURL("http://suggest_keyword/{searchTerms}", 0, | 140 keyword_t_url_->SetSuggestionsURL("http://suggest_keyword/{searchTerms}", 0, |
142 0); | 141 0); |
143 turl_model->Add(keyword_t_url_); | 142 turl_model->Add(keyword_t_url_); |
144 ASSERT_NE(0, keyword_t_url_->id()); | 143 ASSERT_NE(0, keyword_t_url_->id()); |
145 | 144 |
146 // Add a page and search term for keyword_t_url_. | 145 // Add a page and search term for keyword_t_url_. |
147 keyword_url_ = GURL(keyword_t_url_->url()->ReplaceSearchTerms( | 146 keyword_url_ = AddSearchToHistory(keyword_t_url_, keyword_term_, 1); |
148 *keyword_t_url_, keyword_term_, 0, string16())); | |
149 history->AddPageWithDetails(keyword_url_, string16(), 1, 1, | |
150 base::Time::Now(), false, | |
151 history::SOURCE_BROWSED); | |
152 history->SetKeywordSearchTermsForURL(keyword_url_, keyword_t_url_->id(), | |
153 keyword_term_); | |
154 | 147 |
155 // Keywords are updated by the InMemoryHistoryBackend only after the message | 148 // Keywords are updated by the InMemoryHistoryBackend only after the message |
156 // has been processed on the history thread. Block until history processes all | 149 // has been processed on the history thread. Block until history processes all |
157 // requests to ensure the InMemoryDatabase is the state we expect it. | 150 // requests to ensure the InMemoryDatabase is the state we expect it. |
158 profile_.BlockUntilHistoryProcessesPendingRequests(); | 151 profile_.BlockUntilHistoryProcessesPendingRequests(); |
159 | 152 |
160 provider_ = new SearchProvider(this, &profile_); | 153 provider_ = new SearchProvider(this, &profile_); |
161 | 154 |
162 URLFetcher::set_factory(&test_factory_); | 155 URLFetcher::set_factory(&test_factory_); |
163 } | 156 } |
(...skipping 11 matching lines...) Expand all Loading... |
175 | 168 |
176 quit_when_done_ = true; | 169 quit_when_done_ = true; |
177 #if defined(OS_MACOSX) | 170 #if defined(OS_MACOSX) |
178 message_loop_.Run(); | 171 message_loop_.Run(); |
179 #else | 172 #else |
180 message_loop_.Run(NULL); | 173 message_loop_.Run(NULL); |
181 #endif | 174 #endif |
182 } | 175 } |
183 | 176 |
184 void SearchProviderTest::QueryForInput(const string16& text, | 177 void SearchProviderTest::QueryForInput(const string16& text, |
185 bool prevent_inline_autocomplete, | 178 bool prevent_inline_autocomplete) { |
186 bool minimal_changes) { | |
187 // Start a query. | 179 // Start a query. |
188 AutocompleteInput input(text, string16(), prevent_inline_autocomplete, | 180 AutocompleteInput input(text, string16(), prevent_inline_autocomplete, |
189 false, true, AutocompleteInput::ALL_MATCHES); | 181 false, true, AutocompleteInput::ALL_MATCHES); |
190 provider_->Start(input, minimal_changes); | 182 provider_->Start(input, false); |
191 | 183 |
192 // RunAllPending so that the task scheduled by SearchProvider to create the | 184 // RunAllPending so that the task scheduled by SearchProvider to create the |
193 // URLFetchers runs. | 185 // URLFetchers runs. |
194 message_loop_.RunAllPending(); | 186 message_loop_.RunAllPending(); |
195 } | 187 } |
196 | 188 |
| 189 void SearchProviderTest::QueryForInputAndSetWYTMatch( |
| 190 const string16& text, |
| 191 AutocompleteMatch* wyt_match) { |
| 192 QueryForInput(text, false); |
| 193 profile_.BlockUntilHistoryProcessesPendingRequests(); |
| 194 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); |
| 195 EXPECT_NE(profile_.GetPrefs()->GetBoolean(prefs::kInstantEnabled), |
| 196 provider_->done()); |
| 197 if (!wyt_match) |
| 198 return; |
| 199 ASSERT_GE(provider_->matches().size(), 1u); |
| 200 EXPECT_TRUE(FindMatchWithDestination(GURL( |
| 201 default_t_url_->url()->ReplaceSearchTerms(*default_t_url_, text, 0, |
| 202 string16())), wyt_match)); |
| 203 } |
| 204 |
197 void SearchProviderTest::TearDown() { | 205 void SearchProviderTest::TearDown() { |
198 message_loop_.RunAllPending(); | 206 message_loop_.RunAllPending(); |
199 | 207 |
200 URLFetcher::set_factory(NULL); | 208 URLFetcher::set_factory(NULL); |
201 | 209 |
202 // Shutdown the provider before the profile. | 210 // Shutdown the provider before the profile. |
203 provider_ = NULL; | 211 provider_ = NULL; |
204 } | 212 } |
205 | 213 |
206 AutocompleteMatch SearchProviderTest::FindMatchWithDestination( | 214 GURL SearchProviderTest::AddSearchToHistory(TemplateURL* t_url, |
207 const GURL& url) { | 215 string16 term, |
| 216 int visit_count) { |
| 217 HistoryService* history = |
| 218 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); |
| 219 GURL search(t_url->url()->ReplaceSearchTerms(*t_url, term, 0, string16())); |
| 220 static base::Time last_added_time; |
| 221 last_added_time = std::max(base::Time::Now(), |
| 222 last_added_time + base::TimeDelta::FromMicroseconds(1)); |
| 223 history->AddPageWithDetails(search, string16(), visit_count, visit_count, |
| 224 last_added_time, false, history::SOURCE_BROWSED); |
| 225 history->SetKeywordSearchTermsForURL(search, t_url->id(), term); |
| 226 return search; |
| 227 } |
| 228 |
| 229 bool SearchProviderTest::FindMatchWithDestination(const GURL& url, |
| 230 AutocompleteMatch* match) { |
208 for (ACMatches::const_iterator i = provider_->matches().begin(); | 231 for (ACMatches::const_iterator i = provider_->matches().begin(); |
209 i != provider_->matches().end(); ++i) { | 232 i != provider_->matches().end(); ++i) { |
210 if (i->destination_url == url) | 233 if (i->destination_url == url) { |
211 return *i; | 234 *match = *i; |
| 235 return true; |
| 236 } |
212 } | 237 } |
213 return AutocompleteMatch(NULL, 1, false, AutocompleteMatch::HISTORY_URL); | 238 return false; |
214 } | 239 } |
215 | 240 |
216 void SearchProviderTest::FinishDefaultSuggestQuery() { | 241 void SearchProviderTest::FinishDefaultSuggestQuery() { |
217 TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID( | 242 TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID( |
218 SearchProvider::kDefaultProviderURLFetcherID); | 243 SearchProvider::kDefaultProviderURLFetcherID); |
219 ASSERT_TRUE(default_fetcher); | 244 ASSERT_TRUE(default_fetcher); |
220 | 245 |
221 // Tell the SearchProvider the default suggest query is done. | 246 // Tell the SearchProvider the default suggest query is done. |
222 default_fetcher->delegate()->OnURLFetchComplete( | 247 default_fetcher->delegate()->OnURLFetchComplete( |
223 default_fetcher, GURL(), net::URLRequestStatus(), 200, | 248 default_fetcher, GURL(), net::URLRequestStatus(), 200, |
224 net::ResponseCookies(), std::string()); | 249 net::ResponseCookies(), std::string()); |
225 } | 250 } |
226 | 251 |
227 // Tests ----------------------------------------------------------------------- | 252 // Tests ----------------------------------------------------------------------- |
228 | 253 |
229 // Make sure we query history for the default provider and a URLFetcher is | 254 // Make sure we query history for the default provider and a URLFetcher is |
230 // created for the default provider suggest results. | 255 // created for the default provider suggest results. |
231 TEST_F(SearchProviderTest, QueryDefaultProvider) { | 256 TEST_F(SearchProviderTest, QueryDefaultProvider) { |
232 string16 term = term1_.substr(0, term1_.length() - 1); | 257 string16 term = term1_.substr(0, term1_.length() - 1); |
233 QueryForInput(term, false, false); | 258 QueryForInput(term, false); |
234 | 259 |
235 // Make sure the default providers suggest service was queried. | 260 // Make sure the default providers suggest service was queried. |
236 TestURLFetcher* fetcher = test_factory_.GetFetcherByID( | 261 TestURLFetcher* fetcher = test_factory_.GetFetcherByID( |
237 SearchProvider::kDefaultProviderURLFetcherID); | 262 SearchProvider::kDefaultProviderURLFetcherID); |
238 ASSERT_TRUE(fetcher); | 263 ASSERT_TRUE(fetcher); |
239 | 264 |
240 // And the URL matches what we expected. | 265 // And the URL matches what we expected. |
241 GURL expected_url = GURL(default_t_url_->suggestions_url()-> | 266 GURL expected_url = GURL(default_t_url_->suggestions_url()-> |
242 ReplaceSearchTerms(*default_t_url_, term, 0, string16())); | 267 ReplaceSearchTerms(*default_t_url_, term, 0, string16())); |
243 ASSERT_TRUE(fetcher->original_url() == expected_url); | 268 ASSERT_TRUE(fetcher->original_url() == expected_url); |
244 | 269 |
245 // Tell the SearchProvider the suggest query is done. | 270 // Tell the SearchProvider the suggest query is done. |
246 fetcher->delegate()->OnURLFetchComplete( | 271 fetcher->delegate()->OnURLFetchComplete( |
247 fetcher, GURL(), net::URLRequestStatus(), 200, net::ResponseCookies(), | 272 fetcher, GURL(), net::URLRequestStatus(), 200, net::ResponseCookies(), |
248 std::string()); | 273 std::string()); |
249 fetcher = NULL; | 274 fetcher = NULL; |
250 | 275 |
251 // Run till the history results complete. | 276 // Run till the history results complete. |
252 RunTillProviderDone(); | 277 RunTillProviderDone(); |
253 | 278 |
254 // The SearchProvider is done. Make sure it has a result for the history | 279 // The SearchProvider is done. Make sure it has a result for the history |
255 // term term1. | 280 // term term1. |
256 AutocompleteMatch term1_match = FindMatchWithDestination(term1_url_); | 281 AutocompleteMatch term1_match; |
257 EXPECT_TRUE(!term1_match.destination_url.is_empty()); | 282 EXPECT_TRUE(FindMatchWithDestination(term1_url_, &term1_match)); |
258 // Term1 should not have a description, it's set later. | 283 // Term1 should not have a description, it's set later. |
259 EXPECT_TRUE(term1_match.description.empty()); | 284 EXPECT_TRUE(term1_match.description.empty()); |
260 | 285 |
261 GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | 286 AutocompleteMatch wyt_match; |
262 *default_t_url_, term, 0, string16())); | 287 EXPECT_TRUE(FindMatchWithDestination(GURL( |
263 AutocompleteMatch what_you_typed_match = | 288 default_t_url_->url()->ReplaceSearchTerms(*default_t_url_, term, 0, |
264 FindMatchWithDestination(what_you_typed_url); | 289 string16())), &wyt_match)); |
265 EXPECT_TRUE(!what_you_typed_match.destination_url.is_empty()); | 290 EXPECT_TRUE(wyt_match.description.empty()); |
266 EXPECT_TRUE(what_you_typed_match.description.empty()); | |
267 | 291 |
268 // The match for term1 should be more relevant than the what you typed result. | 292 // The match for term1 should be more relevant than the what you typed result. |
269 EXPECT_GT(term1_match.relevance, what_you_typed_match.relevance); | 293 EXPECT_GT(term1_match.relevance, wyt_match.relevance); |
270 } | 294 } |
271 | 295 |
272 TEST_F(SearchProviderTest, HonorPreventInlineAutocomplete) { | 296 TEST_F(SearchProviderTest, HonorPreventInlineAutocomplete) { |
273 string16 term = term1_.substr(0, term1_.length() - 1); | 297 string16 term = term1_.substr(0, term1_.length() - 1); |
274 QueryForInput(term, true, false); | 298 QueryForInput(term, true); |
275 | 299 |
276 ASSERT_FALSE(provider_->matches().empty()); | 300 ASSERT_FALSE(provider_->matches().empty()); |
277 ASSERT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED, | 301 ASSERT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED, |
278 provider_->matches()[0].type); | 302 provider_->matches()[0].type); |
279 } | 303 } |
280 | 304 |
281 // Issues a query that matches the registered keyword and makes sure history | 305 // Issues a query that matches the registered keyword and makes sure history |
282 // is queried as well as URLFetchers getting created. | 306 // is queried as well as URLFetchers getting created. |
283 TEST_F(SearchProviderTest, QueryKeywordProvider) { | 307 TEST_F(SearchProviderTest, QueryKeywordProvider) { |
284 string16 term = keyword_term_.substr(0, keyword_term_.length() - 1); | 308 string16 term = keyword_term_.substr(0, keyword_term_.length() - 1); |
285 QueryForInput(keyword_t_url_->keyword() + UTF8ToUTF16(" ") + term, false, | 309 QueryForInput(keyword_t_url_->keyword() + UTF8ToUTF16(" ") + term, false); |
286 false); | |
287 | 310 |
288 // Make sure the default providers suggest service was queried. | 311 // Make sure the default providers suggest service was queried. |
289 TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID( | 312 TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID( |
290 SearchProvider::kDefaultProviderURLFetcherID); | 313 SearchProvider::kDefaultProviderURLFetcherID); |
291 ASSERT_TRUE(default_fetcher); | 314 ASSERT_TRUE(default_fetcher); |
292 | 315 |
293 // Tell the SearchProvider the default suggest query is done. | 316 // Tell the SearchProvider the default suggest query is done. |
294 default_fetcher->delegate()->OnURLFetchComplete( | 317 default_fetcher->delegate()->OnURLFetchComplete( |
295 default_fetcher, GURL(), net::URLRequestStatus(), 200, | 318 default_fetcher, GURL(), net::URLRequestStatus(), 200, |
296 net::ResponseCookies(), std::string()); | 319 net::ResponseCookies(), std::string()); |
(...skipping 13 matching lines...) Expand all Loading... |
310 keyword_fetcher->delegate()->OnURLFetchComplete( | 333 keyword_fetcher->delegate()->OnURLFetchComplete( |
311 keyword_fetcher, GURL(), net::URLRequestStatus(), 200, | 334 keyword_fetcher, GURL(), net::URLRequestStatus(), 200, |
312 net::ResponseCookies(), std::string()); | 335 net::ResponseCookies(), std::string()); |
313 keyword_fetcher = NULL; | 336 keyword_fetcher = NULL; |
314 | 337 |
315 // Run till the history results complete. | 338 // Run till the history results complete. |
316 RunTillProviderDone(); | 339 RunTillProviderDone(); |
317 | 340 |
318 // The SearchProvider is done. Make sure it has a result for the history | 341 // The SearchProvider is done. Make sure it has a result for the history |
319 // term keyword. | 342 // term keyword. |
320 AutocompleteMatch match = FindMatchWithDestination(keyword_url_); | 343 AutocompleteMatch match; |
321 ASSERT_TRUE(!match.destination_url.is_empty()); | 344 EXPECT_TRUE(FindMatchWithDestination(keyword_url_, &match)); |
322 | 345 |
323 // The match should have a TemplateURL. | 346 // The match should have a TemplateURL. |
324 EXPECT_TRUE(match.template_url); | 347 EXPECT_TRUE(match.template_url); |
325 | 348 |
326 // The fill into edit should contain the keyword. | 349 // The fill into edit should contain the keyword. |
327 EXPECT_EQ(keyword_t_url_->keyword() + char16(' ') + keyword_term_, | 350 EXPECT_EQ(keyword_t_url_->keyword() + char16(' ') + keyword_term_, |
328 match.fill_into_edit); | 351 match.fill_into_edit); |
329 } | 352 } |
330 | 353 |
331 TEST_F(SearchProviderTest, DontSendPrivateDataToSuggest) { | 354 TEST_F(SearchProviderTest, DontSendPrivateDataToSuggest) { |
332 // None of the following input strings should be sent to the suggest server, | 355 // None of the following input strings should be sent to the suggest server, |
333 // because they may contain private data. | 356 // because they may contain private data. |
334 const char* inputs[] = { | 357 const char* inputs[] = { |
335 "username:password", | 358 "username:password", |
336 "http://username:password", | 359 "http://username:password", |
337 "https://username:password", | 360 "https://username:password", |
338 "username:password@hostname", | 361 "username:password@hostname", |
339 "http://username:password@hostname/", | 362 "http://username:password@hostname/", |
340 "file://filename", | 363 "file://filename", |
341 "data://data", | 364 "data://data", |
342 "unknownscheme:anything", | 365 "unknownscheme:anything", |
343 "http://hostname/?query=q", | 366 "http://hostname/?query=q", |
344 "http://hostname/path#ref", | 367 "http://hostname/path#ref", |
345 "https://hostname/path", | 368 "https://hostname/path", |
346 }; | 369 }; |
347 | 370 |
348 for (size_t i = 0; i < arraysize(inputs); ++i) { | 371 for (size_t i = 0; i < arraysize(inputs); ++i) { |
349 QueryForInput(ASCIIToUTF16(inputs[i]), false, false); | 372 QueryForInput(ASCIIToUTF16(inputs[i]), false); |
350 // Make sure the default providers suggest service was not queried. | 373 // Make sure the default providers suggest service was not queried. |
351 ASSERT_TRUE(test_factory_.GetFetcherByID( | 374 ASSERT_TRUE(test_factory_.GetFetcherByID( |
352 SearchProvider::kDefaultProviderURLFetcherID) == NULL); | 375 SearchProvider::kDefaultProviderURLFetcherID) == NULL); |
353 // Run till the history results complete. | 376 // Run till the history results complete. |
354 RunTillProviderDone(); | 377 RunTillProviderDone(); |
355 } | 378 } |
356 } | 379 } |
357 | 380 |
358 // Make sure FinalizeInstantQuery works. | 381 // Make sure FinalizeInstantQuery works. |
359 TEST_F(SearchProviderTest, FinalizeInstantQuery) { | 382 TEST_F(SearchProviderTest, FinalizeInstantQuery) { |
360 PrefService* service = profile_.GetPrefs(); | 383 PrefService* service = profile_.GetPrefs(); |
361 service->SetBoolean(prefs::kInstantEnabled, true); | 384 service->SetBoolean(prefs::kInstantEnabled, true); |
362 | 385 |
363 QueryForInput(ASCIIToUTF16("foo"), false, false); | 386 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("foo"), |
364 | 387 NULL)); |
365 // Wait until history and the suggest query complete. | |
366 profile_.BlockUntilHistoryProcessesPendingRequests(); | |
367 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); | |
368 | |
369 // When instant is enabled the provider isn't done until it hears from | |
370 // instant. | |
371 EXPECT_FALSE(provider_->done()); | |
372 | 388 |
373 // Tell the provider instant is done. | 389 // Tell the provider instant is done. |
374 provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); | 390 provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); |
375 | 391 |
376 // The provider should now be done. | 392 // The provider should now be done. |
377 EXPECT_TRUE(provider_->done()); | 393 EXPECT_TRUE(provider_->done()); |
378 | 394 |
379 // There should be two matches, one for what you typed, the other for | 395 // There should be two matches, one for what you typed, the other for |
380 // 'foobar'. | 396 // 'foobar'. |
381 EXPECT_EQ(2u, provider_->matches().size()); | 397 EXPECT_EQ(2u, provider_->matches().size()); |
382 GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | 398 GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( |
383 *default_t_url_, ASCIIToUTF16("foobar"), 0, string16())); | 399 *default_t_url_, ASCIIToUTF16("foobar"), 0, string16())); |
384 AutocompleteMatch instant_match = FindMatchWithDestination(instant_url); | 400 AutocompleteMatch instant_match; |
385 EXPECT_TRUE(!instant_match.destination_url.is_empty()); | 401 EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match)); |
386 | 402 |
387 // And the 'foobar' match should not have a description, it'll be set later. | 403 // And the 'foobar' match should not have a description, it'll be set later. |
388 EXPECT_TRUE(instant_match.description.empty()); | 404 EXPECT_TRUE(instant_match.description.empty()); |
389 | 405 |
390 // Make sure the what you typed match has no description. | 406 // Make sure the what you typed match has no description. |
391 GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | 407 AutocompleteMatch wyt_match; |
392 *default_t_url_, ASCIIToUTF16("foo"), 0, string16())); | 408 EXPECT_TRUE(FindMatchWithDestination(GURL( |
393 AutocompleteMatch what_you_typed_match = | 409 default_t_url_->url()->ReplaceSearchTerms(*default_t_url_, |
394 FindMatchWithDestination(what_you_typed_url); | 410 ASCIIToUTF16("foo"), 0, string16())), &wyt_match)); |
395 EXPECT_TRUE(!what_you_typed_match.destination_url.is_empty()); | 411 EXPECT_TRUE(wyt_match.description.empty()); |
396 EXPECT_TRUE(what_you_typed_match.description.empty()); | |
397 | 412 |
398 // The instant search should be more relevant. | 413 // The instant search should be more relevant. |
399 EXPECT_GT(instant_match.relevance, what_you_typed_match.relevance); | 414 EXPECT_GT(instant_match.relevance, wyt_match.relevance); |
400 } | 415 } |
401 | 416 |
402 // Make sure that if FinalizeInstantQuery is invoked before suggest results | 417 // Make sure that if FinalizeInstantQuery is invoked before suggest results |
403 // return, the suggest text from FinalizeInstantQuery is remembered. | 418 // return, the suggest text from FinalizeInstantQuery is remembered. |
404 TEST_F(SearchProviderTest, RememberInstantQuery) { | 419 TEST_F(SearchProviderTest, RememberInstantQuery) { |
405 PrefService* service = profile_.GetPrefs(); | 420 PrefService* service = profile_.GetPrefs(); |
406 service->SetBoolean(prefs::kInstantEnabled, true); | 421 service->SetBoolean(prefs::kInstantEnabled, true); |
407 | 422 |
408 QueryForInput(ASCIIToUTF16("foo"), false, false); | 423 QueryForInput(ASCIIToUTF16("foo"), false); |
409 | 424 |
410 // Finalize the instant query immediately. | 425 // Finalize the instant query immediately. |
411 provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); | 426 provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); |
412 | 427 |
413 // There should be two matches, one for what you typed, the other for | 428 // There should be two matches, one for what you typed, the other for |
414 // 'foobar'. | 429 // 'foobar'. |
415 EXPECT_EQ(2u, provider_->matches().size()); | 430 EXPECT_EQ(2u, provider_->matches().size()); |
416 GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | 431 GURL instant_url(default_t_url_->url()->ReplaceSearchTerms(*default_t_url_, |
417 *default_t_url_, ASCIIToUTF16("foobar"), 0, string16())); | 432 ASCIIToUTF16("foobar"), 0, string16())); |
418 AutocompleteMatch instant_match = FindMatchWithDestination(instant_url); | 433 AutocompleteMatch instant_match; |
419 EXPECT_FALSE(instant_match.destination_url.is_empty()); | 434 EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match)); |
420 | 435 |
421 // Wait until history and the suggest query complete. | 436 // Wait until history and the suggest query complete. |
422 profile_.BlockUntilHistoryProcessesPendingRequests(); | 437 profile_.BlockUntilHistoryProcessesPendingRequests(); |
423 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); | 438 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); |
424 | 439 |
425 // Provider should be done. | 440 // Provider should be done. |
426 EXPECT_TRUE(provider_->done()); | 441 EXPECT_TRUE(provider_->done()); |
427 | 442 |
428 // There should be two matches, one for what you typed, the other for | 443 // There should be two matches, one for what you typed, the other for |
429 // 'foobar'. | 444 // 'foobar'. |
430 EXPECT_EQ(2u, provider_->matches().size()); | 445 EXPECT_EQ(2u, provider_->matches().size()); |
431 instant_match = FindMatchWithDestination(instant_url); | 446 EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match)); |
432 EXPECT_FALSE(instant_match.destination_url.is_empty()); | |
433 | 447 |
434 // And the 'foobar' match should not have a description, it'll be set later. | 448 // And the 'foobar' match should not have a description, it'll be set later. |
435 EXPECT_TRUE(instant_match.description.empty()); | 449 EXPECT_TRUE(instant_match.description.empty()); |
436 } | 450 } |
437 | 451 |
438 // Make sure that if trailing whitespace is added to the text supplied to | 452 // Make sure that if trailing whitespace is added to the text supplied to |
439 // AutocompleteInput the default suggest text is cleared. | 453 // AutocompleteInput the default suggest text is cleared. |
440 TEST_F(SearchProviderTest, DifferingText) { | 454 TEST_F(SearchProviderTest, DifferingText) { |
441 PrefService* service = profile_.GetPrefs(); | 455 PrefService* service = profile_.GetPrefs(); |
442 service->SetBoolean(prefs::kInstantEnabled, true); | 456 service->SetBoolean(prefs::kInstantEnabled, true); |
443 | 457 |
444 QueryForInput(ASCIIToUTF16("foo"), false, false); | 458 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("foo"), |
445 | 459 NULL)); |
446 // Wait until history and the suggest query complete. | |
447 profile_.BlockUntilHistoryProcessesPendingRequests(); | |
448 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); | |
449 | 460 |
450 // Finalize the instant query immediately. | 461 // Finalize the instant query immediately. |
451 provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); | 462 provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")); |
452 | 463 |
453 // Query with the same input text, but trailing whitespace. | 464 // Query with the same input text, but trailing whitespace. |
454 QueryForInput(ASCIIToUTF16("foo "), false, false); | 465 AutocompleteMatch instant_match; |
| 466 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("foo "), |
| 467 &instant_match)); |
455 | 468 |
456 // There should only one match, for what you typed. | 469 // There should only one match, for what you typed. |
457 EXPECT_EQ(1u, provider_->matches().size()); | 470 EXPECT_EQ(1u, provider_->matches().size()); |
458 GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | |
459 *default_t_url_, ASCIIToUTF16("foo "), 0, string16())); | |
460 AutocompleteMatch instant_match = FindMatchWithDestination(instant_url); | |
461 EXPECT_FALSE(instant_match.destination_url.is_empty()); | 471 EXPECT_FALSE(instant_match.destination_url.is_empty()); |
462 } | 472 } |
463 | 473 |
464 TEST_F(SearchProviderTest, DontAutocompleteURLLikeTerms) { | 474 TEST_F(SearchProviderTest, DontAutocompleteURLLikeTerms) { |
465 profile_.CreateAutocompleteClassifier(); | 475 profile_.CreateAutocompleteClassifier(); |
466 string16 term(ASCIIToUTF16("docs.google.com")); | 476 GURL url = AddSearchToHistory(default_t_url_, |
467 HistoryService* history = | 477 ASCIIToUTF16("docs.google.com"), 1); |
468 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); | |
469 GURL url = GURL(default_t_url_->url()->ReplaceSearchTerms( | |
470 *default_t_url_, term, 0, string16())); | |
471 history->AddPageWithDetails( | |
472 url, string16(), 1, 1, base::Time::Now(), false, history::SOURCE_BROWSED); | |
473 history->SetKeywordSearchTermsForURL(url, default_t_url_->id(), term); | |
474 | 478 |
475 // Add the term as a url. | 479 // Add the term as a url. |
476 history->AddPageWithDetails( | 480 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS)->AddPageWithDetails( |
477 GURL("http://docs.google.com"), string16(), 1, 1, base::Time::Now(), | 481 GURL("http://docs.google.com"), string16(), 1, 1, base::Time::Now(), |
478 false, history::SOURCE_BROWSED); | 482 false, history::SOURCE_BROWSED); |
479 | |
480 profile_.BlockUntilHistoryProcessesPendingRequests(); | 483 profile_.BlockUntilHistoryProcessesPendingRequests(); |
481 | 484 |
482 QueryForInput(ASCIIToUTF16("docs"), false, false); | 485 AutocompleteMatch wyt_match; |
483 | 486 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("docs"), |
484 // Wait until history and the suggest query complete. | 487 &wyt_match)); |
485 profile_.BlockUntilHistoryProcessesPendingRequests(); | |
486 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); | |
487 | |
488 // Provider should be done. | |
489 EXPECT_TRUE(provider_->done()); | |
490 | 488 |
491 // There should be two matches, one for what you typed, the other for | 489 // There should be two matches, one for what you typed, the other for |
492 // 'docs.google.com'. The search term should have a lower priority than the | 490 // 'docs.google.com'. The search term should have a lower priority than the |
493 // what you typed match. | 491 // what you typed match. |
494 ASSERT_EQ(2u, provider_->matches().size()); | 492 ASSERT_EQ(2u, provider_->matches().size()); |
495 AutocompleteMatch term_match = FindMatchWithDestination(url); | 493 AutocompleteMatch term_match; |
496 GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | 494 EXPECT_TRUE(FindMatchWithDestination(url, &term_match)); |
497 *default_t_url_, ASCIIToUTF16("docs"), 0, string16())); | 495 EXPECT_GT(wyt_match.relevance, term_match.relevance); |
498 AutocompleteMatch what_you_typed_match = | |
499 FindMatchWithDestination(what_you_typed_url); | |
500 EXPECT_GT(what_you_typed_match.relevance, term_match.relevance); | |
501 } | 496 } |
502 | 497 |
503 // Verifies autocomplete of previously typed words works on word boundaries. | 498 // A multiword search with one visit should not autocomplete until multiple |
504 TEST_F(SearchProviderTest, AutocompletePreviousSearchOnSpace) { | 499 // words are typed. |
505 // Add an entry that corresponds to a search with two words. | 500 TEST_F(SearchProviderTest, DontAutocompleteUntilMultipleWordsTyped) { |
506 string16 term(ASCIIToUTF16("two words")); | 501 GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("one search"), |
507 HistoryService* history = | 502 1)); |
508 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); | |
509 GURL term_url(default_t_url_->url()->ReplaceSearchTerms( | |
510 *default_t_url_, term, 0, string16())); | |
511 history->AddPageWithDetails(term_url, string16(), 1, 1, | |
512 base::Time::Now(), false, | |
513 history::SOURCE_BROWSED); | |
514 history->SetKeywordSearchTermsForURL(term_url, default_t_url_->id(), term); | |
515 | |
516 profile_.BlockUntilHistoryProcessesPendingRequests(); | 503 profile_.BlockUntilHistoryProcessesPendingRequests(); |
517 | 504 |
518 QueryForInput(ASCIIToUTF16("two "), false, false); | 505 AutocompleteMatch wyt_match; |
| 506 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("on"), |
| 507 &wyt_match)); |
| 508 ASSERT_EQ(2u, provider_->matches().size()); |
| 509 AutocompleteMatch term_match; |
| 510 EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match)); |
| 511 EXPECT_GT(wyt_match.relevance, term_match.relevance); |
519 | 512 |
520 // Wait until history and the suggest query complete. | 513 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("one se"), |
| 514 &wyt_match)); |
| 515 ASSERT_EQ(2u, provider_->matches().size()); |
| 516 EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match)); |
| 517 EXPECT_GT(term_match.relevance, wyt_match.relevance); |
| 518 } |
| 519 |
| 520 // A multiword search with more than one visit should autocomplete immediately. |
| 521 TEST_F(SearchProviderTest, AutocompleteMultipleVisitsImmediately) { |
| 522 GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("two searches"), |
| 523 2)); |
521 profile_.BlockUntilHistoryProcessesPendingRequests(); | 524 profile_.BlockUntilHistoryProcessesPendingRequests(); |
522 ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery()); | |
523 | 525 |
524 // Provider should be done. | 526 AutocompleteMatch wyt_match; |
525 EXPECT_TRUE(provider_->done()); | 527 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("tw"), |
| 528 &wyt_match)); |
| 529 ASSERT_EQ(2u, provider_->matches().size()); |
| 530 AutocompleteMatch term_match; |
| 531 EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match)); |
| 532 EXPECT_GT(term_match.relevance, wyt_match.relevance); |
| 533 } |
526 | 534 |
527 // There should be two matches, one for what you typed, the other for | 535 // Autocompletion should work at a word boundary after a space. |
528 // 'two words'. | 536 TEST_F(SearchProviderTest, AutocompleteAfterSpace) { |
| 537 GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("two searches"), |
| 538 2)); |
| 539 profile_.BlockUntilHistoryProcessesPendingRequests(); |
| 540 |
| 541 AutocompleteMatch wyt_match; |
| 542 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("two "), |
| 543 &wyt_match)); |
529 ASSERT_EQ(2u, provider_->matches().size()); | 544 ASSERT_EQ(2u, provider_->matches().size()); |
530 AutocompleteMatch term_match = FindMatchWithDestination(term_url); | 545 AutocompleteMatch term_match; |
531 EXPECT_FALSE(term_match.destination_url.is_empty()); | 546 EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match)); |
532 GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms( | 547 EXPECT_GT(term_match.relevance, wyt_match.relevance); |
533 *default_t_url_, ASCIIToUTF16("two "), 0, string16())); | 548 } |
534 AutocompleteMatch what_you_typed_match = | 549 |
535 FindMatchWithDestination(what_you_typed_url); | 550 // Newer multiword searches should score more highly than older ones. |
536 EXPECT_FALSE(what_you_typed_match.destination_url.is_empty()); | 551 TEST_F(SearchProviderTest, ScoreNewerSearchesHigher) { |
537 // term_match should be autocompleted. | 552 GURL term_url_a(AddSearchToHistory(default_t_url_, |
538 EXPECT_GT(term_match.relevance, what_you_typed_match.relevance); | 553 ASCIIToUTF16("three searches aaa"), 1)); |
539 // And the offset should be at 4. | 554 GURL term_url_b(AddSearchToHistory(default_t_url_, |
540 EXPECT_EQ(4u, term_match.inline_autocomplete_offset); | 555 ASCIIToUTF16("three searches bbb"), 1)); |
| 556 profile_.BlockUntilHistoryProcessesPendingRequests(); |
| 557 |
| 558 AutocompleteMatch wyt_match; |
| 559 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("three se"), |
| 560 &wyt_match)); |
| 561 ASSERT_EQ(3u, provider_->matches().size()); |
| 562 AutocompleteMatch term_match_a; |
| 563 EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a)); |
| 564 AutocompleteMatch term_match_b; |
| 565 EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b)); |
| 566 EXPECT_GT(term_match_b.relevance, term_match_a.relevance); |
| 567 EXPECT_GT(term_match_a.relevance, wyt_match.relevance); |
| 568 } |
| 569 |
| 570 // An autocompleted multiword search should not be replaced by a different |
| 571 // autocompletion while the user is still typing a valid prefix. |
| 572 TEST_F(SearchProviderTest, DontReplacePreviousAutocompletion) { |
| 573 GURL term_url_a(AddSearchToHistory(default_t_url_, |
| 574 ASCIIToUTF16("four searches aaa"), 2)); |
| 575 GURL term_url_b(AddSearchToHistory(default_t_url_, |
| 576 ASCIIToUTF16("four searches bbb"), 1)); |
| 577 profile_.BlockUntilHistoryProcessesPendingRequests(); |
| 578 |
| 579 AutocompleteMatch wyt_match; |
| 580 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("fo"), |
| 581 &wyt_match)); |
| 582 ASSERT_EQ(3u, provider_->matches().size()); |
| 583 AutocompleteMatch term_match_a; |
| 584 EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a)); |
| 585 AutocompleteMatch term_match_b; |
| 586 EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b)); |
| 587 EXPECT_GT(term_match_a.relevance, wyt_match.relevance); |
| 588 EXPECT_GT(wyt_match.relevance, term_match_b.relevance); |
| 589 |
| 590 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("four se"), |
| 591 &wyt_match)); |
| 592 ASSERT_EQ(3u, provider_->matches().size()); |
| 593 EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a)); |
| 594 EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b)); |
| 595 EXPECT_GT(term_match_a.relevance, wyt_match.relevance); |
| 596 EXPECT_GT(wyt_match.relevance, term_match_b.relevance); |
| 597 } |
| 598 |
| 599 // Non-completable multiword searches should not crowd out single-word searches. |
| 600 TEST_F(SearchProviderTest, DontCrowdOutSingleWords) { |
| 601 GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("five"), 1)); |
| 602 AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches bbb"), 1); |
| 603 AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches ccc"), 1); |
| 604 AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches ddd"), 1); |
| 605 AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches eee"), 1); |
| 606 profile_.BlockUntilHistoryProcessesPendingRequests(); |
| 607 |
| 608 AutocompleteMatch wyt_match; |
| 609 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("fi"), |
| 610 &wyt_match)); |
| 611 ASSERT_EQ(AutocompleteProvider::kMaxMatches + 1, provider_->matches().size()); |
| 612 AutocompleteMatch term_match; |
| 613 EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match)); |
| 614 EXPECT_GT(term_match.relevance, wyt_match.relevance); |
541 } | 615 } |
542 | 616 |
543 // Verifies AutocompleteControllers sets descriptions for results correctly. | 617 // Verifies AutocompleteControllers sets descriptions for results correctly. |
544 TEST_F(SearchProviderTest, UpdateKeywordDescriptions) { | 618 TEST_F(SearchProviderTest, UpdateKeywordDescriptions) { |
545 // Add an entry that corresponds to a keyword search with 'term2'. | 619 // Add an entry that corresponds to a keyword search with 'term2'. |
546 string16 term(ASCIIToUTF16("term2")); | 620 AddSearchToHistory(keyword_t_url_, ASCIIToUTF16("term2"), 1); |
547 HistoryService* history = | |
548 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS); | |
549 GURL term_url(keyword_t_url_->url()->ReplaceSearchTerms( | |
550 *keyword_t_url_, term, 0, string16())); | |
551 history->AddPageWithDetails(term_url, string16(), 1, 1, | |
552 base::Time::Now(), false, | |
553 history::SOURCE_BROWSED); | |
554 history->SetKeywordSearchTermsForURL(term_url, keyword_t_url_->id(), term); | |
555 | |
556 profile_.BlockUntilHistoryProcessesPendingRequests(); | 621 profile_.BlockUntilHistoryProcessesPendingRequests(); |
557 | 622 |
558 ACProviders providers; | 623 ACProviders providers; |
559 SearchProvider* provider = provider_.release(); | 624 SearchProvider* provider = provider_.release(); |
560 providers.push_back(provider); | 625 providers.push_back(provider); |
561 AutocompleteController controller(providers); | 626 AutocompleteController controller(providers); |
562 controller.set_search_provider(provider); | 627 controller.set_search_provider(provider); |
563 provider->set_listener(&controller); | 628 provider->set_listener(&controller); |
564 controller.Start(ASCIIToUTF16("k t"), string16(), false, false, true, | 629 controller.Start(ASCIIToUTF16("k t"), string16(), false, false, true, |
565 AutocompleteInput::ALL_MATCHES); | 630 AutocompleteInput::ALL_MATCHES); |
566 const AutocompleteResult& result = controller.result(); | 631 const AutocompleteResult& result = controller.result(); |
567 | 632 |
568 // There should be two matches, one for the keyword one for what you typed. | 633 // There should be two matches, one for the keyword one for what you typed. |
569 ASSERT_EQ(2u, result.size()); | 634 ASSERT_EQ(2u, result.size()); |
570 | 635 |
571 EXPECT_TRUE(result.match_at(0).template_url != NULL); | 636 EXPECT_TRUE(result.match_at(0).template_url != NULL); |
572 EXPECT_TRUE(result.match_at(1).template_url != NULL); | 637 EXPECT_TRUE(result.match_at(1).template_url != NULL); |
573 EXPECT_NE(result.match_at(0).template_url, | 638 EXPECT_NE(result.match_at(0).template_url, |
574 result.match_at(1).template_url); | 639 result.match_at(1).template_url); |
575 | 640 |
576 EXPECT_FALSE(result.match_at(0).description.empty()); | 641 EXPECT_FALSE(result.match_at(0).description.empty()); |
577 EXPECT_FALSE(result.match_at(1).description.empty()); | 642 EXPECT_FALSE(result.match_at(1).description.empty()); |
578 EXPECT_NE(result.match_at(0).description, | 643 EXPECT_NE(result.match_at(0).description, |
579 result.match_at(1).description); | 644 result.match_at(1).description); |
580 } | 645 } |
OLD | NEW |