| Index: chrome/browser/autofill/autofill_external_delegate.cc
|
| diff --git a/chrome/browser/autofill/autofill_external_delegate.cc b/chrome/browser/autofill/autofill_external_delegate.cc
|
| index 436e6577e3af5411e481768c3c3d5d284e2f532a..ada423f53d4547b6d109a4ba6c0f4c199eed1503 100644
|
| --- a/chrome/browser/autofill/autofill_external_delegate.cc
|
| +++ b/chrome/browser/autofill/autofill_external_delegate.cc
|
| @@ -30,22 +30,16 @@ AutofillExternalDelegate::AutofillExternalDelegate(
|
| tab_contents ? tab_contents->web_contents() : NULL),
|
| autofill_query_id_(0),
|
| display_warning_if_disabled_(false),
|
| - has_shown_autofill_popup_for_current_edit_(false) {
|
| + has_shown_autofill_popup_for_current_edit_(false),
|
| + popup_visible_(false) {
|
| }
|
|
|
| void AutofillExternalDelegate::SelectAutofillSuggestionAtIndex(int unique_id) {
|
| - if (unique_id == WebAutofillClient::MenuItemIDAutofillOptions ||
|
| - unique_id == WebAutofillClient::MenuItemIDClearForm ||
|
| - unique_id == WebAutofillClient::MenuItemIDSeparator ||
|
| - unique_id == WebAutofillClient::MenuItemIDWarningMessage)
|
| - return;
|
| -
|
| ClearPreviewedForm();
|
|
|
| - if (unique_id == WebAutofillClient::MenuItemIDPasswordEntry)
|
| - return;
|
| -
|
| - FillAutofillFormData(unique_id, true);
|
| + // Only preview the data if it is a profile.
|
| + if (unique_id > 0)
|
| + FillAutofillFormData(unique_id, true);
|
| }
|
|
|
| void AutofillExternalDelegate::OnQuery(int query_id,
|
| @@ -63,49 +57,25 @@ void AutofillExternalDelegate::OnQuery(int query_id,
|
|
|
| void AutofillExternalDelegate::OnSuggestionsReturned(
|
| int query_id,
|
| - const std::vector<string16>& values,
|
| - const std::vector<string16>& labels,
|
| - const std::vector<string16>& icons,
|
| - const std::vector<int>& unique_ids) {
|
| + const std::vector<string16>& autofill_values,
|
| + const std::vector<string16>& autofill_labels,
|
| + const std::vector<string16>& autofill_icons,
|
| + const std::vector<int>& autofill_unique_ids) {
|
| if (query_id != autofill_query_id_)
|
| return;
|
|
|
| - if (values.empty()) {
|
| - // No suggestions, any popup currently showing is obsolete.
|
| - HideAutofillPopup();
|
| - return;
|
| - }
|
| -
|
| - std::vector<string16> v(values);
|
| - std::vector<string16> l(labels);
|
| - std::vector<string16> i(icons);
|
| - std::vector<int> ids(unique_ids);
|
| + std::vector<string16> values(autofill_values);
|
| + std::vector<string16> labels(autofill_labels);
|
| + std::vector<string16> icons(autofill_icons);
|
| + std::vector<int> ids(autofill_unique_ids);
|
|
|
| // Add a separator to go between the values and menu items.
|
| - v.push_back(string16());
|
| - l.push_back(string16());
|
| - i.push_back(string16());
|
| + values.push_back(string16());
|
| + labels.push_back(string16());
|
| + icons.push_back(string16());
|
| ids.push_back(WebAutofillClient::MenuItemIDSeparator);
|
|
|
| - DCHECK_GT(ids.size(), 0U);
|
| - if (!autofill_query_field_.should_autocomplete) {
|
| - // If autofill is disabled and we had suggestions, show a warning instead.
|
| - v.assign(1, l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED));
|
| - l.assign(1, string16());
|
| - i.assign(1, string16());
|
| - ids.assign(1, WebAutofillClient::MenuItemIDWarningMessage);
|
| - } else if (ids[0] < 0 && ids.size() > 1) {
|
| - // If we received a warning instead of suggestions from autofill but regular
|
| - // suggestions from autocomplete, don't show the autofill warning.
|
| - v.erase(v.begin());
|
| - l.erase(l.begin());
|
| - i.erase(i.begin());
|
| - ids.erase(ids.begin());
|
| - }
|
| -
|
| - // If we were about to show a warning and we shouldn't, don't.
|
| - if (ids[0] < 0 && !display_warning_if_disabled_)
|
| - return;
|
| + ApplyAutofillWarnings(&values, &labels, &icons, &ids);
|
|
|
| // Only include "Autofill Options" special menu item if we have Autofill
|
| // items, identified by |unique_ids| having at least one valid value.
|
| @@ -117,38 +87,34 @@ void AutofillExternalDelegate::OnSuggestionsReturned(
|
| }
|
| }
|
|
|
| - // The form has been auto-filled, so give the user the chance to clear the
|
| - // form. Append the 'Clear form' menu item.
|
| - if (has_autofill_item && autofill_query_field_.is_autofilled) {
|
| - v.push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM));
|
| - l.push_back(string16());
|
| - i.push_back(string16());
|
| - ids.push_back(WebAutofillClient::MenuItemIDClearForm);
|
| - }
|
| -
|
| - if (has_autofill_item) {
|
| - // Append the 'Chrome Autofill options' menu item;
|
| - v.push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP));
|
| - l.push_back(string16());
|
| - i.push_back(string16());
|
| - ids.push_back(WebAutofillClient::MenuItemIDAutofillOptions);
|
| - }
|
| + if (has_autofill_item)
|
| + ApplyAutofillOptions(&values, &labels, &icons, &ids);
|
|
|
| // Remove the separator if it is the last element.
|
| - if (*(ids.rbegin()) == WebAutofillClient::MenuItemIDSeparator) {
|
| - v.pop_back();
|
| - l.pop_back();
|
| - i.pop_back();
|
| + if (ids.back() == WebAutofillClient::MenuItemIDSeparator) {
|
| + values.pop_back();
|
| + labels.pop_back();
|
| + icons.pop_back();
|
| ids.pop_back();
|
| }
|
|
|
| + InsertDataListValues(&values, &labels, &icons, &ids);
|
| +
|
| + if (values.empty()) {
|
| + // No suggestions, any popup currently showing is obsolete.
|
| + HideAutofillPopup();
|
| + return;
|
| + }
|
| +
|
| // Send to display.
|
| - if (!v.empty() && autofill_query_field_.is_focusable)
|
| - ApplyAutofillSuggestions(v, l, i, ids);
|
| + if (autofill_query_field_.is_focusable) {
|
| + popup_visible_ = true;
|
| + ApplyAutofillSuggestions(values, labels, icons, ids);
|
|
|
| - tab_contents_->autofill_manager()->OnDidShowAutofillSuggestions(
|
| - has_autofill_item && !has_shown_autofill_popup_for_current_edit_);
|
| - has_shown_autofill_popup_for_current_edit_ |= has_autofill_item;
|
| + tab_contents_->autofill_manager()->OnDidShowAutofillSuggestions(
|
| + has_autofill_item && !has_shown_autofill_popup_for_current_edit_);
|
| + has_shown_autofill_popup_for_current_edit_ |= has_autofill_item;
|
| + }
|
| }
|
|
|
| void AutofillExternalDelegate::OnShowPasswordSuggestions(
|
| @@ -170,6 +136,22 @@ void AutofillExternalDelegate::OnShowPasswordSuggestions(
|
| ApplyAutofillSuggestions(suggestions, empty, empty, password_ids);
|
| }
|
|
|
| +void AutofillExternalDelegate::SetCurrentDataListValues(
|
| + const std::vector<string16>& data_list_values,
|
| + const std::vector<string16>& data_list_labels,
|
| + const std::vector<string16>& data_list_icons,
|
| + const std::vector<int>& data_list_unique_ids) {
|
| + // TODO(csharp): Modify the code to allow the data list values to change
|
| + // even if the popup is visible.
|
| + // http://crbug.com/131003
|
| + if (!popup_visible_) {
|
| + data_list_values_ = data_list_values;
|
| + data_list_labels_ = data_list_labels;
|
| + data_list_icons_ = data_list_icons;
|
| + data_list_unique_ids_ = data_list_unique_ids;
|
| + }
|
| +}
|
| +
|
| void AutofillExternalDelegate::RemoveAutocompleteEntry(const string16& value) {
|
| if (tab_contents_) {
|
| tab_contents_->autocomplete_history_manager()->
|
| @@ -197,21 +179,25 @@ bool AutofillExternalDelegate::DidAcceptAutofillSuggestions(
|
| if (unique_id == WebAutofillClient::MenuItemIDWarningMessage)
|
| return false;
|
|
|
| + RenderViewHost* host =
|
| + tab_contents_->web_contents()->GetRenderViewHost();
|
| +
|
| if (unique_id == WebAutofillClient::MenuItemIDAutofillOptions) {
|
| // User selected 'Autofill Options'.
|
| autofill_manager_->OnShowAutofillDialog();
|
| } else if (unique_id == WebAutofillClient::MenuItemIDClearForm) {
|
| // User selected 'Clear form'.
|
| - RenderViewHost* host = tab_contents_->web_contents()->GetRenderViewHost();
|
| host->Send(new AutofillMsg_ClearForm(host->GetRoutingID()));
|
| } else if (unique_id == WebAutofillClient::MenuItemIDPasswordEntry &&
|
| password_autofill_manager_.DidAcceptAutofillSuggestion(
|
| autofill_query_field_, value)) {
|
| // DidAcceptAutofillSuggestion has already handled the work to fill in
|
| // the page as required.
|
| + } else if (unique_id == WebAutofillClient::MenuItemIDDataListEntry) {
|
| + host->Send(new AutofillMsg_AcceptDataListSuggestion(host->GetRoutingID(),
|
| + value));
|
| } else if (unique_id == WebAutofillClient::MenuItemIDAutocompleteEntry) {
|
| // User selected an Autocomplete, so we fill directly.
|
| - RenderViewHost* host = tab_contents_->web_contents()->GetRenderViewHost();
|
| host->Send(new AutofillMsg_SetNodeText(
|
| host->GetRoutingID(),
|
| value));
|
| @@ -230,6 +216,8 @@ void AutofillExternalDelegate::ClearPreviewedForm() {
|
| }
|
|
|
| void AutofillExternalDelegate::HideAutofillPopup() {
|
| + popup_visible_ = false;
|
| +
|
| HideAutofillPopupInternal();
|
| }
|
|
|
| @@ -264,6 +252,97 @@ void AutofillExternalDelegate::FillAutofillFormData(int unique_id,
|
| unique_id);
|
| }
|
|
|
| +void AutofillExternalDelegate::ApplyAutofillWarnings(
|
| + std::vector<string16>* autofill_values,
|
| + std::vector<string16>* autofill_labels,
|
| + std::vector<string16>* autofill_icons,
|
| + std::vector<int>* autofill_unique_ids) {
|
| + if (!autofill_query_field_.should_autocomplete) {
|
| + // If autofill is disabled and we had suggestions, show a warning instead.
|
| + autofill_values->assign(
|
| + 1, l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED));
|
| + autofill_labels->assign(1, string16());
|
| + autofill_icons->assign(1, string16());
|
| + autofill_unique_ids->assign(1, WebAutofillClient::MenuItemIDWarningMessage);
|
| + } else if (autofill_unique_ids->size() > 1 &&
|
| + (*autofill_unique_ids)[0] ==
|
| + WebAutofillClient::MenuItemIDWarningMessage) {
|
| + // If we received a warning instead of suggestions from autofill but regular
|
| + // suggestions from autocomplete, don't show the autofill warning.
|
| + autofill_values->erase(autofill_values->begin());
|
| + autofill_labels->erase(autofill_labels->begin());
|
| + autofill_icons->erase(autofill_icons->begin());
|
| + autofill_unique_ids->erase(autofill_unique_ids->begin());
|
| + }
|
| +
|
| + // If we were about to show a warning and we shouldn't, don't.
|
| + if (!autofill_unique_ids->empty() &&
|
| + (*autofill_unique_ids)[0] ==
|
| + WebAutofillClient::MenuItemIDWarningMessage &&
|
| + !display_warning_if_disabled_) {
|
| + autofill_values->clear();
|
| + autofill_labels->clear();
|
| + autofill_icons->clear();
|
| + autofill_unique_ids->clear();
|
| + }
|
| +}
|
| +
|
| +void AutofillExternalDelegate::ApplyAutofillOptions(
|
| + std::vector<string16>* autofill_values,
|
| + std::vector<string16>* autofill_labels,
|
| + std::vector<string16>* autofill_icons,
|
| + std::vector<int>* autofill_unique_ids) {
|
| + // The form has been auto-filled, so give the user the chance to clear the
|
| + // form. Append the 'Clear form' menu item.
|
| + if (autofill_query_field_.is_autofilled) {
|
| + autofill_values->push_back(
|
| + l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM));
|
| + autofill_labels->push_back(string16());
|
| + autofill_icons->push_back(string16());
|
| + autofill_unique_ids->push_back(WebAutofillClient::MenuItemIDClearForm);
|
| + }
|
| +
|
| + // Append the 'Chrome Autofill options' menu item;
|
| + autofill_values->push_back(
|
| + l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP));
|
| + autofill_labels->push_back(string16());
|
| + autofill_icons->push_back(string16());
|
| + autofill_unique_ids->push_back(WebAutofillClient::MenuItemIDAutofillOptions);
|
| +}
|
| +
|
| +void AutofillExternalDelegate::InsertDataListValues(
|
| + std::vector<string16>* autofill_values,
|
| + std::vector<string16>* autofill_labels,
|
| + std::vector<string16>* autofill_icons,
|
| + std::vector<int>* autofill_unique_ids) {
|
| + if (data_list_values_.empty())
|
| + return;
|
| +
|
| + // Insert the separator between the datalist and Autofill values (if there
|
| + // are any).
|
| + if (!autofill_values->empty()) {
|
| + autofill_values->insert(autofill_values->begin(), string16());
|
| + autofill_labels->insert(autofill_labels->begin(), string16());
|
| + autofill_icons->insert(autofill_icons->begin(), string16());
|
| + autofill_unique_ids->insert(autofill_unique_ids->begin(),
|
| + WebAutofillClient::MenuItemIDSeparator);
|
| + }
|
| +
|
| + // Insert the datalist elements.
|
| + autofill_values->insert(autofill_values->begin(),
|
| + data_list_values_.begin(),
|
| + data_list_values_.end());
|
| + autofill_labels->insert(autofill_labels->begin(),
|
| + data_list_labels_.begin(),
|
| + data_list_labels_.end());
|
| + autofill_icons->insert(autofill_icons->begin(),
|
| + data_list_icons_.begin(),
|
| + data_list_icons_.end());
|
| + autofill_unique_ids->insert(autofill_unique_ids->begin(),
|
| + data_list_unique_ids_.begin(),
|
| + data_list_unique_ids_.end());
|
| +}
|
| +
|
| // Add a "!defined(OS_YOUROS) for each platform that implements this
|
| // in an autofill_external_delegate_YOUROS.cc. Currently there are
|
| // none, so all platforms use the default.
|
|
|