| 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_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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 password_element.setAutofilled(true); | 278 password_element.setAutofilled(true); |
| 279 // Needed to notify password_autofill_agent that the content of the field | 279 // Needed to notify password_autofill_agent that the content of the field |
| 280 // has changed. Without this we will overwrite the generated | 280 // has changed. Without this we will overwrite the generated |
| 281 // password with an Autofilled password when saving. | 281 // password with an Autofilled password when saving. |
| 282 // https://crbug.com/493455 | 282 // https://crbug.com/493455 |
| 283 password_agent_->UpdateStateForTextChange(password_element); | 283 password_agent_->UpdateStateForTextChange(password_element); |
| 284 // Advance focus to the next input field. We assume password fields in | 284 // Advance focus to the next input field. We assume password fields in |
| 285 // an account creation form are always adjacent. | 285 // an account creation form are always adjacent. |
| 286 render_frame()->GetRenderView()->GetWebView()->advanceFocus(false); | 286 render_frame()->GetRenderView()->GetWebView()->advanceFocus(false); |
| 287 } | 287 } |
| 288 std::unique_ptr<PasswordForm> presaved_form(CreatePasswordFormToPresave()); |
| 289 if (presaved_form) { |
| 290 Send(new AutofillHostMsg_PresaveGeneratedPassword(routing_id(), |
| 291 *presaved_form)); |
| 292 } |
| 293 } |
| 294 |
| 295 std::unique_ptr<PasswordForm> |
| 296 PasswordGenerationAgent::CreatePasswordFormToPresave() { |
| 297 DCHECK(!generation_element_.isNull()); |
| 298 // Since the form for presaving should match a form in the browser, create it |
| 299 // with the same algorithm (to match html attributes, action, etc.), but |
| 300 // change username and password values. |
| 301 std::unique_ptr<PasswordForm> password_form; |
| 302 if (!generation_element_.form().isNull()) { |
| 303 password_form = CreatePasswordFormFromWebForm(generation_element_.form(), |
| 304 nullptr, nullptr); |
| 305 } else { |
| 306 password_form = CreatePasswordFormFromUnownedInputElements( |
| 307 *render_frame()->GetWebFrame(), nullptr, nullptr); |
| 308 } |
| 309 if (password_form) { |
| 310 // TODO(kolos): when we are good in username detection, save username |
| 311 // as well. |
| 312 password_form->username_value = base::string16(); |
| 313 password_form->password_value = generation_element_.value(); |
| 314 } |
| 315 |
| 316 return password_form; |
| 288 } | 317 } |
| 289 | 318 |
| 290 void PasswordGenerationAgent::OnFormsEligibleForGenerationFound( | 319 void PasswordGenerationAgent::OnFormsEligibleForGenerationFound( |
| 291 const std::vector<autofill::PasswordFormGenerationData>& forms) { | 320 const std::vector<autofill::PasswordFormGenerationData>& forms) { |
| 292 generation_enabled_forms_.insert(generation_enabled_forms_.end(), | 321 generation_enabled_forms_.insert(generation_enabled_forms_.end(), |
| 293 forms.begin(), forms.end()); | 322 forms.begin(), forms.end()); |
| 294 DetermineGenerationElement(); | 323 DetermineGenerationElement(); |
| 295 } | 324 } |
| 296 | 325 |
| 297 void PasswordGenerationAgent::DetermineGenerationElement() { | 326 void PasswordGenerationAgent::DetermineGenerationElement() { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 if (element != generation_element_) | 435 if (element != generation_element_) |
| 407 return false; | 436 return false; |
| 408 | 437 |
| 409 if (element.value().isEmpty()) { | 438 if (element.value().isEmpty()) { |
| 410 if (password_is_generated_) { | 439 if (password_is_generated_) { |
| 411 // User generated a password and then deleted it. | 440 // User generated a password and then deleted it. |
| 412 password_generation::LogPasswordGenerationEvent( | 441 password_generation::LogPasswordGenerationEvent( |
| 413 password_generation::PASSWORD_DELETED); | 442 password_generation::PASSWORD_DELETED); |
| 414 CopyElementValueToOtherInputElements(&element, | 443 CopyElementValueToOtherInputElements(&element, |
| 415 &generation_form_data_->password_elements); | 444 &generation_form_data_->password_elements); |
| 416 Send(new AutofillHostMsg_PasswordNoLongerGenerated( | 445 std::unique_ptr<PasswordForm> presaved_form( |
| 417 routing_id(), | 446 CreatePasswordFormToPresave()); |
| 418 *generation_form_data_->form)); | 447 if (presaved_form) { |
| 448 Send(new AutofillHostMsg_PasswordNoLongerGenerated(routing_id(), |
| 449 *presaved_form)); |
| 450 } |
| 419 } | 451 } |
| 420 | 452 |
| 421 // Do not treat the password as generated, either here or in the browser. | 453 // Do not treat the password as generated, either here or in the browser. |
| 422 password_is_generated_ = false; | 454 password_is_generated_ = false; |
| 423 generation_element_.setShouldRevealPassword(false); | 455 generation_element_.setShouldRevealPassword(false); |
| 424 | 456 |
| 425 // Offer generation again. | 457 // Offer generation again. |
| 426 ShowGenerationPopup(); | 458 ShowGenerationPopup(); |
| 427 } else if (password_is_generated_) { | 459 } else if (password_is_generated_) { |
| 428 password_edited_ = true; | 460 password_edited_ = true; |
| 429 // Mirror edits to any confirmation password fields. | 461 // Mirror edits to any confirmation password fields. |
| 430 CopyElementValueToOtherInputElements(&element, | 462 CopyElementValueToOtherInputElements(&element, |
| 431 &generation_form_data_->password_elements); | 463 &generation_form_data_->password_elements); |
| 464 std::unique_ptr<PasswordForm> presaved_form(CreatePasswordFormToPresave()); |
| 465 if (presaved_form) { |
| 466 Send(new AutofillHostMsg_PresaveGeneratedPassword(routing_id(), |
| 467 *presaved_form)); |
| 468 } |
| 432 } else if (element.value().length() > kMaximumOfferSize) { | 469 } else if (element.value().length() > kMaximumOfferSize) { |
| 433 // User has rejected the feature and has started typing a password. | 470 // User has rejected the feature and has started typing a password. |
| 434 HidePopup(); | 471 HidePopup(); |
| 435 } else { | 472 } else { |
| 436 // Password isn't generated and there are fewer than kMaximumOfferSize | 473 // Password isn't generated and there are fewer than kMaximumOfferSize |
| 437 // characters typed, so keep offering the password. Note this function | 474 // characters typed, so keep offering the password. Note this function |
| 438 // will just keep the previous popup if one is already showing. | 475 // will just keep the previous popup if one is already showing. |
| 439 ShowGenerationPopup(); | 476 ShowGenerationPopup(); |
| 440 } | 477 } |
| 441 | 478 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 GetAccountCreationPasswordFields(control_elements, &password_elements); | 533 GetAccountCreationPasswordFields(control_elements, &password_elements); |
| 497 password_elements = FindPasswordElementsForGeneration( | 534 password_elements = FindPasswordElementsForGeneration( |
| 498 password_elements, last_focused_password_element_.nameForAutofill()); | 535 password_elements, last_focused_password_element_.nameForAutofill()); |
| 499 generation_form_data_.reset(new AccountCreationFormData( | 536 generation_form_data_.reset(new AccountCreationFormData( |
| 500 make_linked_ptr(password_form.release()), password_elements)); | 537 make_linked_ptr(password_form.release()), password_elements)); |
| 501 is_manually_triggered_ = true; | 538 is_manually_triggered_ = true; |
| 502 ShowGenerationPopup(); | 539 ShowGenerationPopup(); |
| 503 } | 540 } |
| 504 | 541 |
| 505 } // namespace autofill | 542 } // namespace autofill |
| OLD | NEW |