OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "components/omnibox/browser/search_provider.h" | 5 #include "components/omnibox/browser/search_provider.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 const base::string16& text, | 213 const base::string16& text, |
214 const bool prefer_keyword, | 214 const bool prefer_keyword, |
215 const std::string& default_fetcher_response, | 215 const std::string& default_fetcher_response, |
216 const std::string& keyword_fetcher_response); | 216 const std::string& keyword_fetcher_response); |
217 | 217 |
218 // Notifies the URLFetcher for the suggest query corresponding to the default | 218 // Notifies the URLFetcher for the suggest query corresponding to the default |
219 // search provider that it's done. | 219 // search provider that it's done. |
220 // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE. | 220 // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE. |
221 void FinishDefaultSuggestQuery(); | 221 void FinishDefaultSuggestQuery(); |
222 | 222 |
223 // Runs SearchProvider on |input|, for which the suggest server replies | |
224 // with |json|, and expects that the resulting matches' contents equals | |
225 // that in |matches|. An empty entry in |matches| means no match should | |
226 // be returned in that position. Reports any errors with a message that | |
227 // includes |error_description|. | |
228 void ForcedQueryTestHelper(const std::string& input, | |
229 const std::string& json, | |
230 const std::string matches[3], | |
231 const std::string& error_description); | |
232 | |
233 // Verifies that |matches| and |expected_matches| agree on the first | 223 // Verifies that |matches| and |expected_matches| agree on the first |
234 // |num_expected_matches|, displaying an error message that includes | 224 // |num_expected_matches|, displaying an error message that includes |
235 // |description| for any disagreement. | 225 // |description| for any disagreement. |
236 void CheckMatches(const std::string& description, | 226 void CheckMatches(const std::string& description, |
237 const size_t num_expected_matches, | 227 const size_t num_expected_matches, |
238 const ExpectedMatch expected_matches[], | 228 const ExpectedMatch expected_matches[], |
239 const ACMatches& matches); | 229 const ACMatches& matches); |
240 | 230 |
241 void ResetFieldTrialList(); | 231 void ResetFieldTrialList(); |
242 | 232 |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 net::TestURLFetcher* default_fetcher = | 476 net::TestURLFetcher* default_fetcher = |
487 test_factory_.GetFetcherByID( | 477 test_factory_.GetFetcherByID( |
488 SearchProvider::kDefaultProviderURLFetcherID); | 478 SearchProvider::kDefaultProviderURLFetcherID); |
489 ASSERT_TRUE(default_fetcher); | 479 ASSERT_TRUE(default_fetcher); |
490 | 480 |
491 // Tell the SearchProvider the default suggest query is done. | 481 // Tell the SearchProvider the default suggest query is done. |
492 default_fetcher->set_response_code(200); | 482 default_fetcher->set_response_code(200); |
493 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher); | 483 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher); |
494 } | 484 } |
495 | 485 |
496 void SearchProviderTest::ForcedQueryTestHelper( | |
497 const std::string& input, | |
498 const std::string& json, | |
499 const std::string expected_matches[3], | |
500 const std::string& error_description) { | |
501 // Send the query twice in order to have a synchronous pass after the first | |
502 // response is received. This is necessary because SearchProvider doesn't | |
503 // allow an asynchronous response to change the default match. | |
504 for (size_t i = 0; i < 2; ++i) { | |
505 QueryForInputAndWaitForFetcherResponses( | |
506 ASCIIToUTF16(input), false, json, std::string()); | |
507 } | |
508 | |
509 const ACMatches& matches = provider_->matches(); | |
510 ASSERT_LE(matches.size(), 3u); | |
511 size_t i = 0; | |
512 // Ensure that the returned matches equal the expectations. | |
513 for (; i < matches.size(); ++i) { | |
514 EXPECT_EQ(ASCIIToUTF16(expected_matches[i]), matches[i].contents) << | |
515 error_description; | |
516 } | |
517 // Ensure that no expected matches are missing. | |
518 for (; i < 3u; ++i) { | |
519 EXPECT_EQ(std::string(), expected_matches[i]) << | |
520 "Case #" << i << ": " << error_description; | |
521 } | |
522 } | |
523 | |
524 void SearchProviderTest::CheckMatches(const std::string& description, | 486 void SearchProviderTest::CheckMatches(const std::string& description, |
525 const size_t num_expected_matches, | 487 const size_t num_expected_matches, |
526 const ExpectedMatch expected_matches[], | 488 const ExpectedMatch expected_matches[], |
527 const ACMatches& matches) { | 489 const ACMatches& matches) { |
528 ASSERT_FALSE(matches.empty()); | 490 ASSERT_FALSE(matches.empty()); |
529 ASSERT_LE(matches.size(), num_expected_matches); | 491 ASSERT_LE(matches.size(), num_expected_matches); |
530 size_t i = 0; | 492 size_t i = 0; |
531 SCOPED_TRACE(description); | 493 SCOPED_TRACE(description); |
532 // Ensure that the returned matches equal the expectations. | 494 // Ensure that the returned matches equal the expectations. |
533 for (; i < matches.size(); ++i) { | 495 for (; i < matches.size(); ++i) { |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 // 'docs.google.com'. The search term should have a lower priority than the | 763 // 'docs.google.com'. The search term should have a lower priority than the |
802 // what you typed match. | 764 // what you typed match. |
803 ASSERT_EQ(2u, provider_->matches().size()); | 765 ASSERT_EQ(2u, provider_->matches().size()); |
804 AutocompleteMatch term_match; | 766 AutocompleteMatch term_match; |
805 EXPECT_TRUE(FindMatchWithDestination(url, &term_match)); | 767 EXPECT_TRUE(FindMatchWithDestination(url, &term_match)); |
806 EXPECT_GT(wyt_match.relevance, term_match.relevance); | 768 EXPECT_GT(wyt_match.relevance, term_match.relevance); |
807 EXPECT_TRUE(wyt_match.allowed_to_be_default_match); | 769 EXPECT_TRUE(wyt_match.allowed_to_be_default_match); |
808 EXPECT_TRUE(term_match.allowed_to_be_default_match); | 770 EXPECT_TRUE(term_match.allowed_to_be_default_match); |
809 } | 771 } |
810 | 772 |
811 TEST_F(SearchProviderTest, DontGiveNavsuggestionsInForcedQueryMode) { | |
812 const std::string kEmptyMatch; | |
813 struct { | |
814 const std::string json; | |
815 const std::string matches_in_default_mode[3]; | |
816 const std::string matches_in_forced_query_mode[3]; | |
817 } cases[] = { | |
818 // Without suggested relevance scores. | |
819 { "[\"a\",[\"http://a1.com\", \"a2\"],[],[]," | |
820 "{\"google:suggesttype\":[\"NAVIGATION\", \"QUERY\"]}]", | |
821 { "a", "a1.com", "a2" }, | |
822 { "a", "a2", kEmptyMatch } }, | |
823 | |
824 // With suggested relevance scores in a situation where navsuggest would | |
825 // go second. | |
826 { "[\"a\",[\"http://a1.com\", \"a2\"],[],[]," | |
827 "{\"google:suggesttype\":[\"NAVIGATION\", \"QUERY\"]," | |
828 "\"google:suggestrelevance\":[1250, 1200]}]", | |
829 { "a", "a1.com", "a2" }, | |
830 { "a", "a2", kEmptyMatch } }, | |
831 | |
832 // With suggested relevance scores in a situation where navsuggest | |
833 // would go first. | |
834 { "[\"a\",[\"http://a1.com\", \"a2\"],[],[]," | |
835 "{\"google:suggesttype\":[\"NAVIGATION\", \"QUERY\"]," | |
836 "\"google:suggestrelevance\":[1350, 1250]}]", | |
837 { "a1.com", "a", "a2" }, | |
838 { "a", "a2", kEmptyMatch } }, | |
839 | |
840 // With suggested relevance scores in a situation where navsuggest | |
841 // would go first only because verbatim has been demoted. | |
842 { "[\"a\",[\"http://a1.com\", \"a2\"],[],[]," | |
843 "{\"google:suggesttype\":[\"NAVIGATION\", \"QUERY\"]," | |
844 "\"google:suggestrelevance\":[1450, 1400]," | |
845 "\"google:verbatimrelevance\":1350}]", | |
846 { "a1.com", "a2", "a" }, | |
847 { "a2", "a", kEmptyMatch } }, | |
848 }; | |
849 | |
850 for (size_t i = 0; i < arraysize(cases); ++i) { | |
851 ForcedQueryTestHelper("a", cases[i].json, cases[i].matches_in_default_mode, | |
852 "regular input with json=" + cases[i].json); | |
853 ForcedQueryTestHelper("?a", cases[i].json, | |
854 cases[i].matches_in_forced_query_mode, | |
855 "forced query input with json=" + cases[i].json); | |
856 } | |
857 } | |
858 | |
859 // A multiword search with one visit should not autocomplete until multiple | 773 // A multiword search with one visit should not autocomplete until multiple |
860 // words are typed. | 774 // words are typed. |
861 TEST_F(SearchProviderTest, DontAutocompleteUntilMultipleWordsTyped) { | 775 TEST_F(SearchProviderTest, DontAutocompleteUntilMultipleWordsTyped) { |
862 GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("one search"), | 776 GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("one search"), |
863 1)); | 777 1)); |
864 profile_.BlockUntilHistoryProcessesPendingRequests(); | 778 profile_.BlockUntilHistoryProcessesPendingRequests(); |
865 | 779 |
866 AutocompleteMatch wyt_match; | 780 AutocompleteMatch wyt_match; |
867 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("on"), | 781 ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("on"), |
868 &wyt_match)); | 782 &wyt_match)); |
(...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2726 { "www.ab", "https://www.abc.com/path/file.htm?q=x#foo", | 2640 { "www.ab", "https://www.abc.com/path/file.htm?q=x#foo", |
2727 "https://www.abc.com/path/file.htm?q=x#foo", | 2641 "https://www.abc.com/path/file.htm?q=x#foo", |
2728 "c.com/path/file.htm?q=x#foo", true, false }, | 2642 "c.com/path/file.htm?q=x#foo", true, false }, |
2729 { "ab", "https://www.abc.com/path/file.htm?q=x#foo", | 2643 { "ab", "https://www.abc.com/path/file.htm?q=x#foo", |
2730 "https://www.abc.com/path/file.htm?q=x#foo", | 2644 "https://www.abc.com/path/file.htm?q=x#foo", |
2731 "c.com/path/file.htm?q=x#foo", true, false }, | 2645 "c.com/path/file.htm?q=x#foo", true, false }, |
2732 { "ab", "https://abc.com/path/file.htm?q=x#foo", | 2646 { "ab", "https://abc.com/path/file.htm?q=x#foo", |
2733 "https://abc.com/path/file.htm?q=x#foo", | 2647 "https://abc.com/path/file.htm?q=x#foo", |
2734 "c.com/path/file.htm?q=x#foo", true, false }, | 2648 "c.com/path/file.htm?q=x#foo", true, false }, |
2735 | 2649 |
2736 // Forced query input should inline and retain the "?" prefix. | |
2737 { "?http://www.ab", "http://www.abc.com", | |
2738 "?http://www.abc.com", "c.com", true, false }, | |
2739 { "?www.ab", "http://www.abc.com", | |
2740 "?www.abc.com", "c.com", true, false }, | |
2741 { "?ab", "http://www.abc.com", | |
2742 "?www.abc.com", "c.com", true, false }, | |
2743 { "?abc.com", "http://www.abc.com", | |
2744 "?www.abc.com", std::string(), true, true }, | |
2745 }; | 2650 }; |
2746 | 2651 |
2747 for (size_t i = 0; i < arraysize(cases); ++i) { | 2652 for (size_t i = 0; i < arraysize(cases); ++i) { |
2748 // First test regular mode. | 2653 // First test regular mode. |
2749 QueryForInput(ASCIIToUTF16(cases[i].input), false, false); | 2654 QueryForInput(ASCIIToUTF16(cases[i].input), false, false); |
2750 SearchSuggestionParser::NavigationResult result( | 2655 SearchSuggestionParser::NavigationResult result( |
2751 ChromeAutocompleteSchemeClassifier(&profile_), GURL(cases[i].url), | 2656 ChromeAutocompleteSchemeClassifier(&profile_), GURL(cases[i].url), |
2752 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(), | 2657 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(), |
2753 false, 0, false, ASCIIToUTF16(cases[i].input)); | 2658 false, 0, false, ASCIIToUTF16(cases[i].input)); |
2754 result.set_received_after_last_keystroke(false); | 2659 result.set_received_after_last_keystroke(false); |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3598 } | 3503 } |
3599 | 3504 |
3600 TEST_F(SearchProviderTest, DoesNotProvideOnFocus) { | 3505 TEST_F(SearchProviderTest, DoesNotProvideOnFocus) { |
3601 AutocompleteInput input( | 3506 AutocompleteInput input( |
3602 base::ASCIIToUTF16("f"), base::string16::npos, std::string(), GURL(), | 3507 base::ASCIIToUTF16("f"), base::string16::npos, std::string(), GURL(), |
3603 metrics::OmniboxEventProto::INVALID_SPEC, false, true, true, true, true, | 3508 metrics::OmniboxEventProto::INVALID_SPEC, false, true, true, true, true, |
3604 ChromeAutocompleteSchemeClassifier(&profile_)); | 3509 ChromeAutocompleteSchemeClassifier(&profile_)); |
3605 provider_->Start(input, false); | 3510 provider_->Start(input, false); |
3606 EXPECT_TRUE(provider_->matches().empty()); | 3511 EXPECT_TRUE(provider_->matches().empty()); |
3607 } | 3512 } |
OLD | NEW |