| 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/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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|