Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: components/autofill/content/renderer/password_autofill_agent.cc

Issue 2902113004: Autofill username when the user interacts with the password field. (Closed)
Patch Set: Address comments from kolos@. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/password_autofill_agent.h" 5 #include "components/autofill/content/renderer/password_autofill_agent.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 return username1 == username2; 274 return username1 == username2;
275 return FieldIsSuggestionSubstringStartingOnTokenBoundary(username1, username2, 275 return FieldIsSuggestionSubstringStartingOnTokenBoundary(username1, username2,
276 true); 276 true);
277 } 277 }
278 278
279 // Returns |true| if the given element is editable. Otherwise, returns |false|. 279 // Returns |true| if the given element is editable. Otherwise, returns |false|.
280 bool IsElementAutocompletable(const blink::WebInputElement& element) { 280 bool IsElementAutocompletable(const blink::WebInputElement& element) {
281 return IsElementEditable(element); 281 return IsElementEditable(element);
282 } 282 }
283 283
284 // Returns whether the |username_element| is allowed to be autofilled.
285 //
286 // Note that if the user interacts with the |password_field| and the
287 // |username_element| is user-defined (i.e., non-empty and non-autofilled), then
288 // this function returns false. This is a precaution, to not override the field
289 // if it has been classified as username by accident.
290 bool IsUsernameAmendable(const blink::WebInputElement& username_element,
291 bool is_password_field_selected) {
292 return !username_element.IsNull() &&
293 IsElementAutocompletable(username_element) &&
294 (!is_password_field_selected || username_element.IsAutofilled() ||
295 username_element.Value().IsEmpty());
296 }
297
284 // Return true if either password_value or new_password_value is not empty and 298 // Return true if either password_value or new_password_value is not empty and
285 // not default. 299 // not default.
286 bool FormContainsNonDefaultPasswordValue(const PasswordForm& password_form) { 300 bool FormContainsNonDefaultPasswordValue(const PasswordForm& password_form) {
287 return (!password_form.password_value.empty() && 301 return (!password_form.password_value.empty() &&
288 !password_form.password_value_is_default) || 302 !password_form.password_value_is_default) ||
289 (!password_form.new_password_value.empty() && 303 (!password_form.new_password_value.empty() &&
290 !password_form.new_password_value_is_default); 304 !password_form.new_password_value_is_default);
291 } 305 }
292 306
293 // Log a message including the name, method and action of |form|. 307 // Log a message including the name, method and action of |form|.
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 if (!FindPasswordInfoForElement(*element, &username_element, 780 if (!FindPasswordInfoForElement(*element, &username_element,
767 &password_element, &password_info) || 781 &password_element, &password_info) ||
768 !IsElementAutocompletable(password_element)) { 782 !IsElementAutocompletable(password_element)) {
769 return false; 783 return false;
770 } 784 }
771 785
772 password_info->password_was_edited_last = false; 786 password_info->password_was_edited_last = false;
773 if (element->IsPasswordField()) { 787 if (element->IsPasswordField()) {
774 password_info->password_field_suggestion_was_accepted = true; 788 password_info->password_field_suggestion_was_accepted = true;
775 password_info->password_field = password_element; 789 password_info->password_field = password_element;
776 } else if (!username_element.IsNull() && 790 }
777 IsElementAutocompletable(username_element)) { 791
792 if (IsUsernameAmendable(username_element, element->IsPasswordField())) {
778 username_element.SetAutofillValue(blink::WebString::FromUTF16(username)); 793 username_element.SetAutofillValue(blink::WebString::FromUTF16(username));
779 username_element.SetAutofilled(true); 794 username_element.SetAutofilled(true);
780 UpdateFieldValueAndPropertiesMaskMap(username_element, &username, 795 UpdateFieldValueAndPropertiesMaskMap(username_element, &username,
781 FieldPropertiesFlags::AUTOFILLED, 796 FieldPropertiesFlags::AUTOFILLED,
782 &field_value_and_properties_map_); 797 &field_value_and_properties_map_);
783 } 798 }
784 799
785 password_element.SetAutofillValue(blink::WebString::FromUTF16(password)); 800 password_element.SetAutofillValue(blink::WebString::FromUTF16(password));
786 password_element.SetAutofilled(true); 801 password_element.SetAutofilled(true);
787 UpdateFieldValueAndPropertiesMaskMap(password_element, &password, 802 UpdateFieldValueAndPropertiesMaskMap(password_element, &password,
(...skipping 19 matching lines...) Expand all
807 blink::WebInputElement username_element; 822 blink::WebInputElement username_element;
808 blink::WebInputElement password_element; 823 blink::WebInputElement password_element;
809 PasswordInfo* password_info; 824 PasswordInfo* password_info;
810 825
811 if (!FindPasswordInfoForElement(*element, &username_element, 826 if (!FindPasswordInfoForElement(*element, &username_element,
812 &password_element, &password_info) || 827 &password_element, &password_info) ||
813 !IsElementAutocompletable(password_element)) { 828 !IsElementAutocompletable(password_element)) {
814 return false; 829 return false;
815 } 830 }
816 831
817 if (!element->IsPasswordField() && !username_element.IsNull() && 832 if (IsUsernameAmendable(username_element, element->IsPasswordField())) {
818 IsElementAutocompletable(username_element)) {
819 if (username_query_prefix_.empty()) 833 if (username_query_prefix_.empty())
820 username_query_prefix_ = username_element.Value().Utf16(); 834 username_query_prefix_ = username_element.Value().Utf16();
821 835
822 was_username_autofilled_ = username_element.IsAutofilled(); 836 was_username_autofilled_ = username_element.IsAutofilled();
823 username_element.SetSuggestedValue(username); 837 username_element.SetSuggestedValue(username);
824 username_element.SetAutofilled(true); 838 username_element.SetAutofilled(true);
825 form_util::PreviewSuggestion(username_element.SuggestedValue().Utf16(), 839 form_util::PreviewSuggestion(username_element.SuggestedValue().Utf16(),
826 username_query_prefix_, &username_element); 840 username_query_prefix_, &username_element);
827 } 841 }
828 was_password_autofilled_ = password_element.IsAutofilled(); 842 was_password_autofilled_ = password_element.IsAutofilled();
829 password_element.SetSuggestedValue(password); 843 password_element.SetSuggestedValue(password);
830 password_element.SetAutofilled(true); 844 password_element.SetAutofilled(true);
831 845
832 return true; 846 return true;
833 } 847 }
834 848
835 bool PasswordAutofillAgent::DidClearAutofillSelection( 849 bool PasswordAutofillAgent::DidClearAutofillSelection(
836 const blink::WebFormControlElement& control_element) { 850 const blink::WebFormControlElement& control_element) {
837 const blink::WebInputElement* element = ToWebInputElement(&control_element); 851 const blink::WebInputElement* element = ToWebInputElement(&control_element);
838 if (!element) 852 if (!element)
839 return false; 853 return false;
840 854
841 blink::WebInputElement username_element; 855 blink::WebInputElement username_element;
842 blink::WebInputElement password_element; 856 blink::WebInputElement password_element;
843 PasswordInfo* password_info; 857 PasswordInfo* password_info;
844 858
845 if (!FindPasswordInfoForElement(*element, &username_element, 859 if (!FindPasswordInfoForElement(*element, &username_element,
846 &password_element, &password_info)) 860 &password_element, &password_info)) {
847 return false; 861 return false;
862 }
848 863
849 ClearPreview(&username_element, &password_element); 864 ClearPreview(&username_element, &password_element);
850 return true; 865 return true;
851 } 866 }
852 867
853 bool PasswordAutofillAgent::FindPasswordInfoForElement( 868 bool PasswordAutofillAgent::FindPasswordInfoForElement(
854 const blink::WebInputElement& element, 869 const blink::WebInputElement& element,
855 blink::WebInputElement* username_element, 870 blink::WebInputElement* username_element,
856 blink::WebInputElement* password_element, 871 blink::WebInputElement* password_element,
857 PasswordInfo** password_info) { 872 PasswordInfo** password_info) {
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
1717 PasswordAutofillAgent::GetPasswordManagerDriver() { 1732 PasswordAutofillAgent::GetPasswordManagerDriver() {
1718 if (!password_manager_driver_) { 1733 if (!password_manager_driver_) {
1719 render_frame()->GetRemoteInterfaces()->GetInterface( 1734 render_frame()->GetRemoteInterfaces()->GetInterface(
1720 mojo::MakeRequest(&password_manager_driver_)); 1735 mojo::MakeRequest(&password_manager_driver_));
1721 } 1736 }
1722 1737
1723 return password_manager_driver_; 1738 return password_manager_driver_;
1724 } 1739 }
1725 1740
1726 } // namespace autofill 1741 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698