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

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

Issue 15660018: [autofill] Add support for PSL domain matching for password autofill. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments from isherman and aurimas Created 7 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 | Annotate | Revision Log
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 <vector>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
9 #include "base/message_loop.h" 11 #include "base/message_loop.h"
10 #include "base/metrics/histogram.h" 12 #include "base/metrics/histogram.h"
11 #include "components/autofill/common/autofill_messages.h" 13 #include "components/autofill/common/autofill_messages.h"
12 #include "components/autofill/common/form_field_data.h" 14 #include "components/autofill/common/form_field_data.h"
13 #include "components/autofill/common/password_form_fill_data.h" 15 #include "components/autofill/common/password_form_fill_data.h"
14 #include "components/autofill/content/renderer/form_autofill_util.h" 16 #include "components/autofill/content/renderer/form_autofill_util.h"
15 #include "content/public/common/password_form.h" 17 #include "content/public/common/password_form.h"
16 #include "content/public/renderer/password_form_conversion_utils.h" 18 #include "content/public/renderer/password_form_conversion_utils.h"
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 form_data)); 488 form_data));
487 } 489 }
488 } 490 }
489 491
490 //////////////////////////////////////////////////////////////////////////////// 492 ////////////////////////////////////////////////////////////////////////////////
491 // PasswordAutofillAgent, private: 493 // PasswordAutofillAgent, private:
492 494
493 void PasswordAutofillAgent::GetSuggestions( 495 void PasswordAutofillAgent::GetSuggestions(
494 const PasswordFormFillData& fill_data, 496 const PasswordFormFillData& fill_data,
495 const base::string16& input, 497 const base::string16& input,
496 std::vector<base::string16>* suggestions) { 498 std::vector<base::string16>* suggestions,
497 if (StartsWith(fill_data.basic_data.fields[0].value, input, false)) 499 std::vector<base::string16>* realms) {
500 if (StartsWith(fill_data.basic_data.fields[0].value, input, false)) {
498 suggestions->push_back(fill_data.basic_data.fields[0].value); 501 suggestions->push_back(fill_data.basic_data.fields[0].value);
502 realms->push_back(fill_data.preferred_realm);
503 }
499 504
500 for (PasswordFormFillData::LoginCollection::const_iterator iter = 505 for (PasswordFormFillData::LoginCollection::const_iterator iter =
501 fill_data.additional_logins.begin(); 506 fill_data.additional_logins.begin();
502 iter != fill_data.additional_logins.end(); ++iter) { 507 iter != fill_data.additional_logins.end(); ++iter) {
503 if (StartsWith(iter->first, input, false)) 508 if (StartsWith(iter->first, input, false)) {
504 suggestions->push_back(iter->first); 509 suggestions->push_back(iter->first);
510 realms->push_back(iter->second.realm);
511 }
505 } 512 }
506 513
507 for (PasswordFormFillData::UsernamesCollection::const_iterator iter = 514 for (PasswordFormFillData::UsernamesCollection::const_iterator iter =
508 fill_data.other_possible_usernames.begin(); 515 fill_data.other_possible_usernames.begin();
509 iter != fill_data.other_possible_usernames.end(); ++iter) { 516 iter != fill_data.other_possible_usernames.end(); ++iter) {
510 for (size_t i = 0; i < iter->second.size(); ++i) { 517 for (size_t i = 0; i < iter->second.size(); ++i) {
511 if (StartsWith(iter->second[i], input, false)) { 518 if (StartsWith(iter->second[i], input, false)) {
512 usernames_usage_ = OTHER_POSSIBLE_USERNAME_SHOWN; 519 usernames_usage_ = OTHER_POSSIBLE_USERNAME_SHOWN;
513 suggestions->push_back(iter->second[i]); 520 suggestions->push_back(iter->second[i]);
514 } 521 }
515 } 522 }
516 } 523 }
517 } 524 }
518 525
519 bool PasswordAutofillAgent::ShowSuggestionPopup( 526 bool PasswordAutofillAgent::ShowSuggestionPopup(
520 const PasswordFormFillData& fill_data, 527 const PasswordFormFillData& fill_data,
521 const WebKit::WebInputElement& user_input) { 528 const WebKit::WebInputElement& user_input) {
522 WebKit::WebFrame* frame = user_input.document().frame(); 529 WebKit::WebFrame* frame = user_input.document().frame();
523 if (!frame) 530 if (!frame)
524 return false; 531 return false;
525 532
526 WebKit::WebView* webview = frame->view(); 533 WebKit::WebView* webview = frame->view();
527 if (!webview) 534 if (!webview)
528 return false; 535 return false;
529 536
530 std::vector<base::string16> suggestions; 537 std::vector<base::string16> suggestions;
531 GetSuggestions(fill_data, user_input.value(), &suggestions); 538 std::vector<base::string16> suggestions_realms;
539 GetSuggestions(fill_data,
540 user_input.value(),
541 &suggestions,
542 &suggestions_realms);
532 543
533 if (disable_popup_) { 544 if (disable_popup_) {
534 FormData form; 545 FormData form;
535 FormFieldData field; 546 FormFieldData field;
536 FindFormAndFieldForInputElement( 547 FindFormAndFieldForInputElement(
537 user_input, &form, &field, REQUIRE_NONE); 548 user_input, &form, &field, REQUIRE_NONE);
538 549
539 WebKit::WebInputElement selected_element = user_input; 550 WebKit::WebInputElement selected_element = user_input;
540 gfx::Rect bounding_box(selected_element.boundsInViewportSpace()); 551 gfx::Rect bounding_box(selected_element.boundsInViewportSpace());
541 552
542 float scale = web_view_->pageScaleFactor(); 553 float scale = web_view_->pageScaleFactor();
543 gfx::RectF bounding_box_scaled(bounding_box.x() * scale, 554 gfx::RectF bounding_box_scaled(bounding_box.x() * scale,
544 bounding_box.y() * scale, 555 bounding_box.y() * scale,
545 bounding_box.width() * scale, 556 bounding_box.width() * scale,
546 bounding_box.height() * scale); 557 bounding_box.height() * scale);
547 Send(new AutofillHostMsg_ShowPasswordSuggestions(routing_id(), 558 Send(new AutofillHostMsg_ShowPasswordSuggestions(routing_id(),
548 field, 559 field,
549 bounding_box_scaled, 560 bounding_box_scaled,
550 suggestions)); 561 suggestions,
562 suggestions_realms));
551 return !suggestions.empty(); 563 return !suggestions.empty();
552 } 564 }
553 565
554 566
555 if (suggestions.empty()) { 567 if (suggestions.empty()) {
556 webview->hidePopups(); 568 webview->hidePopups();
557 return false; 569 return false;
558 } 570 }
559 571
560 std::vector<base::string16> labels(suggestions.size()); 572 std::vector<base::string16> labels(suggestions.size());
(...skipping 22 matching lines...) Expand all
583 username = fill_data.basic_data.fields[0].value; 595 username = fill_data.basic_data.fields[0].value;
584 password = fill_data.basic_data.fields[1].value; 596 password = fill_data.basic_data.fields[1].value;
585 } else { 597 } else {
586 // Scan additional logins for a match. 598 // Scan additional logins for a match.
587 PasswordFormFillData::LoginCollection::const_iterator iter; 599 PasswordFormFillData::LoginCollection::const_iterator iter;
588 for (iter = fill_data.additional_logins.begin(); 600 for (iter = fill_data.additional_logins.begin();
589 iter != fill_data.additional_logins.end(); ++iter) { 601 iter != fill_data.additional_logins.end(); ++iter) {
590 if (DoUsernamesMatch(iter->first, current_username, 602 if (DoUsernamesMatch(iter->first, current_username,
591 exact_username_match)) { 603 exact_username_match)) {
592 username = iter->first; 604 username = iter->first;
593 password = iter->second; 605 password = iter->second.password;
594 break; 606 break;
595 } 607 }
596 } 608 }
597 609
598 // Check possible usernames. 610 // Check possible usernames.
599 if (username.empty() && password.empty()) { 611 if (username.empty() && password.empty()) {
600 for (PasswordFormFillData::UsernamesCollection::const_iterator iter = 612 for (PasswordFormFillData::UsernamesCollection::const_iterator iter =
601 fill_data.other_possible_usernames.begin(); 613 fill_data.other_possible_usernames.begin();
602 iter != fill_data.other_possible_usernames.end(); ++iter) { 614 iter != fill_data.other_possible_usernames.end(); ++iter) {
603 for (size_t i = 0; i < iter->second.size(); ++i) { 615 for (size_t i = 0; i < iter->second.size(); ++i) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 LoginToPasswordInfoMap::iterator iter = login_to_password_info_.find(input); 696 LoginToPasswordInfoMap::iterator iter = login_to_password_info_.find(input);
685 if (iter == login_to_password_info_.end()) 697 if (iter == login_to_password_info_.end())
686 return false; 698 return false;
687 699
688 *found_input = input; 700 *found_input = input;
689 *found_password = iter->second; 701 *found_password = iter->second;
690 return true; 702 return true;
691 } 703 }
692 704
693 } // namespace autofill 705 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698