| Index: components/autofill/content/renderer/autofill_agent.cc
|
| diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
|
| index 6efe69df0e4b526dc435421536787edbc9bc2a20..1b4daba736456c7f7e02d0cd7a6f5b32c068a1da 100644
|
| --- a/components/autofill/content/renderer/autofill_agent.cc
|
| +++ b/components/autofill/content/renderer/autofill_agent.cc
|
| @@ -119,6 +119,15 @@ void TrimStringVectorForIPC(std::vector<base::string16>* strings) {
|
|
|
| } // namespace
|
|
|
| +AutofillAgent::ShowSuggestionsOptions::ShowSuggestionsOptions()
|
| + : autofill_on_empty_values(false),
|
| + requires_caret_at_end(false),
|
| + display_warning_if_disabled(false),
|
| + datalist_only(false),
|
| + show_full_suggestion_list(false),
|
| + show_password_suggestions_only(false) {
|
| +}
|
| +
|
| AutofillAgent::AutofillAgent(content::RenderView* render_view,
|
| PasswordAutofillAgent* password_autofill_agent,
|
| PasswordGenerationAgent* password_generation_agent)
|
| @@ -264,7 +273,7 @@ void AutofillAgent::didRequestAutocomplete(
|
| render_view()->GetSSLStatusOfFrame(form.document().frame());
|
| bool is_safe = url.SchemeIs(url::kHttpsScheme) &&
|
| !net::IsCertStatusError(ssl_status.cert_status);
|
| - bool allow_unsafe = CommandLine::ForCurrentProcess()->HasSwitch(
|
| + bool allow_unsafe = base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| ::switches::kReduceSecurityForTesting);
|
|
|
| FormData form_data;
|
| @@ -316,24 +325,26 @@ void AutofillAgent::FormControlElementClicked(
|
| if (!input_element && !IsTextAreaElement(element))
|
| return;
|
|
|
| - bool show_full_suggestion_list = element.isAutofilled() || was_focused;
|
| - bool show_password_suggestions_only = !was_focused;
|
| + ShowSuggestionsOptions options;
|
| + options.autofill_on_empty_values = true;
|
| + options.display_warning_if_disabled = true;
|
| + options.show_full_suggestion_list = element.isAutofilled();
|
|
|
| - // TODO(gcasto): Remove after crbug.com/430318 has been fixed.
|
| - bool show_suggestions = true;
|
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableSingleClickAutofill)) {
|
| + // Show full suggestions when clicking on an already-focused form field. On
|
| + // the initial click (not focused yet), only show password suggestions.
|
| #if defined(OS_ANDROID)
|
| - show_suggestions = was_focused;
|
| + // TODO(gcasto): Remove after crbug.com/430318 has been fixed.
|
| + if (!was_focused)
|
| + return;
|
| #endif
|
|
|
| - if (show_suggestions) {
|
| - ShowSuggestions(element,
|
| - true,
|
| - false,
|
| - true,
|
| - false,
|
| - show_full_suggestion_list,
|
| - show_password_suggestions_only);
|
| + options.show_full_suggestion_list =
|
| + options.show_full_suggestion_list || was_focused;
|
| + options.show_password_suggestions_only = !was_focused;
|
| }
|
| + ShowSuggestions(element, options);
|
| }
|
|
|
| void AutofillAgent::textFieldDidEndEditing(const WebInputElement& element) {
|
| @@ -385,7 +396,9 @@ void AutofillAgent::TextFieldDidChangeImpl(
|
| }
|
| }
|
|
|
| - ShowSuggestions(element, false, true, false, false, false, false);
|
| + ShowSuggestionsOptions options;
|
| + options.requires_caret_at_end = true;
|
| + ShowSuggestions(element, options);
|
|
|
| FormData form;
|
| FormFieldData field;
|
| @@ -406,12 +419,20 @@ void AutofillAgent::textFieldDidReceiveKeyDown(const WebInputElement& element,
|
| }
|
|
|
| if (event.windowsKeyCode == ui::VKEY_DOWN ||
|
| - event.windowsKeyCode == ui::VKEY_UP)
|
| - ShowSuggestions(element, true, true, true, false, false, false);
|
| + event.windowsKeyCode == ui::VKEY_UP) {
|
| + ShowSuggestionsOptions options;
|
| + options.autofill_on_empty_values = true;
|
| + options.requires_caret_at_end = true;
|
| + options.display_warning_if_disabled = true;
|
| + ShowSuggestions(element, options);
|
| + }
|
| }
|
|
|
| void AutofillAgent::openTextDataListChooser(const WebInputElement& element) {
|
| - ShowSuggestions(element, true, false, false, true, false, false);
|
| + ShowSuggestionsOptions options;
|
| + options.autofill_on_empty_values = true;
|
| + options.datalist_only = true;
|
| + ShowSuggestions(element, options);
|
| }
|
|
|
| void AutofillAgent::firstUserGestureObserved() {
|
| @@ -562,22 +583,17 @@ void AutofillAgent::OnRequestAutocompleteResult(
|
| }
|
|
|
| void AutofillAgent::ShowSuggestions(const WebFormControlElement& element,
|
| - bool autofill_on_empty_values,
|
| - bool requires_caret_at_end,
|
| - bool display_warning_if_disabled,
|
| - bool datalist_only,
|
| - bool show_full_suggestion_list,
|
| - bool show_password_suggestions_only) {
|
| + const ShowSuggestionsOptions& options) {
|
| if (!element.isEnabled() || element.isReadOnly())
|
| return;
|
| - if (!datalist_only && !element.suggestedValue().isEmpty())
|
| + if (!options.datalist_only && !element.suggestedValue().isEmpty())
|
| return;
|
|
|
| const WebInputElement* input_element = toWebInputElement(&element);
|
| if (input_element) {
|
| if (!input_element->isTextField() || input_element->isPasswordField())
|
| return;
|
| - if (!datalist_only && !input_element->suggestedValue().isEmpty())
|
| + if (!options.datalist_only && !input_element->suggestedValue().isEmpty())
|
| return;
|
| } else {
|
| DCHECK(IsTextAreaElement(element));
|
| @@ -588,10 +604,10 @@ void AutofillAgent::ShowSuggestions(const WebFormControlElement& element,
|
| // Don't attempt to autofill with values that are too large or if filling
|
| // criteria are not met.
|
| WebString value = element.editingValue();
|
| - if (!datalist_only &&
|
| + if (!options.datalist_only &&
|
| (value.length() > kMaxDataLength ||
|
| - (!autofill_on_empty_values && value.isEmpty()) ||
|
| - (requires_caret_at_end &&
|
| + (!options.autofill_on_empty_values && value.isEmpty()) ||
|
| + (options.requires_caret_at_end &&
|
| (element.selectionStart() != element.selectionEnd() ||
|
| element.selectionEnd() != static_cast<int>(value.length()))))) {
|
| // Any popup currently showing is obsolete.
|
| @@ -601,9 +617,9 @@ void AutofillAgent::ShowSuggestions(const WebFormControlElement& element,
|
|
|
| element_ = element;
|
| if (IsAutofillableInputElement(input_element) &&
|
| - (password_autofill_agent_->ShowSuggestions(*input_element,
|
| - show_full_suggestion_list) ||
|
| - show_password_suggestions_only)) {
|
| + (password_autofill_agent_->ShowSuggestions(
|
| + *input_element, options.show_full_suggestion_list) ||
|
| + options.show_password_suggestions_only)) {
|
| is_popup_possibly_visible_ = true;
|
| return;
|
| }
|
| @@ -613,14 +629,15 @@ void AutofillAgent::ShowSuggestions(const WebFormControlElement& element,
|
| // popup. Note that we cannot use the WebKit method element.autoComplete()
|
| // as it does not allow us to distinguish the case where autocomplete is
|
| // disabled for *both* the element and for the form.
|
| - const base::string16 autocomplete_attribute =
|
| - element.getAttribute("autocomplete");
|
| - if (LowerCaseEqualsASCII(autocomplete_attribute, "off"))
|
| - display_warning_if_disabled = false;
|
| -
|
| - QueryAutofillSuggestions(element,
|
| - display_warning_if_disabled,
|
| - datalist_only);
|
| + bool display_warning = options.display_warning_if_disabled;
|
| + if (display_warning) {
|
| + const base::string16 autocomplete_attribute =
|
| + element.getAttribute("autocomplete");
|
| + if (LowerCaseEqualsASCII(autocomplete_attribute, "off"))
|
| + display_warning = false;
|
| + }
|
| +
|
| + QueryAutofillSuggestions(element, display_warning, options.datalist_only);
|
| }
|
|
|
| void AutofillAgent::QueryAutofillSuggestions(
|
|
|