| Index: components/autofill/renderer/autofill_agent.cc
|
| diff --git a/components/autofill/renderer/autofill_agent.cc b/components/autofill/renderer/autofill_agent.cc
|
| index beefed0615d9fa43558b617017fa0981e3a64538..fa2b8a8d84be1e8ca2b80cb0f7cc84d1007bd031 100644
|
| --- a/components/autofill/renderer/autofill_agent.cc
|
| +++ b/components/autofill/renderer/autofill_agent.cc
|
| @@ -151,6 +151,8 @@ AutofillAgent::AutofillAgent(content::RenderView* render_view,
|
| has_shown_autofill_popup_for_current_edit_(false),
|
| did_set_node_text_(false),
|
| autocheckout_click_in_progress_(false),
|
| + is_autocheckout_supported_(false),
|
| + has_new_forms_for_browser_(false),
|
| try_to_show_autocheckout_bubble_(false),
|
| ignore_text_changes_(false),
|
| weak_ptr_factory_(this) {
|
| @@ -214,11 +216,14 @@ void AutofillAgent::DidFinishDocumentLoad(WebFrame* frame) {
|
| form_cache_.ExtractForms(*frame, &forms);
|
| }
|
|
|
| + autofill::FormsSeenState state = has_more_forms ?
|
| + autofill::PARTIAL_FORMS_SEEN : autofill::NO_SPECIAL_FORMS_SEEN;
|
| +
|
| // Always communicate to browser process for topmost frame.
|
| if (!forms.empty() || !frame->parent()) {
|
| Send(new AutofillHostMsg_FormsSeen(routing_id(), forms,
|
| forms_seen_timestamp_,
|
| - has_more_forms));
|
| + state));
|
| }
|
| }
|
|
|
| @@ -736,7 +741,8 @@ void AutofillAgent::OnGetAllForms() {
|
|
|
| // Report to AutofillManager that all forms are being sent.
|
| Send(new AutofillHostMsg_FormsSeen(routing_id(), forms,
|
| - forms_seen_timestamp_, false));
|
| + forms_seen_timestamp_,
|
| + NO_SPECIAL_FORMS_SEEN));
|
| }
|
|
|
| void AutofillAgent::OnRequestAutocompleteResult(
|
| @@ -783,7 +789,10 @@ void AutofillAgent::OnFillFormsAndClick(
|
| }
|
|
|
| void AutofillAgent::OnAutocheckoutSupported() {
|
| + is_autocheckout_supported_ = true;
|
| try_to_show_autocheckout_bubble_ = true;
|
| + if (has_new_forms_for_browser_)
|
| + MaybeSendDynamicFormsSeen();
|
| MaybeShowAutocheckoutBubble();
|
| }
|
|
|
| @@ -945,4 +954,38 @@ void AutofillAgent::HideHostAutofillUi() {
|
| Send(new AutofillHostMsg_HideAutofillUi(routing_id()));
|
| }
|
|
|
| +void AutofillAgent::didAssociateFormControls(
|
| + const WebKit::WebVector<WebKit::WebNode>& nodes) {
|
| + for (size_t i = 0; i < nodes.size(); ++i) {
|
| + WebKit::WebNode node = nodes[i];
|
| + if (node.document().frame() == topmost_frame_) {
|
| + forms_seen_timestamp_ = base::TimeTicks::Now();
|
| + has_new_forms_for_browser_ = true;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + if (has_new_forms_for_browser_ && is_autocheckout_supported_)
|
| + MaybeSendDynamicFormsSeen();
|
| +}
|
| +
|
| +void AutofillAgent::MaybeSendDynamicFormsSeen() {
|
| + has_new_forms_for_browser_ = false;
|
| + form_elements_.clear();
|
| + std::vector<FormData> forms;
|
| + // This will only be called for Autocheckout flows, so send all forms to
|
| + // save an IPC.
|
| + form_cache_.ExtractFormsAndFormElements(
|
| + *topmost_frame_, 0, &forms, &form_elements_);
|
| + autofill::FormsSeenState state = autofill::DYNAMIC_FORMS_SEEN;
|
| +
|
| + if (!forms.empty()) {
|
| + if (click_timer_.IsRunning())
|
| + click_timer_.Stop();
|
| + Send(new AutofillHostMsg_FormsSeen(routing_id(), forms,
|
| + forms_seen_timestamp_,
|
| + state));
|
| + }
|
| +}
|
| +
|
| } // namespace autofill
|
|
|