| Index: components/autofill/core/browser/autofill_external_delegate.cc
|
| diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
|
| index 1e31843fdbc40481b70f3c72f4c573e4ef631f40..38278000144ce77d509da767e941e615f803e087 100644
|
| --- a/components/autofill/core/browser/autofill_external_delegate.cc
|
| +++ b/components/autofill/core/browser/autofill_external_delegate.cc
|
| @@ -90,41 +90,33 @@ void AutofillExternalDelegate::OnQuery(int query_id,
|
|
|
| void AutofillExternalDelegate::OnSuggestionsReturned(
|
| int query_id,
|
| - const std::vector<base::string16>& suggested_values,
|
| - const std::vector<base::string16>& suggested_labels,
|
| - const std::vector<base::string16>& suggested_icons,
|
| - const std::vector<int>& suggested_unique_ids) {
|
| + const std::vector<Suggestion>& input_suggestions) {
|
| if (query_id != query_id_)
|
| return;
|
|
|
| - std::vector<base::string16> values(suggested_values);
|
| - std::vector<base::string16> labels(suggested_labels);
|
| - std::vector<base::string16> icons(suggested_icons);
|
| - std::vector<int> ids(suggested_unique_ids);
|
| + std::vector<Suggestion> suggestions(input_suggestions);
|
|
|
| // Add or hide warnings as appropriate.
|
| - ApplyAutofillWarnings(&values, &labels, &icons, &ids);
|
| + ApplyAutofillWarnings(&suggestions);
|
|
|
| if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kEnableWalletCardImport)) {
|
| // For now, add a fake masked card.
|
| - values.push_back(base::ASCIIToUTF16("Visa - 1111"));
|
| - labels.push_back(base::ASCIIToUTF16("[tap to unlock]"));
|
| - icons.push_back(base::string16());
|
| - ids.push_back(POPUP_ITEM_ID_FAKE_MASKED_INSTRUMENT);
|
| + suggestions.push_back(Suggestion(
|
| + "Visa - 1111", "[tap to unlock]", "",
|
| + POPUP_ITEM_ID_FAKE_MASKED_INSTRUMENT));
|
| }
|
|
|
| // Add a separator to go between the values and menu items.
|
| - values.push_back(base::string16());
|
| - labels.push_back(base::string16());
|
| - icons.push_back(base::string16());
|
| - ids.push_back(POPUP_ITEM_ID_SEPARATOR);
|
| + suggestions.push_back(Suggestion());
|
| + suggestions.back().frontend_id = POPUP_ITEM_ID_SEPARATOR;
|
|
|
| if (should_show_scan_credit_card_) {
|
| - values.push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_SCAN_CREDIT_CARD));
|
| - labels.push_back(base::string16());
|
| - icons.push_back(base::ASCIIToUTF16("scanCreditCardIcon"));
|
| - ids.push_back(POPUP_ITEM_ID_SCAN_CREDIT_CARD);
|
| + Suggestion scan_credit_card(
|
| + l10n_util::GetStringUTF16(IDS_AUTOFILL_SCAN_CREDIT_CARD));
|
| + scan_credit_card.frontend_id = POPUP_ITEM_ID_SCAN_CREDIT_CARD;
|
| + scan_credit_card.icon = base::ASCIIToUTF16("scanCreditCardIcon");
|
| + suggestions.push_back(scan_credit_card);
|
|
|
| if (!has_shown_popup_for_current_edit_) {
|
| AutofillMetrics::LogScanCreditCardPromptMetric(
|
| @@ -135,39 +127,34 @@ void AutofillExternalDelegate::OnSuggestionsReturned(
|
| // Only include "Autofill Options" special menu item if we have Autofill
|
| // suggestions.
|
| has_suggestion_ = false;
|
| - for (size_t i = 0; i < ids.size(); ++i) {
|
| - if (ids[i] > 0) {
|
| + for (size_t i = 0; i < suggestions.size(); ++i) {
|
| + if (suggestions[i].frontend_id > 0) {
|
| has_suggestion_ = true;
|
| break;
|
| }
|
| }
|
|
|
| if (has_suggestion_)
|
| - ApplyAutofillOptions(&values, &labels, &icons, &ids);
|
| + ApplyAutofillOptions(&suggestions);
|
|
|
| // Remove the separator if it is the last element.
|
| - DCHECK_GT(ids.size(), 0U);
|
| - if (ids.back() == POPUP_ITEM_ID_SEPARATOR) {
|
| - values.pop_back();
|
| - labels.pop_back();
|
| - icons.pop_back();
|
| - ids.pop_back();
|
| - }
|
| + DCHECK_GT(suggestions.size(), 0U);
|
| + if (suggestions.back().frontend_id == POPUP_ITEM_ID_SEPARATOR)
|
| + suggestions.pop_back();
|
|
|
| // If anything else is added to modify the values after inserting the data
|
| // list, AutofillPopupControllerImpl::UpdateDataListValues will need to be
|
| // updated to match.
|
| - InsertDataListValues(&values, &labels, &icons, &ids);
|
| + InsertDataListValues(&suggestions);
|
|
|
| #if defined(OS_MACOSX) && !defined(OS_IOS)
|
| - if (values.empty() &&
|
| + if (suggestions.empty() &&
|
| manager_->ShouldShowAccessAddressBookSuggestion(query_form_,
|
| query_field_)) {
|
| - values.push_back(
|
| + Suggestion mac_contacts(
|
| l10n_util::GetStringUTF16(IDS_AUTOFILL_ACCESS_MAC_CONTACTS));
|
| - labels.push_back(base::string16());
|
| - icons.push_back(base::ASCIIToUTF16("macContactsIcon"));
|
| - ids.push_back(POPUP_ITEM_ID_MAC_ACCESS_CONTACTS);
|
| + mac_contacts.icon = base::ASCIIToUTF16("macContactsIcon");
|
| + mac_contacts.frontend_id = POPUP_ITEM_ID_MAC_ACCESS_CONTACTS;
|
|
|
| if (!has_shown_address_book_prompt) {
|
| has_shown_address_book_prompt = true;
|
| @@ -177,7 +164,7 @@ void AutofillExternalDelegate::OnSuggestionsReturned(
|
| }
|
| #endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
|
|
| - if (values.empty()) {
|
| + if (suggestions.empty()) {
|
| // No suggestions, any popup currently showing is obsolete.
|
| manager_->client()->HideAutofillPopup();
|
| return;
|
| @@ -187,10 +174,7 @@ void AutofillExternalDelegate::OnSuggestionsReturned(
|
| if (query_field_.is_focusable) {
|
| manager_->client()->ShowAutofillPopup(element_bounds_,
|
| query_field_.text_direction,
|
| - values,
|
| - labels,
|
| - icons,
|
| - ids,
|
| + suggestions,
|
| GetWeakPtr());
|
| }
|
| }
|
| @@ -361,102 +345,70 @@ void AutofillExternalDelegate::FillAutofillFormData(int unique_id,
|
| }
|
|
|
| void AutofillExternalDelegate::ApplyAutofillWarnings(
|
| - std::vector<base::string16>* values,
|
| - std::vector<base::string16>* labels,
|
| - std::vector<base::string16>* icons,
|
| - std::vector<int>* unique_ids) {
|
| + std::vector<Suggestion>* suggestions) {
|
| if (!ShouldAutofill(query_field_)) {
|
| // Autofill is disabled. If there were some profile or credit card
|
| // suggestions to show, show a warning instead. Otherwise, clear out the
|
| // list of suggestions.
|
| - if (!unique_ids->empty() && (*unique_ids)[0] > 0) {
|
| + if (!suggestions->empty() && (*suggestions)[0].frontend_id > 0) {
|
| // If Autofill is disabled and we had suggestions, show a warning instead.
|
| - values->assign(
|
| - 1, l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED));
|
| - labels->assign(1, base::string16());
|
| - icons->assign(1, base::string16());
|
| - unique_ids->assign(1, POPUP_ITEM_ID_WARNING_MESSAGE);
|
| + suggestions->assign(1, Suggestion(
|
| + l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED)));
|
| + (*suggestions)[0].frontend_id = POPUP_ITEM_ID_WARNING_MESSAGE;
|
| } else {
|
| - values->clear();
|
| - labels->clear();
|
| - icons->clear();
|
| - unique_ids->clear();
|
| + suggestions->clear();
|
| }
|
| - } else if (unique_ids->size() > 1 &&
|
| - (*unique_ids)[0] == POPUP_ITEM_ID_WARNING_MESSAGE) {
|
| + } else if (suggestions->size() > 1 &&
|
| + (*suggestions)[0].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE) {
|
| // If we received a warning instead of suggestions from Autofill but regular
|
| // suggestions from autocomplete, don't show the Autofill warning.
|
| - values->erase(values->begin());
|
| - labels->erase(labels->begin());
|
| - icons->erase(icons->begin());
|
| - unique_ids->erase(unique_ids->begin());
|
| + suggestions->erase(suggestions->begin());
|
| }
|
|
|
| // If we were about to show a warning and we shouldn't, don't.
|
| - if (!unique_ids->empty() &&
|
| - (*unique_ids)[0] == POPUP_ITEM_ID_WARNING_MESSAGE &&
|
| + if (!suggestions->empty() &&
|
| + (*suggestions)[0].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE &&
|
| !display_warning_if_disabled_) {
|
| - values->clear();
|
| - labels->clear();
|
| - icons->clear();
|
| - unique_ids->clear();
|
| + suggestions->clear();
|
| }
|
| }
|
|
|
| void AutofillExternalDelegate::ApplyAutofillOptions(
|
| - std::vector<base::string16>* values,
|
| - std::vector<base::string16>* labels,
|
| - std::vector<base::string16>* icons,
|
| - std::vector<int>* unique_ids) {
|
| + std::vector<Suggestion>* suggestions) {
|
| // The form has been auto-filled, so give the user the chance to clear the
|
| // form. Append the 'Clear form' menu item.
|
| if (query_field_.is_autofilled) {
|
| - values->push_back(
|
| - l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM));
|
| - labels->push_back(base::string16());
|
| - icons->push_back(base::string16());
|
| - unique_ids->push_back(POPUP_ITEM_ID_CLEAR_FORM);
|
| + suggestions->push_back(Suggestion(
|
| + l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM)));
|
| + suggestions->back().frontend_id = POPUP_ITEM_ID_CLEAR_FORM;
|
| }
|
|
|
| // Append the 'Chrome Autofill options' menu item;
|
| - values->push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP));
|
| - labels->push_back(base::string16());
|
| - icons->push_back(base::string16());
|
| - unique_ids->push_back(POPUP_ITEM_ID_AUTOFILL_OPTIONS);
|
| + suggestions->push_back(Suggestion(
|
| + l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP)));
|
| + suggestions->back().frontend_id = POPUP_ITEM_ID_AUTOFILL_OPTIONS;
|
| }
|
|
|
| void AutofillExternalDelegate::InsertDataListValues(
|
| - std::vector<base::string16>* values,
|
| - std::vector<base::string16>* labels,
|
| - std::vector<base::string16>* icons,
|
| - std::vector<int>* unique_ids) {
|
| + std::vector<Suggestion>* suggestions) {
|
| if (data_list_values_.empty())
|
| return;
|
|
|
| // Insert the separator between the datalist and Autofill values (if there
|
| // are any).
|
| - if (!values->empty()) {
|
| - values->insert(values->begin(), base::string16());
|
| - labels->insert(labels->begin(), base::string16());
|
| - icons->insert(icons->begin(), base::string16());
|
| - unique_ids->insert(unique_ids->begin(), POPUP_ITEM_ID_SEPARATOR);
|
| + if (!suggestions->empty()) {
|
| + suggestions->insert(suggestions->begin(), Suggestion());
|
| + (*suggestions)[0].frontend_id = POPUP_ITEM_ID_SEPARATOR;
|
| }
|
|
|
| - // Insert the datalist elements.
|
| - values->insert(values->begin(),
|
| - data_list_values_.begin(),
|
| - data_list_values_.end());
|
| - labels->insert(labels->begin(),
|
| - data_list_labels_.begin(),
|
| - data_list_labels_.end());
|
| -
|
| - // Set the values that all datalist elements share.
|
| - icons->insert(icons->begin(),
|
| - data_list_values_.size(),
|
| - base::string16());
|
| - unique_ids->insert(unique_ids->begin(),
|
| - data_list_values_.size(),
|
| - POPUP_ITEM_ID_DATALIST_ENTRY);
|
| + // Insert the datalist elements at the beginning.
|
| + suggestions->insert(suggestions->begin(), data_list_values_.size(),
|
| + Suggestion());
|
| + for (size_t i = 0; i < data_list_values_.size(); i++) {
|
| + (*suggestions)[i].value = data_list_values_[i];
|
| + (*suggestions)[i].label = data_list_labels_[i];
|
| + (*suggestions)[i].frontend_id = POPUP_ITEM_ID_DATALIST_ENTRY;
|
| + }
|
| }
|
|
|
| #if defined(OS_MACOSX) && !defined(OS_IOS)
|
|
|