OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/autocomplete_result.h" | 5 #include "components/omnibox/autocomplete_result.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 TestSchemeClassifier()); | 550 TestSchemeClassifier()); |
551 result.SortAndCull(input, template_url_service_.get()); | 551 result.SortAndCull(input, template_url_service_.get()); |
552 ASSERT_EQ(4U, result.size()); | 552 ASSERT_EQ(4U, result.size()); |
553 EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); | 553 EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); |
554 EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); | 554 EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); |
555 EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); | 555 EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); |
556 EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); | 556 EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); |
557 } | 557 } |
558 } | 558 } |
559 | 559 |
560 | |
561 | |
562 TEST_F(AutocompleteResultTest, SortAndCullWithDisableInlining) { | |
563 TestData data[] = { | |
564 { 0, 0, 1300 }, | |
565 { 1, 0, 1200 }, | |
566 { 2, 0, 1100 }, | |
567 { 3, 0, 1000 } | |
568 }; | |
569 | |
570 { | |
571 // Check that with the field trial disabled, we keep keep the first match | |
572 // first even if it has an inline autocompletion. | |
573 ACMatches matches; | |
574 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
575 matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
576 AutocompleteResult result; | |
577 result.AppendMatches(matches); | |
578 AutocompleteInput input(base::string16(), base::string16::npos, | |
579 std::string(), GURL(), | |
580 OmniboxEventProto::HOME_PAGE, false, false, false, | |
581 true, | |
582 TestSchemeClassifier()); | |
583 result.SortAndCull(input, template_url_service_.get()); | |
584 AssertResultMatches(result, data, 4); | |
585 } | |
586 | |
587 // Enable the field trial to disable inlining. | |
588 { | |
589 std::map<std::string, std::string> params; | |
590 params[OmniboxFieldTrial::kDisableInliningRule] = "true"; | |
591 ASSERT_TRUE(variations::AssociateVariationParams( | |
592 OmniboxFieldTrial::kBundledExperimentFieldTrialName, "D", params)); | |
593 } | |
594 base::FieldTrialList::CreateFieldTrial( | |
595 OmniboxFieldTrial::kBundledExperimentFieldTrialName, "D"); | |
596 | |
597 { | |
598 // Now the first match should be demoted past the second. | |
599 ACMatches matches; | |
600 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
601 matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
602 AutocompleteResult result; | |
603 result.AppendMatches(matches); | |
604 AutocompleteInput input(base::string16(), base::string16::npos, | |
605 std::string(), GURL(), | |
606 OmniboxEventProto::HOME_PAGE, false, false, false, | |
607 true, | |
608 TestSchemeClassifier()); | |
609 result.SortAndCull(input, template_url_service_.get()); | |
610 ASSERT_EQ(4U, result.size()); | |
611 EXPECT_EQ("http://b/", result.match_at(0)->destination_url.spec()); | |
612 EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); | |
613 EXPECT_EQ("http://c/", result.match_at(2)->destination_url.spec()); | |
614 EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); | |
615 } | |
616 | |
617 { | |
618 // But if there was no inline autocompletion on the first match, then | |
619 // the order should stay the same. This is true even if there are | |
620 // inline autocompletions elsewhere. | |
621 ACMatches matches; | |
622 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
623 matches[2].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
624 AutocompleteResult result; | |
625 result.AppendMatches(matches); | |
626 AutocompleteInput input(base::string16(), base::string16::npos, | |
627 std::string(), GURL(), | |
628 OmniboxEventProto::HOME_PAGE, false, false, false, | |
629 true, | |
630 TestSchemeClassifier()); | |
631 result.SortAndCull(input, template_url_service_.get()); | |
632 AssertResultMatches(result, data, 4); | |
633 } | |
634 | |
635 { | |
636 // Try a more complicated situation. | |
637 ACMatches matches; | |
638 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
639 matches[0].allowed_to_be_default_match = false; | |
640 matches[1].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
641 AutocompleteResult result; | |
642 result.AppendMatches(matches); | |
643 AutocompleteInput input(base::string16(), base::string16::npos, | |
644 std::string(), GURL(), | |
645 OmniboxEventProto::HOME_PAGE, false, false, false, | |
646 true, | |
647 TestSchemeClassifier()); | |
648 result.SortAndCull(input, template_url_service_.get()); | |
649 ASSERT_EQ(4U, result.size()); | |
650 EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); | |
651 EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); | |
652 EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); | |
653 EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); | |
654 } | |
655 | |
656 { | |
657 // Try another complicated situation. | |
658 ACMatches matches; | |
659 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
660 matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
661 matches[1].allowed_to_be_default_match = false; | |
662 AutocompleteResult result; | |
663 result.AppendMatches(matches); | |
664 AutocompleteInput input(base::string16(), base::string16::npos, | |
665 std::string(), GURL(), | |
666 OmniboxEventProto::HOME_PAGE, false, false, false, | |
667 true, | |
668 TestSchemeClassifier()); | |
669 result.SortAndCull(input, template_url_service_.get()); | |
670 ASSERT_EQ(4U, result.size()); | |
671 EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); | |
672 EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); | |
673 EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); | |
674 EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); | |
675 } | |
676 | |
677 { | |
678 // Check that disaster doesn't strike if we can't demote the top inline | |
679 // autocompletion because every match either has a completion or isn't | |
680 // allowed to be the default match. In this case, we should leave | |
681 // everything untouched. | |
682 ACMatches matches; | |
683 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
684 matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
685 matches[1].allowed_to_be_default_match = false; | |
686 matches[2].allowed_to_be_default_match = false; | |
687 matches[3].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
688 AutocompleteResult result; | |
689 result.AppendMatches(matches); | |
690 AutocompleteInput input(base::string16(), base::string16::npos, | |
691 std::string(), GURL(), | |
692 OmniboxEventProto::HOME_PAGE, false, false, false, | |
693 true, | |
694 TestSchemeClassifier()); | |
695 result.SortAndCull(input, template_url_service_.get()); | |
696 AssertResultMatches(result, data, 4); | |
697 } | |
698 | |
699 { | |
700 // Check a similar situation, except in this case the top match is not | |
701 // allowed to the default match, so it still needs to be demoted so we | |
702 // get a legal default match first. That match will have an inline | |
703 // autocompletion because we don't have any better options. | |
704 ACMatches matches; | |
705 PopulateAutocompleteMatches(data, arraysize(data), &matches); | |
706 matches[0].allowed_to_be_default_match = false; | |
707 matches[1].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
708 matches[2].allowed_to_be_default_match = false; | |
709 matches[3].inline_autocompletion = base::ASCIIToUTF16("completion"); | |
710 AutocompleteResult result; | |
711 result.AppendMatches(matches); | |
712 AutocompleteInput input(base::string16(), base::string16::npos, | |
713 std::string(), GURL(), | |
714 OmniboxEventProto::HOME_PAGE, false, false, false, | |
715 true, | |
716 TestSchemeClassifier()); | |
717 result.SortAndCull(input, template_url_service_.get()); | |
718 ASSERT_EQ(4U, result.size()); | |
719 EXPECT_EQ("http://b/", result.match_at(0)->destination_url.spec()); | |
720 EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); | |
721 EXPECT_EQ("http://c/", result.match_at(2)->destination_url.spec()); | |
722 EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); | |
723 } | |
724 } | |
725 | |
726 TEST_F(AutocompleteResultTest, ShouldHideTopMatch) { | 560 TEST_F(AutocompleteResultTest, ShouldHideTopMatch) { |
727 base::FieldTrialList::CreateFieldTrial("InstantExtended", | 561 base::FieldTrialList::CreateFieldTrial("InstantExtended", |
728 "Group1 hide_verbatim:1"); | 562 "Group1 hide_verbatim:1"); |
729 ACMatches matches; | 563 ACMatches matches; |
730 | 564 |
731 // Case 1: Top match is a verbatim match. | 565 // Case 1: Top match is a verbatim match. |
732 PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); | 566 PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); |
733 AutocompleteResult result; | 567 AutocompleteResult result; |
734 result.AppendMatches(matches); | 568 result.AppendMatches(matches); |
735 EXPECT_TRUE(result.ShouldHideTopMatch()); | 569 EXPECT_TRUE(result.ShouldHideTopMatch()); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 result.Reset(); | 661 result.Reset(); |
828 matches.clear(); | 662 matches.clear(); |
829 | 663 |
830 // Case 5: Multiple verbatim matches found in AutocompleteResult. | 664 // Case 5: Multiple verbatim matches found in AutocompleteResult. |
831 PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, | 665 PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, |
832 arraysize(kVerbatimMatches), | 666 arraysize(kVerbatimMatches), |
833 &matches); | 667 &matches); |
834 result.AppendMatches(matches); | 668 result.AppendMatches(matches); |
835 EXPECT_FALSE(result.ShouldHideTopMatch()); | 669 EXPECT_FALSE(result.ShouldHideTopMatch()); |
836 } | 670 } |
OLD | NEW |