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

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

Issue 2728353002: [Password Generation] Process CONFIRMATION_PASSWORD votes on the client side (Closed)
Patch Set: Removed PasswordFormGenerationData constructor that is used only in tests Created 3 years, 9 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_generation_agent.h" 5 #include "components/autofill/content/renderer/password_generation_agent.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 } 68 }
69 return nullptr; 69 return nullptr;
70 } 70 }
71 71
72 // This function returns a vector of password fields into which Chrome should 72 // This function returns a vector of password fields into which Chrome should
73 // fill the generated password. It assumes that |field_signature| describes the 73 // fill the generated password. It assumes that |field_signature| describes the
74 // field where Chrome shows the password generation prompt. It returns no more 74 // field where Chrome shows the password generation prompt. It returns no more
75 // than 2 elements. 75 // than 2 elements.
76 std::vector<blink::WebInputElement> FindPasswordElementsForGeneration( 76 std::vector<blink::WebInputElement> FindPasswordElementsForGeneration(
77 const std::vector<blink::WebInputElement>& all_password_elements, 77 const std::vector<blink::WebInputElement>& all_password_elements,
78 const FieldSignature field_signature) { 78 const PasswordFormGenerationData& generation_data) {
79 auto iter = std::find_if( 79 auto generation_field_iter = all_password_elements.end();
80 all_password_elements.begin(), all_password_elements.end(), 80 auto confirmation_field_iter = all_password_elements.end();
81 [&field_signature](const blink::WebInputElement& input) { 81 for (auto iter = all_password_elements.begin();
82 FieldSignature signature = CalculateFieldSignatureByNameAndType( 82 iter != all_password_elements.end(); ++iter) {
83 input.nameForAutofill().utf16(), input.formControlType().utf8()); 83 const blink::WebInputElement& input = *iter;
84 return signature == field_signature; 84 FieldSignature signature = CalculateFieldSignatureByNameAndType(
85 }); 85 input.nameForAutofill().utf16(), input.formControlType().utf8());
86 if (signature == generation_data.field_signature)
87 generation_field_iter = iter;
88 else if (generation_data.confirmation_field_signature.has_value() &&
dcheng 2017/03/07 21:42:26 Nit: else if (generation_data.confirmation_field_
kolos1 2017/03/08 07:43:50 Done.
89 signature == generation_data.confirmation_field_signature.value())
90 confirmation_field_iter = iter;
91 }
92
86 std::vector<blink::WebInputElement> passwords; 93 std::vector<blink::WebInputElement> passwords;
94 if (generation_field_iter != all_password_elements.end()) {
95 passwords.push_back(*generation_field_iter);
87 96
88 // We copy not more than 2 fields because occasionally there are forms where 97 if (confirmation_field_iter == all_password_elements.end())
89 // the security question answers are put in password fields and we don't want 98 confirmation_field_iter = generation_field_iter + 1;
90 // to fill those. 99 if (confirmation_field_iter != all_password_elements.end())
91 for (; iter != all_password_elements.end() && passwords.size() < 2; ++iter) 100 passwords.push_back(*confirmation_field_iter);
92 passwords.push_back(*iter); 101 }
93 return passwords; 102 return passwords;
94 } 103 }
95 104
96 void CopyElementValueToOtherInputElements( 105 void CopyElementValueToOtherInputElements(
97 const blink::WebInputElement* element, 106 const blink::WebInputElement* element,
98 std::vector<blink::WebInputElement>* elements) { 107 std::vector<blink::WebInputElement>* elements) {
99 for (blink::WebInputElement& it : *elements) { 108 for (blink::WebInputElement& it : *elements) {
100 if (*element != it) { 109 if (*element != it) {
101 it.setValue(element->value(), true /* sendEvents */); 110 it.setValue(element->value(), true /* sendEvents */);
102 } 111 }
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 VLOG(2) 406 VLOG(2)
398 << "Have not received confirmation from Autofill that form is " 407 << "Have not received confirmation from Autofill that form is "
399 << "used for account creation"; 408 << "used for account creation";
400 continue; 409 continue;
401 } 410 }
402 } 411 }
403 } 412 }
404 413
405 VLOG(2) << "Password generation eligible form found"; 414 VLOG(2) << "Password generation eligible form found";
406 std::vector<blink::WebInputElement> password_elements = 415 std::vector<blink::WebInputElement> password_elements =
407 generation_data ? FindPasswordElementsForGeneration( 416 generation_data
408 possible_form_data.password_elements, 417 ? FindPasswordElementsForGeneration(
409 generation_data->field_signature) 418 possible_form_data.password_elements, *generation_data)
410 : possible_form_data.password_elements; 419 : possible_form_data.password_elements;
411 if (password_elements.empty()) { 420 if (password_elements.empty()) {
412 // It might be if JavaScript changes field names. 421 // It might be if JavaScript changes field names.
413 VLOG(2) << "Fields for generation are not found"; 422 VLOG(2) << "Fields for generation are not found";
414 return; 423 return;
415 } 424 }
416 generation_form_data_.reset(new AccountCreationFormData( 425 generation_form_data_.reset(new AccountCreationFormData(
417 possible_form_data.form, std::move(password_elements))); 426 possible_form_data.form, std::move(password_elements)));
418 generation_element_ = generation_form_data_->password_elements[0]; 427 generation_element_ = generation_form_data_->password_elements[0];
419 generation_element_.setAttribute("aria-autocomplete", "list"); 428 generation_element_.setAttribute("aria-autocomplete", "list");
420 password_generation::LogPasswordGenerationEvent( 429 password_generation::LogPasswordGenerationEvent(
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 } 567 }
559 568
560 if (!password_form) 569 if (!password_form)
561 return; 570 return;
562 571
563 generation_element_ = last_focused_password_element_; 572 generation_element_ = last_focused_password_element_;
564 std::vector<blink::WebInputElement> password_elements; 573 std::vector<blink::WebInputElement> password_elements;
565 GetAccountCreationPasswordFields(control_elements, &password_elements); 574 GetAccountCreationPasswordFields(control_elements, &password_elements);
566 password_elements = FindPasswordElementsForGeneration( 575 password_elements = FindPasswordElementsForGeneration(
567 password_elements, 576 password_elements,
568 CalculateFieldSignatureByNameAndType( 577 PasswordFormGenerationData(
569 last_focused_password_element_.nameForAutofill().utf16(), 578 0, /* form_signature */
570 last_focused_password_element_.formControlType().utf8())); 579 CalculateFieldSignatureByNameAndType(
580 last_focused_password_element_.nameForAutofill().utf16(),
581 last_focused_password_element_.formControlType().utf8())));
571 generation_form_data_.reset(new AccountCreationFormData( 582 generation_form_data_.reset(new AccountCreationFormData(
572 make_linked_ptr(password_form.release()), password_elements)); 583 make_linked_ptr(password_form.release()), password_elements));
573 is_manually_triggered_ = true; 584 is_manually_triggered_ = true;
574 ShowGenerationPopup(); 585 ShowGenerationPopup();
575 } 586 }
576 587
577 const mojom::PasswordManagerDriverPtr& 588 const mojom::PasswordManagerDriverPtr&
578 PasswordGenerationAgent::GetPasswordManagerDriver() { 589 PasswordGenerationAgent::GetPasswordManagerDriver() {
579 DCHECK(password_agent_); 590 DCHECK(password_agent_);
580 return password_agent_->GetPasswordManagerDriver(); 591 return password_agent_->GetPasswordManagerDriver();
581 } 592 }
582 593
583 const mojom::PasswordManagerClientAssociatedPtr& 594 const mojom::PasswordManagerClientAssociatedPtr&
584 PasswordGenerationAgent::GetPasswordManagerClient() { 595 PasswordGenerationAgent::GetPasswordManagerClient() {
585 if (!password_manager_client_) { 596 if (!password_manager_client_) {
586 render_frame()->GetRemoteAssociatedInterfaces()->GetInterface( 597 render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(
587 &password_manager_client_); 598 &password_manager_client_);
588 } 599 }
589 600
590 return password_manager_client_; 601 return password_manager_client_;
591 } 602 }
592 603
593 } // namespace autofill 604 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698