Index: chrome/browser/autofill/autofill_manager.cc |
diff --git a/chrome/browser/autofill/autofill_manager.cc b/chrome/browser/autofill/autofill_manager.cc |
index bbe120ac859034551ddcde76d8b9dad692b4d2d5..6f0f8669583478b18b45b4bf83b3f97fd3a4c64c 100644 |
--- a/chrome/browser/autofill/autofill_manager.cc |
+++ b/chrome/browser/autofill/autofill_manager.cc |
@@ -227,7 +227,11 @@ AutofillManager::AutofillManager(TabContentsWrapper* tab_contents) |
disable_download_manager_requests_(false), |
metric_logger_(new AutofillMetrics), |
has_logged_autofill_enabled_(false), |
- has_logged_address_suggestions_count_(false) { |
+ has_logged_address_suggestions_count_(false), |
+ did_show_suggestions_(false), |
+ user_did_type_(false), |
+ user_did_autofill_(false), |
+ user_did_edit_autofilled_field_(false) { |
DCHECK(tab_contents); |
// |personal_data_| is NULL when using TestTabContents. |
@@ -278,12 +282,16 @@ bool AutofillManager::OnMessageReceived(const IPC::Message& message) { |
IPC_BEGIN_MESSAGE_MAP(AutofillManager, message) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_FormsSeen, OnFormsSeen) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_FormSubmitted, OnFormSubmitted) |
+ IPC_MESSAGE_HANDLER(AutofillHostMsg_TextFieldDidChange, |
+ OnTextFieldDidChange) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_QueryFormFieldAutofill, |
OnQueryFormFieldAutofill) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_ShowAutofillDialog, |
OnShowAutofillDialog) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_FillAutofillFormData, |
OnFillAutofillFormData) |
+ IPC_MESSAGE_HANDLER(AutofillHostMsg_DidPreviewAutofillFormData, |
+ OnDidPreviewAutofillFormData) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_DidFillAutofillFormData, |
OnDidFillAutofillFormData) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_DidShowAutofillSuggestions, |
@@ -352,6 +360,31 @@ void AutofillManager::OnFormsSeen(const std::vector<FormData>& forms) { |
ParseForms(forms); |
} |
+void AutofillManager::OnTextFieldDidChange(const FormData& form, |
+ const FormField& field) { |
+ FormStructure* form_structure = NULL; |
+ AutofillField* autofill_field = NULL; |
+ if (!FindCachedFormAndField(form, field, &form_structure, &autofill_field)) |
+ return; |
+ |
+ if (!user_did_type_) { |
+ user_did_type_ = true; |
+ metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE); |
+ } |
+ |
+ if (autofill_field->is_autofilled) { |
+ autofill_field->is_autofilled = false; |
+ metric_logger_->LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD); |
+ |
+ if (!user_did_edit_autofilled_field_) { |
+ user_did_edit_autofilled_field_ = true; |
+ metric_logger_->LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE); |
+ } |
+ } |
+} |
+ |
void AutofillManager::OnQueryFormFieldAutofill( |
int query_id, |
const webkit_glue::FormData& form, |
@@ -508,6 +541,10 @@ void AutofillManager::OnFillAutofillFormData(int query_id, |
AutofillType(field_type).group()); |
FillCreditCardFormField(*credit_card, field_type, &(*iter)); |
} |
+ |
+ // Mark the cached field as autofilled, so that we can detect when a |
+ // user edits an autofilled field (for metrics). |
+ autofill_field->is_autofilled = true; |
break; |
} |
} |
@@ -559,6 +596,10 @@ void AutofillManager::OnFillAutofillFormData(int query_id, |
DCHECK_EQ(AutofillType::CREDIT_CARD, field_group_type); |
FillCreditCardFormField(*credit_card, field_type, &result.fields[j]); |
} |
+ |
+ // Mark the cached field as autofilled, so that we can detect when a user |
+ // edits an autofilled field (for metrics). |
+ form_structure->field(k)->is_autofilled = true; |
} |
// We found a matching field in the |form_structure|, so on the next |
@@ -583,18 +624,43 @@ void AutofillManager::OnShowAutofillDialog() { |
browser->ShowOptionsTab(chrome::kAutofillSubPage); |
} |
+void AutofillManager::OnDidPreviewAutofillFormData() { |
+ NotificationService::current()->Notify( |
+ chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA, |
+ Source<RenderViewHost>(tab_contents()->render_view_host()), |
+ NotificationService::NoDetails()); |
+} |
+ |
+ |
void AutofillManager::OnDidFillAutofillFormData() { |
NotificationService::current()->Notify( |
chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA, |
Source<RenderViewHost>(tab_contents()->render_view_host()), |
NotificationService::NoDetails()); |
+ |
+ metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL); |
+ if (!user_did_autofill_) { |
+ user_did_autofill_ = true; |
+ metric_logger_->LogUserHappinessMetric( |
+ AutofillMetrics::USER_DID_AUTOFILL_ONCE); |
+ } |
} |
-void AutofillManager::OnDidShowAutofillSuggestions() { |
+void AutofillManager::OnDidShowAutofillSuggestions(bool is_new_popup) { |
NotificationService::current()->Notify( |
chrome::NOTIFICATION_AUTOFILL_DID_SHOW_SUGGESTIONS, |
Source<RenderViewHost>(tab_contents()->render_view_host()), |
NotificationService::NoDetails()); |
+ |
+ if (is_new_popup) { |
+ metric_logger_->LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN); |
+ |
+ if (!did_show_suggestions_) { |
+ did_show_suggestions_ = true; |
+ metric_logger_->LogUserHappinessMetric( |
+ AutofillMetrics::SUGGESTIONS_SHOWN_ONCE); |
+ } |
+ } |
} |
void AutofillManager::OnLoadedServerPredictions( |
@@ -646,7 +712,7 @@ void AutofillManager::DeterminePossibleFieldTypesForUpload( |
// For each field in the |submitted_form|, extract the value. Then for each |
// profile or credit card, identify any stored types that match the value. |
for (size_t i = 0; i < submitted_form->field_count(); i++) { |
- const AutofillField* field = submitted_form->field(i); |
+ AutofillField* field = submitted_form->field(i); |
string16 value = CollapseWhitespace(field->value, false); |
FieldTypeSet matching_types; |
for (std::vector<FormGroup*>::const_iterator it = stored_data.begin(); |
@@ -657,7 +723,7 @@ void AutofillManager::DeterminePossibleFieldTypesForUpload( |
if (matching_types.empty()) |
matching_types.insert(UNKNOWN_TYPE); |
- submitted_form->set_possible_types(i, matching_types); |
+ field->set_possible_types(matching_types); |
} |
} |
@@ -704,6 +770,10 @@ void AutofillManager::Reset() { |
form_structures_.reset(); |
has_logged_autofill_enabled_ = false; |
has_logged_address_suggestions_count_ = false; |
+ did_show_suggestions_ = false; |
+ user_did_type_ = false; |
+ user_did_autofill_ = false; |
+ user_did_edit_autofilled_field_ = false; |
} |
AutofillManager::AutofillManager(TabContentsWrapper* tab_contents, |
@@ -715,7 +785,11 @@ AutofillManager::AutofillManager(TabContentsWrapper* tab_contents, |
disable_download_manager_requests_(true), |
metric_logger_(new AutofillMetrics), |
has_logged_autofill_enabled_(false), |
- has_logged_address_suggestions_count_(false) { |
+ has_logged_address_suggestions_count_(false), |
+ did_show_suggestions_(false), |
+ user_did_type_(false), |
+ user_did_autofill_(false), |
+ user_did_edit_autofilled_field_(false) { |
DCHECK(tab_contents); |
} |
@@ -1013,6 +1087,9 @@ void AutofillManager::ParseForms(const std::vector<FormData>& forms) { |
form_structures_.push_back(*iter); |
} |
+ if (!form_structures_.empty()) |
+ metric_logger_->LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED); |
+ |
CheckForPopularForms(form_structures_.get(), tab_contents_wrapper_, |
tab_contents()); |
} |