Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/renderer/autofill_agent.h" | 5 #include "components/autofill/renderer/autofill_agent.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 autofill_query_id_(0), | 145 autofill_query_id_(0), |
| 146 autofill_action_(AUTOFILL_NONE), | 146 autofill_action_(AUTOFILL_NONE), |
| 147 topmost_frame_(NULL), | 147 topmost_frame_(NULL), |
| 148 web_view_(render_view->GetWebView()), | 148 web_view_(render_view->GetWebView()), |
| 149 display_warning_if_disabled_(false), | 149 display_warning_if_disabled_(false), |
| 150 was_query_node_autofilled_(false), | 150 was_query_node_autofilled_(false), |
| 151 has_shown_autofill_popup_for_current_edit_(false), | 151 has_shown_autofill_popup_for_current_edit_(false), |
| 152 did_set_node_text_(false), | 152 did_set_node_text_(false), |
| 153 autocheckout_click_in_progress_(false), | 153 autocheckout_click_in_progress_(false), |
| 154 is_whitelisted_for_autocheckout_(false), | 154 is_whitelisted_for_autocheckout_(false), |
| 155 has_new_forms_for_browser_(false), | |
| 155 ignore_text_changes_(false), | 156 ignore_text_changes_(false), |
| 156 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 157 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
| 157 render_view->GetWebView()->setAutofillClient(this); | 158 render_view->GetWebView()->setAutofillClient(this); |
| 158 | 159 |
| 159 // The PageClickTracker is a RenderViewObserver, and hence will be freed when | 160 // The PageClickTracker is a RenderViewObserver, and hence will be freed when |
| 160 // the RenderView is destroyed. | 161 // the RenderView is destroyed. |
| 161 new PageClickTracker(render_view, this); | 162 new PageClickTracker(render_view, this); |
| 162 } | 163 } |
| 163 | 164 |
| 164 AutofillAgent::~AutofillAgent() {} | 165 AutofillAgent::~AutofillAgent() {} |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 208 if (!frame->parent()) { | 209 if (!frame->parent()) { |
| 209 topmost_frame_ = frame; | 210 topmost_frame_ = frame; |
| 210 form_elements_.clear(); | 211 form_elements_.clear(); |
| 211 has_more_forms = form_cache_.ExtractFormsAndFormElements( | 212 has_more_forms = form_cache_.ExtractFormsAndFormElements( |
| 212 *frame, kRequiredAutofillFields, &forms, &form_elements_); | 213 *frame, kRequiredAutofillFields, &forms, &form_elements_); |
| 213 is_whitelisted_for_autocheckout_ = false; | 214 is_whitelisted_for_autocheckout_ = false; |
| 214 } else { | 215 } else { |
| 215 form_cache_.ExtractForms(*frame, &forms); | 216 form_cache_.ExtractForms(*frame, &forms); |
| 216 } | 217 } |
| 217 | 218 |
| 219 autofill::FormsSeenState state = has_more_forms ? | |
| 220 autofill::PARTIAL_FORMS_SEEN : autofill::NO_SPECIAL_FORMS_SEEN; | |
| 221 | |
| 218 // Always communicate to browser process for topmost frame. | 222 // Always communicate to browser process for topmost frame. |
| 219 if (!forms.empty() || !frame->parent()) { | 223 if (!forms.empty() || !frame->parent()) { |
| 220 Send(new AutofillHostMsg_FormsSeen(routing_id(), forms, | 224 Send(new AutofillHostMsg_FormsSeen(routing_id(), forms, |
| 221 forms_seen_timestamp_, | 225 forms_seen_timestamp_, |
| 222 has_more_forms)); | 226 state)); |
| 223 } | 227 } |
| 224 } | 228 } |
| 225 | 229 |
| 226 void AutofillAgent::DidStartProvisionalLoad(WebFrame* frame) { | 230 void AutofillAgent::DidStartProvisionalLoad(WebFrame* frame) { |
| 227 if (!frame->parent()) { | 231 if (!frame->parent()) { |
| 228 topmost_frame_ = NULL; | 232 topmost_frame_ = NULL; |
| 229 if (click_timer_.IsRunning()) { | 233 if (click_timer_.IsRunning()) { |
| 230 click_timer_.Stop(); | 234 click_timer_.Stop(); |
| 231 autocheckout_click_in_progress_ = true; | 235 autocheckout_click_in_progress_ = true; |
| 232 } | 236 } |
| (...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 721 std::vector<FormData> forms; | 725 std::vector<FormData> forms; |
| 722 form_cache_.ExtractFormsAndFormElements( | 726 form_cache_.ExtractFormsAndFormElements( |
| 723 *topmost_frame_, 0, &forms, &form_elements_); | 727 *topmost_frame_, 0, &forms, &form_elements_); |
| 724 | 728 |
| 725 // OnGetAllForms should only be called if AutofillAgent reported to | 729 // OnGetAllForms should only be called if AutofillAgent reported to |
| 726 // AutofillManager that there are more forms | 730 // AutofillManager that there are more forms |
| 727 DCHECK(!forms.empty()); | 731 DCHECK(!forms.empty()); |
| 728 | 732 |
| 729 // Report to AutofillManager that all forms are being sent. | 733 // Report to AutofillManager that all forms are being sent. |
| 730 Send(new AutofillHostMsg_FormsSeen(routing_id(), forms, | 734 Send(new AutofillHostMsg_FormsSeen(routing_id(), forms, |
| 731 forms_seen_timestamp_, false)); | 735 forms_seen_timestamp_, |
| 736 NO_SPECIAL_FORMS_SEEN)); | |
| 732 } | 737 } |
| 733 | 738 |
| 734 void AutofillAgent::OnRequestAutocompleteResult( | 739 void AutofillAgent::OnRequestAutocompleteResult( |
| 735 WebFormElement::AutocompleteResult result, const FormData& form_data) { | 740 WebFormElement::AutocompleteResult result, const FormData& form_data) { |
| 736 if (in_flight_request_form_.isNull()) | 741 if (in_flight_request_form_.isNull()) |
| 737 return; | 742 return; |
| 738 | 743 |
| 739 if (result == WebFormElement::AutocompleteResultSuccess) | 744 if (result == WebFormElement::AutocompleteResultSuccess) |
| 740 FillFormIncludingNonFocusableElements(form_data, in_flight_request_form_); | 745 FillFormIncludingNonFocusableElements(form_data, in_flight_request_form_); |
| 741 | 746 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 769 if (!ClickElement(topmost_frame_->document(), | 774 if (!ClickElement(topmost_frame_->document(), |
| 770 click_element_descriptor)) { | 775 click_element_descriptor)) { |
| 771 click_timer_.Stop(); | 776 click_timer_.Stop(); |
| 772 Send(new AutofillHostMsg_ClickFailed(routing_id(), | 777 Send(new AutofillHostMsg_ClickFailed(routing_id(), |
| 773 MISSING_ADVANCE)); | 778 MISSING_ADVANCE)); |
| 774 } | 779 } |
| 775 } | 780 } |
| 776 | 781 |
| 777 void AutofillAgent::OnWhitelistedForAutocheckout() { | 782 void AutofillAgent::OnWhitelistedForAutocheckout() { |
| 778 is_whitelisted_for_autocheckout_ = true; | 783 is_whitelisted_for_autocheckout_ = true; |
| 784 if (has_new_forms_for_browser_) | |
| 785 MaybeSendDynamicFormsSeen(); | |
| 779 } | 786 } |
| 780 | 787 |
| 781 void AutofillAgent::ClickFailed() { | 788 void AutofillAgent::ClickFailed() { |
| 782 Send(new AutofillHostMsg_ClickFailed(routing_id(), | 789 Send(new AutofillHostMsg_ClickFailed(routing_id(), |
| 783 CANNOT_PROCEED)); | 790 CANNOT_PROCEED)); |
| 784 } | 791 } |
| 785 | 792 |
| 786 void AutofillAgent::ShowSuggestions(const WebInputElement& element, | 793 void AutofillAgent::ShowSuggestions(const WebInputElement& element, |
| 787 bool autofill_on_empty_values, | 794 bool autofill_on_empty_values, |
| 788 bool requires_caret_at_end, | 795 bool requires_caret_at_end, |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 929 if (web_view) | 936 if (web_view) |
| 930 web_view->hidePopups(); | 937 web_view->hidePopups(); |
| 931 | 938 |
| 932 HideHostAutofillUi(); | 939 HideHostAutofillUi(); |
| 933 } | 940 } |
| 934 | 941 |
| 935 void AutofillAgent::HideHostAutofillUi() { | 942 void AutofillAgent::HideHostAutofillUi() { |
| 936 Send(new AutofillHostMsg_HideAutofillUi(routing_id())); | 943 Send(new AutofillHostMsg_HideAutofillUi(routing_id())); |
| 937 } | 944 } |
| 938 | 945 |
| 946 void AutofillAgent::didAssociateFormControls( | |
| 947 const WebKit::WebVector<WebKit::WebNode>& nodes) { | |
| 948 for (size_t i = 0; i < nodes.size(); ++i) { | |
| 949 WebKit::WebNode node = nodes[i]; | |
| 950 if (node.document().frame() == topmost_frame_) { | |
| 951 forms_seen_timestamp_ = base::TimeTicks::Now(); | |
| 952 has_new_forms_for_browser_ = true; | |
| 953 break; | |
| 954 } | |
| 955 } | |
| 956 | |
| 957 if (has_new_forms_for_browser_ && is_whitelisted_for_autocheckout_) | |
| 958 MaybeSendDynamicFormsSeen(); | |
| 959 } | |
| 960 | |
| 961 void AutofillAgent::MaybeSendDynamicFormsSeen() { | |
| 962 has_new_forms_for_browser_ = false; | |
| 963 form_elements_.clear(); | |
| 964 std::vector<FormData> forms; | |
| 965 // This will only be called for Autocheckout flows, so send all forms to | |
| 966 // save an IPC | |
|
Ilya Sherman
2013/04/18 22:19:08
nit: Please end the sentence with a period.
Dane Wallinga
2013/04/18 23:56:44
Done.
| |
| 967 bool has_more_forms = form_cache_.ExtractFormsAndFormElements( | |
| 968 *topmost_frame_, 0, &forms, &form_elements_); | |
|
Ilya Sherman
2013/04/18 22:19:08
Can calling this method with a threshold of 0 ever
Dane Wallinga
2013/04/18 23:56:44
gah, knew I missed something.
| |
| 969 autofill::FormsSeenState state = has_more_forms ? | |
| 970 autofill::PARTIAL_AND_DYNAMIC_FORMS_SEEN : autofill::DYNAMIC_FORMS_SEEN; | |
|
Ilya Sherman
2013/04/19 01:38:42
Is the PARTIAL_AND_DYNAMIC_FORMS_SEEN case reachab
Dane Wallinga
2013/04/19 18:19:53
Not presently. It would be applicable if you ever
| |
| 971 | |
| 972 if (!forms.empty()) { | |
| 973 if (click_timer_.IsRunning()) | |
| 974 click_timer_.Stop(); | |
|
Ilya Sherman
2013/04/18 22:19:08
Why is this part MaybeSendDynamicFormsSeen() and n
Dane Wallinga
2013/04/18 23:56:44
I don't want to clear the timer until I know that
Ilya Sherman
2013/04/19 01:38:42
That doesn't match how the logic in DidStartProvis
Dane Wallinga
2013/04/19 18:19:53
If the provisional load fails, we'll call ClickFai
| |
| 975 Send(new AutofillHostMsg_FormsSeen(routing_id(), forms, | |
| 976 forms_seen_timestamp_, | |
| 977 state)); | |
| 978 } | |
| 979 } | |
| 980 | |
| 939 } // namespace autofill | 981 } // namespace autofill |
| OLD | NEW |