OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/autofill/content/renderer/autofill_agent.h" | 5 #include "components/autofill/content/renderer/autofill_agent.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
285 Send(new AutofillHostMsg_RequestAutocomplete(routing_id(), form_data, url)); | 285 Send(new AutofillHostMsg_RequestAutocomplete(routing_id(), form_data, url)); |
286 } | 286 } |
287 | 287 |
288 void AutofillAgent::setIgnoreTextChanges(bool ignore) { | 288 void AutofillAgent::setIgnoreTextChanges(bool ignore) { |
289 ignore_text_changes_ = ignore; | 289 ignore_text_changes_ = ignore; |
290 } | 290 } |
291 | 291 |
292 void AutofillAgent::InputElementClicked(const WebInputElement& element, | 292 void AutofillAgent::InputElementClicked(const WebInputElement& element, |
293 bool was_focused, | 293 bool was_focused, |
294 bool is_focused) { | 294 bool is_focused) { |
295 if (was_focused) | 295 bool show_full_suggestion_list = element.isAutofilled() || was_focused; |
Garrett Casto
2014/03/06 01:23:46
I think that this was fine before hand with just e
jww
2014/03/07 02:06:06
I changed this because the experience, I felt, was
| |
296 ShowSuggestions(element, true, false, true, false); | 296 bool show_password_suggestions_only = !was_focused; |
297 ShowSuggestions(element, | |
298 true, | |
299 false, | |
300 true, | |
301 false, | |
302 show_full_suggestion_list, | |
303 show_password_suggestions_only); | |
297 } | 304 } |
298 | 305 |
299 void AutofillAgent::InputElementLostFocus() { | 306 void AutofillAgent::InputElementLostFocus() { |
300 HidePopup(); | 307 HidePopup(); |
301 } | 308 } |
302 | 309 |
303 void AutofillAgent::textFieldDidEndEditing(const WebInputElement& element) { | 310 void AutofillAgent::textFieldDidEndEditing(const WebInputElement& element) { |
304 password_autofill_agent_->TextFieldDidEndEditing(element); | 311 password_autofill_agent_->TextFieldDidEndEditing(element); |
305 has_shown_autofill_popup_for_current_edit_ = false; | 312 has_shown_autofill_popup_for_current_edit_ = false; |
306 Send(new AutofillHostMsg_DidEndTextFieldEditing(routing_id())); | 313 Send(new AutofillHostMsg_DidEndTextFieldEditing(routing_id())); |
(...skipping 28 matching lines...) Expand all Loading... | |
335 if (password_generation_agent_ && | 342 if (password_generation_agent_ && |
336 password_generation_agent_->TextDidChangeInTextField(element)) { | 343 password_generation_agent_->TextDidChangeInTextField(element)) { |
337 return; | 344 return; |
338 } | 345 } |
339 | 346 |
340 if (password_autofill_agent_->TextDidChangeInTextField(element)) { | 347 if (password_autofill_agent_->TextDidChangeInTextField(element)) { |
341 element_ = element; | 348 element_ = element; |
342 return; | 349 return; |
343 } | 350 } |
344 | 351 |
345 ShowSuggestions(element, false, true, false, false); | 352 ShowSuggestions(element, false, true, false, false, false, false); |
346 | 353 |
347 FormData form; | 354 FormData form; |
348 FormFieldData field; | 355 FormFieldData field; |
349 if (FindFormAndFieldForInputElement(element, &form, &field, REQUIRE_NONE)) { | 356 if (FindFormAndFieldForInputElement(element, &form, &field, REQUIRE_NONE)) { |
350 Send(new AutofillHostMsg_TextFieldDidChange(routing_id(), form, field, | 357 Send(new AutofillHostMsg_TextFieldDidChange(routing_id(), form, field, |
351 base::TimeTicks::Now())); | 358 base::TimeTicks::Now())); |
352 } | 359 } |
353 } | 360 } |
354 | 361 |
355 void AutofillAgent::textFieldDidReceiveKeyDown(const WebInputElement& element, | 362 void AutofillAgent::textFieldDidReceiveKeyDown(const WebInputElement& element, |
356 const WebKeyboardEvent& event) { | 363 const WebKeyboardEvent& event) { |
357 if (password_autofill_agent_->TextFieldHandlingKeyDown(element, event)) { | 364 if (password_autofill_agent_->TextFieldHandlingKeyDown(element, event)) { |
358 element_ = element; | 365 element_ = element; |
359 return; | 366 return; |
360 } | 367 } |
361 | 368 |
362 if (event.windowsKeyCode == ui::VKEY_DOWN || | 369 if (event.windowsKeyCode == ui::VKEY_DOWN || |
363 event.windowsKeyCode == ui::VKEY_UP) | 370 event.windowsKeyCode == ui::VKEY_UP) |
364 ShowSuggestions(element, true, true, true, false); | 371 ShowSuggestions(element, true, true, true, false, false, false); |
365 } | 372 } |
366 | 373 |
367 void AutofillAgent::openTextDataListChooser(const WebInputElement& element) { | 374 void AutofillAgent::openTextDataListChooser(const WebInputElement& element) { |
368 ShowSuggestions(element, true, false, false, true); | 375 ShowSuggestions(element, true, false, false, true, false, false); |
369 } | 376 } |
370 | 377 |
371 void AutofillAgent::AcceptDataListSuggestion( | 378 void AutofillAgent::AcceptDataListSuggestion( |
372 const base::string16& suggested_value) { | 379 const base::string16& suggested_value) { |
373 base::string16 new_value = suggested_value; | 380 base::string16 new_value = suggested_value; |
374 // If this element takes multiple values then replace the last part with | 381 // If this element takes multiple values then replace the last part with |
375 // the suggestion. | 382 // the suggestion. |
376 if (element_.isMultiple() && | 383 if (element_.isMultiple() && |
377 element_.formControlType() == WebString::fromUTF8("email")) { | 384 element_.formControlType() == WebString::fromUTF8("email")) { |
378 std::vector<base::string16> parts; | 385 std::vector<base::string16> parts; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
489 in_flight_request_form_.reset(); | 496 in_flight_request_form_.reset(); |
490 } | 497 } |
491 | 498 |
492 void AutofillAgent::OnPageShown() { | 499 void AutofillAgent::OnPageShown() { |
493 } | 500 } |
494 | 501 |
495 void AutofillAgent::ShowSuggestions(const WebInputElement& element, | 502 void AutofillAgent::ShowSuggestions(const WebInputElement& element, |
496 bool autofill_on_empty_values, | 503 bool autofill_on_empty_values, |
497 bool requires_caret_at_end, | 504 bool requires_caret_at_end, |
498 bool display_warning_if_disabled, | 505 bool display_warning_if_disabled, |
499 bool datalist_only) { | 506 bool datalist_only, |
507 bool show_full_suggestion_list, | |
508 bool show_password_suggestions_only) { | |
500 if (!element.isEnabled() || element.isReadOnly() || !element.isTextField() || | 509 if (!element.isEnabled() || element.isReadOnly() || !element.isTextField() || |
501 element.isPasswordField()) | 510 element.isPasswordField()) |
502 return; | 511 return; |
503 if (!datalist_only && !element.suggestedValue().isEmpty()) | 512 if (!datalist_only && !element.suggestedValue().isEmpty()) |
504 return; | 513 return; |
505 | 514 |
506 // Don't attempt to autofill with values that are too large or if filling | 515 // Don't attempt to autofill with values that are too large or if filling |
507 // criteria are not met. | 516 // criteria are not met. |
508 WebString value = element.editingValue(); | 517 WebString value = element.editingValue(); |
509 if (!datalist_only && | 518 if (!datalist_only && |
510 (value.length() > kMaxDataLength || | 519 (value.length() > kMaxDataLength || |
511 (!autofill_on_empty_values && value.isEmpty()) || | 520 (!autofill_on_empty_values && value.isEmpty()) || |
512 (requires_caret_at_end && | 521 (requires_caret_at_end && |
513 (element.selectionStart() != element.selectionEnd() || | 522 (element.selectionStart() != element.selectionEnd() || |
514 element.selectionEnd() != static_cast<int>(value.length()))))) { | 523 element.selectionEnd() != static_cast<int>(value.length()))))) { |
515 // Any popup currently showing is obsolete. | 524 // Any popup currently showing is obsolete. |
516 HidePopup(); | 525 HidePopup(); |
517 return; | 526 return; |
518 } | 527 } |
519 | 528 |
520 element_ = element; | 529 element_ = element; |
521 if (password_autofill_agent_->ShowSuggestions(element)) { | 530 if (password_autofill_agent_->ShowSuggestions(element, |
531 show_full_suggestion_list) || | |
532 show_password_suggestions_only) { | |
522 is_popup_possibly_visible_ = true; | 533 is_popup_possibly_visible_ = true; |
523 return; | 534 return; |
524 } | 535 } |
525 | 536 |
526 // If autocomplete is disabled at the field level, ensure that the native | 537 // If autocomplete is disabled at the field level, ensure that the native |
527 // UI won't try to show a warning, since that may conflict with a custom | 538 // UI won't try to show a warning, since that may conflict with a custom |
528 // popup. Note that we cannot use the WebKit method element.autoComplete() | 539 // popup. Note that we cannot use the WebKit method element.autoComplete() |
529 // as it does not allow us to distinguish the case where autocomplete is | 540 // as it does not allow us to distinguish the case where autocomplete is |
530 // disabled for *both* the element and for the form. | 541 // disabled for *both* the element and for the form. |
531 const base::string16 autocomplete_attribute = | 542 const base::string16 autocomplete_attribute = |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 // Only monitors dynamic forms created in the top frame. Dynamic forms | 648 // Only monitors dynamic forms created in the top frame. Dynamic forms |
638 // inserted in iframes are not captured yet. | 649 // inserted in iframes are not captured yet. |
639 if (!frame->parent()) { | 650 if (!frame->parent()) { |
640 password_autofill_agent_->OnDynamicFormsSeen(frame); | 651 password_autofill_agent_->OnDynamicFormsSeen(frame); |
641 return; | 652 return; |
642 } | 653 } |
643 } | 654 } |
644 } | 655 } |
645 | 656 |
646 } // namespace autofill | 657 } // namespace autofill |
OLD | NEW |