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/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/i18n/case_conversion.h" | 10 #include "base/i18n/case_conversion.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 if ((*strings)[i].length() > kMaxDataLength) | 123 if ((*strings)[i].length() > kMaxDataLength) |
124 (*strings)[i].resize(kMaxDataLength); | 124 (*strings)[i].resize(kMaxDataLength); |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 } // namespace | 128 } // namespace |
129 | 129 |
130 AutofillAgent::ShowSuggestionsOptions::ShowSuggestionsOptions() | 130 AutofillAgent::ShowSuggestionsOptions::ShowSuggestionsOptions() |
131 : autofill_on_empty_values(false), | 131 : autofill_on_empty_values(false), |
132 requires_caret_at_end(false), | 132 requires_caret_at_end(false), |
133 datalist_only(false), | |
134 show_full_suggestion_list(false), | 133 show_full_suggestion_list(false), |
135 show_password_suggestions_only(false) { | 134 show_password_suggestions_only(false) { |
136 } | 135 } |
137 | 136 |
138 AutofillAgent::AutofillAgent(content::RenderFrame* render_frame, | 137 AutofillAgent::AutofillAgent(content::RenderFrame* render_frame, |
139 PasswordAutofillAgent* password_autofill_agent, | 138 PasswordAutofillAgent* password_autofill_agent, |
140 PasswordGenerationAgent* password_generation_agent) | 139 PasswordGenerationAgent* password_generation_agent) |
141 : content::RenderFrameObserver(render_frame), | 140 : content::RenderFrameObserver(render_frame), |
142 form_cache_(*render_frame->GetWebFrame()), | 141 form_cache_(*render_frame->GetWebFrame()), |
143 password_autofill_agent_(password_autofill_agent), | 142 password_autofill_agent_(password_autofill_agent), |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 ShowSuggestionsOptions options; | 457 ShowSuggestionsOptions options; |
459 options.autofill_on_empty_values = true; | 458 options.autofill_on_empty_values = true; |
460 options.requires_caret_at_end = true; | 459 options.requires_caret_at_end = true; |
461 ShowSuggestions(element, options); | 460 ShowSuggestions(element, options); |
462 } | 461 } |
463 } | 462 } |
464 | 463 |
465 void AutofillAgent::openTextDataListChooser(const WebInputElement& element) { | 464 void AutofillAgent::openTextDataListChooser(const WebInputElement& element) { |
466 ShowSuggestionsOptions options; | 465 ShowSuggestionsOptions options; |
467 options.autofill_on_empty_values = true; | 466 options.autofill_on_empty_values = true; |
468 options.datalist_only = true; | |
469 ShowSuggestions(element, options); | 467 ShowSuggestions(element, options); |
470 } | 468 } |
471 | 469 |
472 void AutofillAgent::dataListOptionsChanged(const WebInputElement& element) { | 470 void AutofillAgent::dataListOptionsChanged(const WebInputElement& element) { |
473 if (!is_popup_possibly_visible_ || !element.focused()) | 471 if (!is_popup_possibly_visible_ || !element.focused()) |
474 return; | 472 return; |
475 | 473 |
476 TextFieldDidChangeImpl(element); | 474 TextFieldDidChangeImpl(element); |
477 } | 475 } |
478 | 476 |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 console_message); | 643 console_message); |
646 } | 644 } |
647 | 645 |
648 in_flight_request_form_.reset(); | 646 in_flight_request_form_.reset(); |
649 } | 647 } |
650 | 648 |
651 void AutofillAgent::ShowSuggestions(const WebFormControlElement& element, | 649 void AutofillAgent::ShowSuggestions(const WebFormControlElement& element, |
652 const ShowSuggestionsOptions& options) { | 650 const ShowSuggestionsOptions& options) { |
653 if (!element.isEnabled() || element.isReadOnly()) | 651 if (!element.isEnabled() || element.isReadOnly()) |
654 return; | 652 return; |
655 if (!options.datalist_only && !element.suggestedValue().isEmpty()) | 653 if (!element.suggestedValue().isEmpty()) |
656 return; | 654 return; |
657 | 655 |
658 const WebInputElement* input_element = toWebInputElement(&element); | 656 const WebInputElement* input_element = toWebInputElement(&element); |
659 if (input_element) { | 657 if (input_element) { |
660 if (!input_element->isTextField()) | 658 if (!input_element->isTextField()) |
661 return; | 659 return; |
662 if (!options.datalist_only && !input_element->suggestedValue().isEmpty()) | 660 if (!input_element->suggestedValue().isEmpty()) |
663 return; | 661 return; |
664 } else { | 662 } else { |
665 DCHECK(form_util::IsTextAreaElement(element)); | 663 DCHECK(form_util::IsTextAreaElement(element)); |
666 if (!element.toConst<WebFormControlElement>().suggestedValue().isEmpty()) | 664 if (!element.toConst<WebFormControlElement>().suggestedValue().isEmpty()) |
667 return; | 665 return; |
668 } | 666 } |
669 | 667 |
670 // Don't attempt to autofill with values that are too large or if filling | 668 // Don't attempt to autofill with values that are too large or if filling |
671 // criteria are not met. | 669 // criteria are not met. |
672 WebString value = element.editingValue(); | 670 WebString value = element.editingValue(); |
673 if (!options.datalist_only && | 671 if (value.length() > kMaxDataLength || |
674 (value.length() > kMaxDataLength || | 672 (!options.autofill_on_empty_values && value.isEmpty()) || |
675 (!options.autofill_on_empty_values && value.isEmpty()) || | 673 (options.requires_caret_at_end && |
676 (options.requires_caret_at_end && | 674 (element.selectionStart() != element.selectionEnd() || |
677 (element.selectionStart() != element.selectionEnd() || | 675 element.selectionEnd() != static_cast<int>(value.length())))) { |
678 element.selectionEnd() != static_cast<int>(value.length()))))) { | |
679 // Any popup currently showing is obsolete. | 676 // Any popup currently showing is obsolete. |
680 HidePopup(); | 677 HidePopup(); |
681 return; | 678 return; |
682 } | 679 } |
683 | 680 |
684 element_ = element; | 681 element_ = element; |
685 if (form_util::IsAutofillableInputElement(input_element) && | 682 if (form_util::IsAutofillableInputElement(input_element) && |
686 password_autofill_agent_->ShowSuggestions( | 683 password_autofill_agent_->ShowSuggestions( |
687 *input_element, options.show_full_suggestion_list, | 684 *input_element, options.show_full_suggestion_list, |
688 is_generation_popup_possibly_visible_)) { | 685 is_generation_popup_possibly_visible_)) { |
689 is_popup_possibly_visible_ = true; | 686 is_popup_possibly_visible_ = true; |
690 return; | 687 return; |
691 } | 688 } |
692 | 689 |
693 if (is_generation_popup_possibly_visible_) | 690 if (is_generation_popup_possibly_visible_) |
694 return; | 691 return; |
695 | 692 |
696 if (options.show_password_suggestions_only) | 693 if (options.show_password_suggestions_only) |
697 return; | 694 return; |
698 | 695 |
699 // Password field elements should only have suggestions shown by the password | 696 // Password field elements should only have suggestions shown by the password |
700 // autofill agent. | 697 // autofill agent. |
701 if (input_element && input_element->isPasswordField()) | 698 if (input_element && input_element->isPasswordField()) |
702 return; | 699 return; |
703 | 700 |
704 QueryAutofillSuggestions(element, options.datalist_only); | 701 QueryAutofillSuggestions(element); |
705 } | 702 } |
706 | 703 |
707 void AutofillAgent::QueryAutofillSuggestions( | 704 void AutofillAgent::QueryAutofillSuggestions( |
708 const WebFormControlElement& element, | 705 const WebFormControlElement& element) { |
709 bool datalist_only) { | |
710 if (!element.document().frame()) | 706 if (!element.document().frame()) |
711 return; | 707 return; |
712 | 708 |
713 DCHECK(toWebInputElement(&element) || form_util::IsTextAreaElement(element)); | 709 DCHECK(toWebInputElement(&element) || form_util::IsTextAreaElement(element)); |
714 | 710 |
715 static int query_counter = 0; | 711 static int query_counter = 0; |
716 autofill_query_id_ = query_counter++; | 712 autofill_query_id_ = query_counter++; |
717 | 713 |
718 FormData form; | 714 FormData form; |
719 FormFieldData field; | 715 FormFieldData field; |
720 if (!form_util::FindFormAndFieldForFormControlElement(element, &form, | 716 if (!form_util::FindFormAndFieldForFormControlElement(element, &form, |
721 &field)) { | 717 &field)) { |
722 // If we didn't find the cached form, at least let autocomplete have a shot | 718 // If we didn't find the cached form, at least let autocomplete have a shot |
723 // at providing suggestions. | 719 // at providing suggestions. |
724 WebFormControlElementToFormField(element, form_util::EXTRACT_VALUE, &field); | 720 WebFormControlElementToFormField(element, form_util::EXTRACT_VALUE, &field); |
725 } | 721 } |
726 if (datalist_only) | |
727 field.should_autocomplete = false; | |
728 | 722 |
729 gfx::RectF bounding_box_scaled = form_util::GetScaledBoundingBox( | 723 gfx::RectF bounding_box_scaled = form_util::GetScaledBoundingBox( |
730 render_frame()->GetRenderView()->GetWebView()->pageScaleFactor(), | 724 render_frame()->GetRenderView()->GetWebView()->pageScaleFactor(), |
731 &element_); | 725 &element_); |
732 | 726 |
733 std::vector<base::string16> data_list_values; | 727 std::vector<base::string16> data_list_values; |
734 std::vector<base::string16> data_list_labels; | 728 std::vector<base::string16> data_list_labels; |
735 const WebInputElement* input_element = toWebInputElement(&element); | 729 const WebInputElement* input_element = toWebInputElement(&element); |
736 if (input_element) { | 730 if (input_element) { |
737 // Find the datalist values and send them to the browser process. | 731 // Find the datalist values and send them to the browser process. |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 | 821 |
828 void AutofillAgent::LegacyAutofillAgent::OnDestruct() { | 822 void AutofillAgent::LegacyAutofillAgent::OnDestruct() { |
829 // No-op. Don't delete |this|. | 823 // No-op. Don't delete |this|. |
830 } | 824 } |
831 | 825 |
832 void AutofillAgent::LegacyAutofillAgent::FocusChangeComplete() { | 826 void AutofillAgent::LegacyAutofillAgent::FocusChangeComplete() { |
833 agent_->FocusChangeComplete(); | 827 agent_->FocusChangeComplete(); |
834 } | 828 } |
835 | 829 |
836 } // namespace autofill | 830 } // namespace autofill |
OLD | NEW |