| Index: chrome/renderer/autofill/autofill_agent.cc
|
| diff --git a/chrome/renderer/autofill/autofill_agent.cc b/chrome/renderer/autofill/autofill_agent.cc
|
| index ead763f87c81936172a52c07ae6d4c86070b4be0..e51eaf8144a3406c3cdc9a30f21412fe0fa1e528 100644
|
| --- a/chrome/renderer/autofill/autofill_agent.cc
|
| +++ b/chrome/renderer/autofill/autofill_agent.cc
|
| @@ -6,6 +6,8 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/message_loop.h"
|
| +#include "base/string_util.h"
|
| +#include "base/string_split.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/common/autofill_messages.h"
|
| @@ -59,9 +61,18 @@ void AppendDataListSuggestions(const WebKit::WebInputElement& element,
|
| if (options.isNull())
|
| return;
|
|
|
| + string16 prefix = element.editingValue();
|
| + if (element.isMultiple() &&
|
| + element.formControlType() == WebString::fromUTF8("email")) {
|
| + std::vector<string16> parts;
|
| + base::SplitStringDontTrim(prefix, ',', &parts);
|
| + if (parts.size() > 0)
|
| + TrimWhitespace(parts[parts.size() - 1], TRIM_LEADING, &prefix);
|
| + }
|
| for (WebOptionElement option = options.firstItem().to<WebOptionElement>();
|
| - !option.isNull(); option = options.nextItem().to<WebOptionElement>()) {
|
| - if (!StartsWith(option.value(), element.value(), false) ||
|
| + !option.isNull(); option = options.nextItem().to<WebOptionElement>()) {
|
| + if (!StartsWith(option.value(), prefix, false) ||
|
| + option.value() == prefix ||
|
| !element.isValidValue(option.value()))
|
| continue;
|
|
|
| @@ -210,11 +221,12 @@ void AutofillAgent::didAcceptAutofillSuggestion(const WebNode& node,
|
| break;
|
| case WebAutofillClient::MenuItemIDAutocompleteEntry:
|
| case WebAutofillClient::MenuItemIDPasswordEntry:
|
| - case WebAutofillClient::MenuItemIDDataListEntry:
|
| - // User selected an Autocomplete or password or datalist entry, so we
|
| - // fill directly.
|
| + // User selected an Autocomplete or password entry, so we fill directly.
|
| SetNodeText(value, &element_);
|
| break;
|
| + case WebAutofillClient::MenuItemIDDataListEntry:
|
| + AcceptDataListSuggestion(value);
|
| + break;
|
| default:
|
| // A positive item_id is a unique id for an autofill (vs. autocomplete)
|
| // suggestion.
|
| @@ -427,6 +439,34 @@ void AutofillAgent::CombineDataListEntriesAndShow(
|
| has_shown_autofill_popup_for_current_edit_ |= has_autofill_item;
|
| }
|
|
|
| +void AutofillAgent::AcceptDataListSuggestion(const string16& suggested_value) {
|
| + string16 new_value = suggested_value;
|
| + // If this element takes multiple values then replace the last part with
|
| + // the suggestion.
|
| + if (element_.isMultiple() &&
|
| + element_.formControlType() == WebString::fromUTF8("email")) {
|
| + std::vector<string16> parts;
|
| +
|
| + base::SplitStringDontTrim(element_.editingValue(), ',', &parts);
|
| + if (parts.size() == 0)
|
| + parts.push_back(string16());
|
| +
|
| + string16 last_part = parts.back();
|
| + // We want to keep just the leading whitespace.
|
| + for (size_t i = 0; i < last_part.size(); ++i) {
|
| + if (!IsWhitespace(last_part[i])) {
|
| + last_part = last_part.substr(0, i);
|
| + break;
|
| + }
|
| + }
|
| + last_part.append(suggested_value);
|
| + parts[parts.size() - 1] = last_part;
|
| +
|
| + new_value = JoinString(parts, ',');
|
| + }
|
| + SetNodeText(new_value, &element_);
|
| +}
|
| +
|
| void AutofillAgent::OnFormDataFilled(int query_id,
|
| const webkit::forms::FormData& form) {
|
| if (!render_view()->GetWebView() || query_id != autofill_query_id_)
|
| @@ -503,7 +543,7 @@ void AutofillAgent::ShowSuggestions(const WebInputElement& element,
|
|
|
| // Don't attempt to autofill with values that are too large or if filling
|
| // criteria are not met.
|
| - WebString value = element.value();
|
| + WebString value = element.editingValue();
|
| if (value.length() > kMaximumTextSizeForAutofill ||
|
| (!autofill_on_empty_values && value.isEmpty()) ||
|
| (requires_caret_at_end &&
|
| @@ -587,7 +627,7 @@ void AutofillAgent::SetNodeText(const string16& value,
|
| string16 substring = value;
|
| substring = substring.substr(0, node->maxLength());
|
|
|
| - node->setValue(substring, true);
|
| + node->setEditingValue(substring);
|
| }
|
|
|
| } // namespace autofill
|
|
|