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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 | 263 |
264 if (!element.isText() || !IsElementAutocompletable(element) || | 264 if (!element.isText() || !IsElementAutocompletable(element) || |
265 !IsElementAutocompletable(password)) { | 265 !IsElementAutocompletable(password)) { |
266 return false; | 266 return false; |
267 } | 267 } |
268 | 268 |
269 // Don't inline autocomplete if the user is deleting, that would be confusing. | 269 // Don't inline autocomplete if the user is deleting, that would be confusing. |
270 // But refresh the popup. Note, since this is ours, return true to signal | 270 // But refresh the popup. Note, since this is ours, return true to signal |
271 // no further processing is required. | 271 // no further processing is required. |
272 if (iter->second.backspace_pressed_last) { | 272 if (iter->second.backspace_pressed_last) { |
273 ShowSuggestionPopup(iter->second.fill_data, username); | 273 ShowSuggestionPopup(iter->second.fill_data, username, false); |
274 return true; | 274 return true; |
275 } | 275 } |
276 | 276 |
277 blink::WebString name = element.nameForAutofill(); | 277 blink::WebString name = element.nameForAutofill(); |
278 if (name.isEmpty()) | 278 if (name.isEmpty()) |
279 return false; // If the field has no name, then we won't have values. | 279 return false; // If the field has no name, then we won't have values. |
280 | 280 |
281 // Don't attempt to autofill with values that are too large. | 281 // Don't attempt to autofill with values that are too large. |
282 if (element.value().length() > kMaximumTextSizeForAutocomplete) | 282 if (element.value().length() > kMaximumTextSizeForAutocomplete) |
283 return false; | 283 return false; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 } | 322 } |
323 | 323 |
324 bool PasswordAutofillAgent::DidClearAutofillSelection( | 324 bool PasswordAutofillAgent::DidClearAutofillSelection( |
325 const blink::WebNode& node) { | 325 const blink::WebNode& node) { |
326 blink::WebInputElement input; | 326 blink::WebInputElement input; |
327 PasswordInfo password; | 327 PasswordInfo password; |
328 return FindLoginInfo(node, &input, &password); | 328 return FindLoginInfo(node, &input, &password); |
329 } | 329 } |
330 | 330 |
331 bool PasswordAutofillAgent::ShowSuggestions( | 331 bool PasswordAutofillAgent::ShowSuggestions( |
332 const blink::WebInputElement& element) { | 332 const blink::WebInputElement& element, |
| 333 bool show_all) { |
333 LoginToPasswordInfoMap::const_iterator iter = | 334 LoginToPasswordInfoMap::const_iterator iter = |
334 login_to_password_info_.find(element); | 335 login_to_password_info_.find(element); |
335 if (iter == login_to_password_info_.end()) | 336 if (iter == login_to_password_info_.end()) |
336 return false; | 337 return false; |
337 | 338 |
338 // If autocomplete='off' is set on the form elements, no suggestion dialog | 339 // If autocomplete='off' is set on the form elements, no suggestion dialog |
339 // should be shown. However, return |true| to indicate that this is a known | 340 // should be shown. However, return |true| to indicate that this is a known |
340 // password form and that the request to show suggestions has been handled (as | 341 // password form and that the request to show suggestions has been handled (as |
341 // a no-op). | 342 // a no-op). |
342 if (!IsElementAutocompletable(element) || | 343 if (!IsElementAutocompletable(element) || |
343 !IsElementAutocompletable(iter->second.password_field)) | 344 !IsElementAutocompletable(iter->second.password_field)) |
344 return true; | 345 return true; |
345 | 346 |
346 return ShowSuggestionPopup(iter->second.fill_data, element); | 347 return ShowSuggestionPopup(iter->second.fill_data, element, show_all); |
347 } | 348 } |
348 | 349 |
349 bool PasswordAutofillAgent::OriginCanAccessPasswordManager( | 350 bool PasswordAutofillAgent::OriginCanAccessPasswordManager( |
350 const blink::WebSecurityOrigin& origin) { | 351 const blink::WebSecurityOrigin& origin) { |
351 return origin.canAccessPasswordManager(); | 352 return origin.canAccessPasswordManager(); |
352 } | 353 } |
353 | 354 |
354 void PasswordAutofillAgent::OnDynamicFormsSeen(blink::WebFrame* frame) { | 355 void PasswordAutofillAgent::OnDynamicFormsSeen(blink::WebFrame* frame) { |
355 SendPasswordForms(frame, false /* only_visible */); | 356 SendPasswordForms(frame, false /* only_visible */); |
356 } | 357 } |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 } | 595 } |
595 } | 596 } |
596 | 597 |
597 //////////////////////////////////////////////////////////////////////////////// | 598 //////////////////////////////////////////////////////////////////////////////// |
598 // PasswordAutofillAgent, private: | 599 // PasswordAutofillAgent, private: |
599 | 600 |
600 void PasswordAutofillAgent::GetSuggestions( | 601 void PasswordAutofillAgent::GetSuggestions( |
601 const PasswordFormFillData& fill_data, | 602 const PasswordFormFillData& fill_data, |
602 const base::string16& input, | 603 const base::string16& input, |
603 std::vector<base::string16>* suggestions, | 604 std::vector<base::string16>* suggestions, |
604 std::vector<base::string16>* realms) { | 605 std::vector<base::string16>* realms, |
605 if (StartsWith(fill_data.basic_data.fields[0].value, input, false)) { | 606 bool show_all) { |
| 607 if (show_all || |
| 608 StartsWith(fill_data.basic_data.fields[0].value, input, false)) { |
606 suggestions->push_back(fill_data.basic_data.fields[0].value); | 609 suggestions->push_back(fill_data.basic_data.fields[0].value); |
607 realms->push_back(base::UTF8ToUTF16(fill_data.preferred_realm)); | 610 realms->push_back(base::UTF8ToUTF16(fill_data.preferred_realm)); |
608 } | 611 } |
609 | 612 |
610 for (PasswordFormFillData::LoginCollection::const_iterator iter = | 613 for (PasswordFormFillData::LoginCollection::const_iterator iter = |
611 fill_data.additional_logins.begin(); | 614 fill_data.additional_logins.begin(); |
612 iter != fill_data.additional_logins.end(); ++iter) { | 615 iter != fill_data.additional_logins.end(); ++iter) { |
613 if (StartsWith(iter->first, input, false)) { | 616 if (show_all || StartsWith(iter->first, input, false)) { |
614 suggestions->push_back(iter->first); | 617 suggestions->push_back(iter->first); |
615 realms->push_back(base::UTF8ToUTF16(iter->second.realm)); | 618 realms->push_back(base::UTF8ToUTF16(iter->second.realm)); |
616 } | 619 } |
617 } | 620 } |
618 | 621 |
619 for (PasswordFormFillData::UsernamesCollection::const_iterator iter = | 622 for (PasswordFormFillData::UsernamesCollection::const_iterator iter = |
620 fill_data.other_possible_usernames.begin(); | 623 fill_data.other_possible_usernames.begin(); |
621 iter != fill_data.other_possible_usernames.end(); ++iter) { | 624 iter != fill_data.other_possible_usernames.end(); ++iter) { |
622 for (size_t i = 0; i < iter->second.size(); ++i) { | 625 for (size_t i = 0; i < iter->second.size(); ++i) { |
623 if (StartsWith(iter->second[i], input, false)) { | 626 if (show_all || StartsWith(iter->second[i], input, false)) { |
624 usernames_usage_ = OTHER_POSSIBLE_USERNAME_SHOWN; | 627 usernames_usage_ = OTHER_POSSIBLE_USERNAME_SHOWN; |
625 suggestions->push_back(iter->second[i]); | 628 suggestions->push_back(iter->second[i]); |
626 realms->push_back(base::UTF8ToUTF16(iter->first.realm)); | 629 realms->push_back(base::UTF8ToUTF16(iter->first.realm)); |
627 } | 630 } |
628 } | 631 } |
629 } | 632 } |
630 } | 633 } |
631 | 634 |
632 bool PasswordAutofillAgent::ShowSuggestionPopup( | 635 bool PasswordAutofillAgent::ShowSuggestionPopup( |
633 const PasswordFormFillData& fill_data, | 636 const PasswordFormFillData& fill_data, |
634 const blink::WebInputElement& user_input) { | 637 const blink::WebInputElement& user_input, |
| 638 bool show_all) { |
635 blink::WebFrame* frame = user_input.document().frame(); | 639 blink::WebFrame* frame = user_input.document().frame(); |
636 if (!frame) | 640 if (!frame) |
637 return false; | 641 return false; |
638 | 642 |
639 blink::WebView* webview = frame->view(); | 643 blink::WebView* webview = frame->view(); |
640 if (!webview) | 644 if (!webview) |
641 return false; | 645 return false; |
642 | 646 |
643 std::vector<base::string16> suggestions; | 647 std::vector<base::string16> suggestions; |
644 std::vector<base::string16> realms; | 648 std::vector<base::string16> realms; |
645 GetSuggestions(fill_data, user_input.value(), &suggestions, &realms); | 649 GetSuggestions( |
| 650 fill_data, user_input.value(), &suggestions, &realms, show_all); |
646 DCHECK_EQ(suggestions.size(), realms.size()); | 651 DCHECK_EQ(suggestions.size(), realms.size()); |
647 | 652 |
648 FormData form; | 653 FormData form; |
649 FormFieldData field; | 654 FormFieldData field; |
650 FindFormAndFieldForInputElement( | 655 FindFormAndFieldForInputElement( |
651 user_input, &form, &field, REQUIRE_NONE); | 656 user_input, &form, &field, REQUIRE_NONE); |
652 | 657 |
653 blink::WebInputElement selected_element = user_input; | 658 blink::WebInputElement selected_element = user_input; |
654 gfx::Rect bounding_box(selected_element.boundsInViewportSpace()); | 659 gfx::Rect bounding_box(selected_element.boundsInViewportSpace()); |
655 | 660 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 blink::WebInputElement password = password_input; | 805 blink::WebInputElement password = password_input; |
801 | 806 |
802 // Don't inline autocomplete if the caret is not at the end. | 807 // Don't inline autocomplete if the caret is not at the end. |
803 // TODO(jcivelli): is there a better way to test the caret location? | 808 // TODO(jcivelli): is there a better way to test the caret location? |
804 if (username.selectionStart() != username.selectionEnd() || | 809 if (username.selectionStart() != username.selectionEnd() || |
805 username.selectionEnd() != static_cast<int>(username.value().length())) { | 810 username.selectionEnd() != static_cast<int>(username.value().length())) { |
806 return; | 811 return; |
807 } | 812 } |
808 | 813 |
809 // Show the popup with the list of available usernames. | 814 // Show the popup with the list of available usernames. |
810 ShowSuggestionPopup(fill_data, username); | 815 ShowSuggestionPopup(fill_data, username, false); |
811 | |
812 | 816 |
813 #if !defined(OS_ANDROID) | 817 #if !defined(OS_ANDROID) |
814 // Fill the user and password field with the most relevant match. Android | 818 // Fill the user and password field with the most relevant match. Android |
815 // only fills in the fields after the user clicks on the suggestion popup. | 819 // only fills in the fields after the user clicks on the suggestion popup. |
816 FillUserNameAndPassword(&username, &password, fill_data, | 820 FillUserNameAndPassword(&username, &password, fill_data, |
817 false /* exact_username_match */, | 821 false /* exact_username_match */, |
818 true /* set_selection */); | 822 true /* set_selection */); |
819 #endif | 823 #endif |
820 } | 824 } |
821 | 825 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 } | 874 } |
871 | 875 |
872 PasswordAutofillAgent::AutofillWebUserGestureHandler:: | 876 PasswordAutofillAgent::AutofillWebUserGestureHandler:: |
873 AutofillWebUserGestureHandler(PasswordAutofillAgent* agent) | 877 AutofillWebUserGestureHandler(PasswordAutofillAgent* agent) |
874 : agent_(agent) {} | 878 : agent_(agent) {} |
875 | 879 |
876 PasswordAutofillAgent::AutofillWebUserGestureHandler:: | 880 PasswordAutofillAgent::AutofillWebUserGestureHandler:: |
877 ~AutofillWebUserGestureHandler() {} | 881 ~AutofillWebUserGestureHandler() {} |
878 | 882 |
879 } // namespace autofill | 883 } // namespace autofill |
OLD | NEW |