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

Unified Diff: components/autofill/content/renderer/password_generation_agent.cc

Issue 2318533002: [Password Generation] Use signatures for form matching (Closed)
Patch Set: Rebase Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: components/autofill/content/renderer/password_generation_agent.cc
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc
index 74a6113d0116924139ac304ff72777ab7c4e183b..bc36e3d01426fbdbbc3c2d195030adf62415d4c3 100644
--- a/components/autofill/content/renderer/password_generation_agent.cc
+++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -18,6 +18,7 @@
#include "components/autofill/core/common/password_form.h"
#include "components/autofill/core/common/password_form_generation_data.h"
#include "components/autofill/core/common/password_generation_util.h"
+#include "components/autofill/core/common/signatures_util.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_view.h"
#include "google_apis/gaia/gaia_urls.h"
@@ -55,39 +56,39 @@ bool ContainsURL(const std::vector<GURL>& urls, const GURL& url) {
return std::find(urls.begin(), urls.end(), url) != urls.end();
}
-// Finds a form in |forms| that has the same action and name as |form|.
+// Calculates the signature of |form| and searches it in |forms|.
const PasswordFormGenerationData* FindFormGenerationData(
const std::vector<PasswordFormGenerationData>& forms,
const PasswordForm& form) {
+ FormSignature form_signature = CalculateFormSignature(form.form_data);
for (const auto& form_it : forms) {
- if (form_it.name == form.form_data.name && form_it.action == form.action)
+ if (form_it.form_signature == form_signature)
return &form_it;
}
return nullptr;
}
// This function returns a vector of password fields into which Chrome should
-// fill the generated password. It assumes that |field_data| describes the field
-// where Chrome shows the password generation prompt. It returns no more
+// fill the generated password. It assumes that |field_signature| describes the
+// field where Chrome shows the password generation prompt. It returns no more
// than 2 elements.
std::vector<blink::WebInputElement> FindPasswordElementsForGeneration(
const std::vector<blink::WebInputElement>& all_password_elements,
- const base::string16& field_name) {
- auto iter =
- std::find_if(all_password_elements.begin(), all_password_elements.end(),
- [&field_name](const blink::WebInputElement& input) {
- // Make explicit conversion before comparing with string16.
- base::string16 input_name = input.nameForAutofill();
- return input_name == field_name;
- });
+ const FieldSignature field_signature) {
+ auto iter = std::find_if(
+ all_password_elements.begin(), all_password_elements.end(),
+ [&field_signature](const blink::WebInputElement& input) {
+ FieldSignature signature = CalculateFieldSignatureByNameAndType(
+ input.nameForAutofill(), input.formControlType().utf8());
+ return signature == field_signature;
+ });
std::vector<blink::WebInputElement> passwords;
// We copy not more than 2 fields because occasionally there are forms where
// the security question answers are put in password fields and we don't want
// to fill those.
- for (; iter != all_password_elements.end() && passwords.size() < 2; ++iter) {
+ for (; iter != all_password_elements.end() && passwords.size() < 2; ++iter)
passwords.push_back(*iter);
- }
return passwords;
}
@@ -403,7 +404,7 @@ void PasswordGenerationAgent::DetermineGenerationElement() {
std::vector<blink::WebInputElement> password_elements =
generation_data ? FindPasswordElementsForGeneration(
possible_form_data.password_elements,
- generation_data->generation_field.name)
+ generation_data->field_signature)
: possible_form_data.password_elements;
if (password_elements.empty()) {
// It might be if JavaScript changes field names.
@@ -565,7 +566,10 @@ void PasswordGenerationAgent::UserTriggeredGeneratePassword() {
std::vector<blink::WebInputElement> password_elements;
GetAccountCreationPasswordFields(control_elements, &password_elements);
password_elements = FindPasswordElementsForGeneration(
- password_elements, last_focused_password_element_.nameForAutofill());
+ password_elements,
+ CalculateFieldSignatureByNameAndType(
+ last_focused_password_element_.nameForAutofill(),
+ last_focused_password_element_.formControlType().utf8()));
generation_form_data_.reset(new AccountCreationFormData(
make_linked_ptr(password_form.release()), password_elements));
is_manually_triggered_ = true;

Powered by Google App Engine
This is Rietveld 408576698