| Index: components/autofill/core/browser/autofill_external_delegate_unittest.cc
|
| diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
|
| index 251d738d0b11009e956083f87a0000f1f51d2514..57610348d27f378b2d34eaa1501aa41f7367f188 100644
|
| --- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc
|
| +++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
|
| @@ -35,6 +35,51 @@ const int kQueryId = 5;
|
| // A constant value to use as an Autofill profile ID.
|
| const int kAutofillProfileId = 1;
|
|
|
| +// Gmock matcher that allows checking the frontend IDs of a sequence of
|
| +// suggestions. This wraps a GMock container matcher, converts the suggestion
|
| +// frontend IDs to a vector of ints, and then runs the container matcher
|
| +// against the result to test an argument. See SuggestionVectorIdsAre() below.
|
| +class SuggestionVectorIdsAreMatcher
|
| + : public testing::MatcherInterface<const std::vector<Suggestion>&> {
|
| + public:
|
| + typedef std::vector<int> Container;
|
| + typedef testing::Matcher<Container> ContainerMatcher;
|
| +
|
| + explicit SuggestionVectorIdsAreMatcher(const ContainerMatcher& seq_matcher)
|
| + : container_matcher_(seq_matcher) {
|
| + }
|
| +
|
| + virtual bool MatchAndExplain(const std::vector<Suggestion>& suggestions,
|
| + testing::MatchResultListener* listener) const {
|
| + Container frontend_ids;
|
| + for (const auto& suggestion : suggestions)
|
| + frontend_ids.push_back(suggestion.frontend_id);
|
| + return container_matcher_.MatchAndExplain(frontend_ids, listener);
|
| + }
|
| +
|
| + virtual void DescribeTo(::std::ostream* os) const {
|
| + container_matcher_.DescribeTo(os);
|
| + }
|
| +
|
| + virtual void DescribeNegationTo(::std::ostream* os) const {
|
| + container_matcher_.DescribeNegationTo(os);
|
| + }
|
| +
|
| + private:
|
| + ContainerMatcher container_matcher_;
|
| +};
|
| +
|
| +// Use this matcher to compare a sequence vector's IDs to a list. In an
|
| +// EXPECT_CALL statement, use the following for an vector<Suggestion> argument
|
| +// to compare the IDs against a constant list:
|
| +// SuggestionVectorIdsAre(testing::ElementsAre(1, 2, 3, 4))
|
| +template<class EltsAreMatcher>
|
| +inline testing::Matcher<const std::vector<Suggestion>&>
|
| +SuggestionVectorIdsAre(const EltsAreMatcher& elts_are_matcher) {
|
| + return MakeMatcher(
|
| + new SuggestionVectorIdsAreMatcher(elts_are_matcher));
|
| +}
|
| +
|
| class MockAutofillDriver : public TestAutofillDriver {
|
| public:
|
| MockAutofillDriver() {}
|
| @@ -58,13 +103,10 @@ class MockAutofillClient : public autofill::TestAutofillClient {
|
| MOCK_METHOD1(ScanCreditCard,
|
| void(const CreditCardScanCallback& callbacK));
|
|
|
| - MOCK_METHOD7(ShowAutofillPopup,
|
| + MOCK_METHOD4(ShowAutofillPopup,
|
| void(const gfx::RectF& element_bounds,
|
| base::i18n::TextDirection text_direction,
|
| - const std::vector<base::string16>& values,
|
| - const std::vector<base::string16>& labels,
|
| - const std::vector<base::string16>& icons,
|
| - const std::vector<int>& identifiers,
|
| + const std::vector<Suggestion>& suggestions,
|
| base::WeakPtr<AutofillPopupDelegate> delegate));
|
|
|
| MOCK_METHOD2(UpdateAutofillPopupDataListValues,
|
| @@ -151,25 +193,17 @@ TEST_F(AutofillExternalDelegateUnitTest, TestExternalDelegateVirtualCalls) {
|
| autofill_client_,
|
| ShowAutofillPopup(_,
|
| _,
|
| - _,
|
| - _,
|
| - _,
|
| - testing::ElementsAre(
|
| + SuggestionVectorIdsAre(testing::ElementsAre(
|
| kAutofillProfileId,
|
| static_cast<int>(POPUP_ITEM_ID_SEPARATOR),
|
| - static_cast<int>(POPUP_ITEM_ID_AUTOFILL_OPTIONS)),
|
| + static_cast<int>(POPUP_ITEM_ID_AUTOFILL_OPTIONS))),
|
| _));
|
|
|
| // This should call ShowAutofillPopup.
|
| - std::vector<base::string16> autofill_item;
|
| - autofill_item.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(kAutofillProfileId);
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_ids);
|
| + std::vector<Suggestion> autofill_item;
|
| + autofill_item.push_back(Suggestion());
|
| + autofill_item[0].frontend_id = kAutofillProfileId;
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_item);
|
|
|
| EXPECT_CALL(*autofill_manager_,
|
| FillOrPreviewForm(
|
| @@ -178,7 +212,8 @@ TEST_F(AutofillExternalDelegateUnitTest, TestExternalDelegateVirtualCalls) {
|
|
|
| // This should trigger a call to hide the popup since we've selected an
|
| // option.
|
| - external_delegate_->DidAcceptSuggestion(autofill_item[0], autofill_ids[0]);
|
| + external_delegate_->DidAcceptSuggestion(autofill_item[0].value,
|
| + autofill_item[0].frontend_id);
|
| }
|
|
|
| // Test that data list elements for a node will appear in the Autofill popup.
|
| @@ -200,27 +235,19 @@ TEST_F(AutofillExternalDelegateUnitTest, ExternalDelegateDataList) {
|
| autofill_client_,
|
| ShowAutofillPopup(_,
|
| _,
|
| - _,
|
| - _,
|
| - _,
|
| - testing::ElementsAre(
|
| + SuggestionVectorIdsAre(testing::ElementsAre(
|
| static_cast<int>(POPUP_ITEM_ID_DATALIST_ENTRY),
|
| static_cast<int>(POPUP_ITEM_ID_SEPARATOR),
|
| kAutofillProfileId,
|
| static_cast<int>(POPUP_ITEM_ID_SEPARATOR),
|
| - static_cast<int>(POPUP_ITEM_ID_AUTOFILL_OPTIONS)),
|
| + static_cast<int>(POPUP_ITEM_ID_AUTOFILL_OPTIONS))),
|
| _));
|
|
|
| // This should call ShowAutofillPopup.
|
| - std::vector<base::string16> autofill_item;
|
| - autofill_item.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(kAutofillProfileId);
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_ids);
|
| + std::vector<Suggestion> autofill_item;
|
| + autofill_item.push_back(Suggestion());
|
| + autofill_item[0].frontend_id = kAutofillProfileId;
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_item);
|
|
|
| // Try calling OnSuggestionsReturned with no Autofill values and ensure
|
| // the datalist items are still shown.
|
| @@ -230,26 +257,19 @@ TEST_F(AutofillExternalDelegateUnitTest, ExternalDelegateDataList) {
|
| ShowAutofillPopup(
|
| _,
|
| _,
|
| - _,
|
| - _,
|
| - _,
|
| - testing::ElementsAre(static_cast<int>(POPUP_ITEM_ID_DATALIST_ENTRY)),
|
| + SuggestionVectorIdsAre(testing::ElementsAre(
|
| + static_cast<int>(POPUP_ITEM_ID_DATALIST_ENTRY))),
|
| _));
|
|
|
| - autofill_item = std::vector<base::string16>();
|
| - autofill_ids = std::vector<int>();
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_ids);
|
| + autofill_item.clear();
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_item);
|
| }
|
|
|
| // Test that datalist values can get updated while a popup is showing.
|
| TEST_F(AutofillExternalDelegateUnitTest, UpdateDataListWhileShowingPopup) {
|
| IssueOnQuery(kQueryId);
|
|
|
| - EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _, _, _, _))
|
| + EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _))
|
| .Times(0);
|
|
|
| // Make sure just setting the data list values doesn't cause the popup to
|
| @@ -269,27 +289,19 @@ TEST_F(AutofillExternalDelegateUnitTest, UpdateDataListWhileShowingPopup) {
|
| autofill_client_,
|
| ShowAutofillPopup(_,
|
| _,
|
| - _,
|
| - _,
|
| - _,
|
| - testing::ElementsAre(
|
| + SuggestionVectorIdsAre(testing::ElementsAre(
|
| static_cast<int>(POPUP_ITEM_ID_DATALIST_ENTRY),
|
| static_cast<int>(POPUP_ITEM_ID_SEPARATOR),
|
| kAutofillProfileId,
|
| static_cast<int>(POPUP_ITEM_ID_SEPARATOR),
|
| - static_cast<int>(POPUP_ITEM_ID_AUTOFILL_OPTIONS)),
|
| + static_cast<int>(POPUP_ITEM_ID_AUTOFILL_OPTIONS))),
|
| _));
|
|
|
| // Ensure the popup is displayed.
|
| - std::vector<base::string16> autofill_item;
|
| - autofill_item.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(kAutofillProfileId);
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_ids);
|
| + std::vector<Suggestion> autofill_item;
|
| + autofill_item.push_back(Suggestion());
|
| + autofill_item[0].frontend_id = kAutofillProfileId;
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_item);
|
|
|
| // This would normally get called from ShowAutofillPopup, but it is mocked so
|
| // we need to call OnPopupShown ourselves.
|
| @@ -319,22 +331,15 @@ TEST_F(AutofillExternalDelegateUnitTest, AutofillWarnings) {
|
| ShowAutofillPopup(
|
| _,
|
| _,
|
| - _,
|
| - _,
|
| - _,
|
| - testing::ElementsAre(static_cast<int>(POPUP_ITEM_ID_WARNING_MESSAGE)),
|
| + SuggestionVectorIdsAre(testing::ElementsAre(
|
| + static_cast<int>(POPUP_ITEM_ID_WARNING_MESSAGE))),
|
| _));
|
|
|
| // This should call ShowAutofillPopup.
|
| - std::vector<base::string16> autofill_item;
|
| - autofill_item.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(POPUP_ITEM_ID_WARNING_MESSAGE);
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_ids);
|
| + std::vector<Suggestion> autofill_item;
|
| + autofill_item.push_back(Suggestion());
|
| + autofill_item[0].frontend_id = POPUP_ITEM_ID_WARNING_MESSAGE;
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_item);
|
| }
|
|
|
| // Test that the Autofill popup doesn't display a warning explaining why
|
| @@ -354,20 +359,15 @@ TEST_F(AutofillExternalDelegateUnitTest, NoAutofillWarningsWithoutSuggestions) {
|
|
|
| external_delegate_->OnQuery(kQueryId, form, field, element_bounds, true);
|
|
|
| - EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _, _, _, _))
|
| + EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _))
|
| .Times(0);
|
| EXPECT_CALL(autofill_client_, HideAutofillPopup()).Times(1);
|
|
|
| // This should not call ShowAutofillPopup.
|
| - std::vector<base::string16> autofill_item;
|
| - autofill_item.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY);
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_item,
|
| - autofill_ids);
|
| + std::vector<Suggestion> autofill_item;
|
| + autofill_item.push_back(Suggestion());
|
| + autofill_item[0].frontend_id = POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY;
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_item);
|
| }
|
|
|
| // Test that the Autofill delegate doesn't try and fill a form with a
|
| @@ -410,7 +410,7 @@ TEST_F(AutofillExternalDelegateUnitTest, ExternalDelegateClearPreviewedForm) {
|
| // Test that the popup is hidden once we are done editing the autofill field.
|
| TEST_F(AutofillExternalDelegateUnitTest,
|
| ExternalDelegateHidePopupAfterEditing) {
|
| - EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _, _, _, _));
|
| + EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _));
|
| autofill::GenerateTestAutofillPopup(external_delegate_.get());
|
|
|
| EXPECT_CALL(autofill_client_, HideAutofillPopup());
|
| @@ -474,20 +474,15 @@ TEST_F(AutofillExternalDelegateUnitTest, ExternalDelegateHideWarning) {
|
|
|
| external_delegate_->OnQuery(kQueryId, form, field, element_bounds, false);
|
|
|
| - std::vector<base::string16> autofill_items;
|
| - autofill_items.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY);
|
| + std::vector<Suggestion> autofill_items;
|
| + autofill_items.push_back(Suggestion());
|
| + autofill_items[0].frontend_id = POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY;
|
|
|
| // Ensure the popup tries to hide itself, since it is not allowed to show
|
| // anything.
|
| EXPECT_CALL(autofill_client_, HideAutofillPopup());
|
|
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_items,
|
| - autofill_items,
|
| - autofill_items,
|
| - autofill_ids);
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_items);
|
| }
|
|
|
| TEST_F(AutofillExternalDelegateUnitTest, IgnoreAutocompleteOffForAutofill) {
|
| @@ -499,20 +494,15 @@ TEST_F(AutofillExternalDelegateUnitTest, IgnoreAutocompleteOffForAutofill) {
|
|
|
| external_delegate_->OnQuery(kQueryId, form, field, element_bounds, false);
|
|
|
| - std::vector<base::string16> autofill_items;
|
| - autofill_items.push_back(base::string16());
|
| - std::vector<int> autofill_ids;
|
| - autofill_ids.push_back(POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY);
|
| + std::vector<Suggestion> autofill_items;
|
| + autofill_items.push_back(Suggestion());
|
| + autofill_items[0].frontend_id = POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY;
|
|
|
| // Ensure the popup tries to show itself, despite autocomplete="off".
|
| - EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _, _, _, _));
|
| + EXPECT_CALL(autofill_client_, ShowAutofillPopup(_, _, _, _));
|
| EXPECT_CALL(autofill_client_, HideAutofillPopup()).Times(0);
|
|
|
| - external_delegate_->OnSuggestionsReturned(kQueryId,
|
| - autofill_items,
|
| - autofill_items,
|
| - autofill_items,
|
| - autofill_ids);
|
| + external_delegate_->OnSuggestionsReturned(kQueryId, autofill_items);
|
| }
|
|
|
| TEST_F(AutofillExternalDelegateUnitTest, ExternalDelegateFillFieldWithValue) {
|
|
|