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

Side by Side Diff: chrome/browser/autofill/autofill_manager.cc

Issue 7747009: Add metrics to track Autofill "user happiness" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 9 years, 4 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
« no previous file with comments | « chrome/browser/autofill/autofill_manager.h ('k') | chrome/browser/autofill/autofill_metrics.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/autofill/autofill_manager.h" 5 #include "chrome/browser/autofill/autofill_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <limits> 9 #include <limits>
10 #include <map> 10 #include <map>
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 } // namespace 220 } // namespace
221 221
222 AutofillManager::AutofillManager(TabContentsWrapper* tab_contents) 222 AutofillManager::AutofillManager(TabContentsWrapper* tab_contents)
223 : TabContentsObserver(tab_contents->tab_contents()), 223 : TabContentsObserver(tab_contents->tab_contents()),
224 tab_contents_wrapper_(tab_contents), 224 tab_contents_wrapper_(tab_contents),
225 personal_data_(NULL), 225 personal_data_(NULL),
226 download_manager_(tab_contents->profile()), 226 download_manager_(tab_contents->profile()),
227 disable_download_manager_requests_(false), 227 disable_download_manager_requests_(false),
228 metric_logger_(new AutofillMetrics), 228 metric_logger_(new AutofillMetrics),
229 has_logged_autofill_enabled_(false), 229 has_logged_autofill_enabled_(false),
230 has_logged_address_suggestions_count_(false) { 230 has_logged_address_suggestions_count_(false),
231 did_show_suggestions_(false),
232 user_did_type_(false),
233 user_did_autofill_(false),
234 user_did_edit_autofilled_field_(false) {
231 DCHECK(tab_contents); 235 DCHECK(tab_contents);
232 236
233 // |personal_data_| is NULL when using TestTabContents. 237 // |personal_data_| is NULL when using TestTabContents.
234 personal_data_ = 238 personal_data_ =
235 tab_contents->profile()->GetOriginalProfile()->GetPersonalDataManager(); 239 tab_contents->profile()->GetOriginalProfile()->GetPersonalDataManager();
236 download_manager_.SetObserver(this); 240 download_manager_.SetObserver(this);
237 } 241 }
238 242
239 AutofillManager::~AutofillManager() { 243 AutofillManager::~AutofillManager() {
240 download_manager_.SetObserver(NULL); 244 download_manager_.SetObserver(NULL);
(...skipping 30 matching lines...) Expand all
271 const content::LoadCommittedDetails& details, 275 const content::LoadCommittedDetails& details,
272 const ViewHostMsg_FrameNavigate_Params& params) { 276 const ViewHostMsg_FrameNavigate_Params& params) {
273 Reset(); 277 Reset();
274 } 278 }
275 279
276 bool AutofillManager::OnMessageReceived(const IPC::Message& message) { 280 bool AutofillManager::OnMessageReceived(const IPC::Message& message) {
277 bool handled = true; 281 bool handled = true;
278 IPC_BEGIN_MESSAGE_MAP(AutofillManager, message) 282 IPC_BEGIN_MESSAGE_MAP(AutofillManager, message)
279 IPC_MESSAGE_HANDLER(AutofillHostMsg_FormsSeen, OnFormsSeen) 283 IPC_MESSAGE_HANDLER(AutofillHostMsg_FormsSeen, OnFormsSeen)
280 IPC_MESSAGE_HANDLER(AutofillHostMsg_FormSubmitted, OnFormSubmitted) 284 IPC_MESSAGE_HANDLER(AutofillHostMsg_FormSubmitted, OnFormSubmitted)
285 IPC_MESSAGE_HANDLER(AutofillHostMsg_TextFieldDidChange,
286 OnTextFieldDidChange)
281 IPC_MESSAGE_HANDLER(AutofillHostMsg_QueryFormFieldAutofill, 287 IPC_MESSAGE_HANDLER(AutofillHostMsg_QueryFormFieldAutofill,
282 OnQueryFormFieldAutofill) 288 OnQueryFormFieldAutofill)
283 IPC_MESSAGE_HANDLER(AutofillHostMsg_ShowAutofillDialog, 289 IPC_MESSAGE_HANDLER(AutofillHostMsg_ShowAutofillDialog,
284 OnShowAutofillDialog) 290 OnShowAutofillDialog)
285 IPC_MESSAGE_HANDLER(AutofillHostMsg_FillAutofillFormData, 291 IPC_MESSAGE_HANDLER(AutofillHostMsg_FillAutofillFormData,
286 OnFillAutofillFormData) 292 OnFillAutofillFormData)
293 IPC_MESSAGE_HANDLER(AutofillHostMsg_DidPreviewAutofillFormData,
294 OnDidPreviewAutofillFormData)
287 IPC_MESSAGE_HANDLER(AutofillHostMsg_DidFillAutofillFormData, 295 IPC_MESSAGE_HANDLER(AutofillHostMsg_DidFillAutofillFormData,
288 OnDidFillAutofillFormData) 296 OnDidFillAutofillFormData)
289 IPC_MESSAGE_HANDLER(AutofillHostMsg_DidShowAutofillSuggestions, 297 IPC_MESSAGE_HANDLER(AutofillHostMsg_DidShowAutofillSuggestions,
290 OnDidShowAutofillSuggestions) 298 OnDidShowAutofillSuggestions)
291 IPC_MESSAGE_UNHANDLED(handled = false) 299 IPC_MESSAGE_UNHANDLED(handled = false)
292 IPC_END_MESSAGE_MAP() 300 IPC_END_MESSAGE_MAP()
293 301
294 return handled; 302 return handled;
295 } 303 }
296 304
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 metric_logger_->LogIsAutofillEnabledAtPageLoad(enabled); 353 metric_logger_->LogIsAutofillEnabledAtPageLoad(enabled);
346 has_logged_autofill_enabled_ = true; 354 has_logged_autofill_enabled_ = true;
347 } 355 }
348 356
349 if (!enabled) 357 if (!enabled)
350 return; 358 return;
351 359
352 ParseForms(forms); 360 ParseForms(forms);
353 } 361 }
354 362
363 void AutofillManager::OnTextFieldDidChange(const FormData& form,
364 const FormField& field) {
365 FormStructure* form_structure = NULL;
366 AutofillField* autofill_field = NULL;
367 if (!FindCachedFormAndField(form, field, &form_structure, &autofill_field))
368 return;
369
370 if (!user_did_type_) {
371 user_did_type_ = true;
372 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE);
373 }
374
375 if (autofill_field->is_autofilled) {
376 autofill_field->is_autofilled = false;
377 metric_logger_->LogUserHappinessMetric(
378 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD);
379
380 if (!user_did_edit_autofilled_field_) {
381 user_did_edit_autofilled_field_ = true;
382 metric_logger_->LogUserHappinessMetric(
383 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE);
384 }
385 }
386 }
387
355 void AutofillManager::OnQueryFormFieldAutofill( 388 void AutofillManager::OnQueryFormFieldAutofill(
356 int query_id, 389 int query_id,
357 const webkit_glue::FormData& form, 390 const webkit_glue::FormData& form,
358 const webkit_glue::FormField& field) { 391 const webkit_glue::FormField& field) {
359 std::vector<string16> values; 392 std::vector<string16> values;
360 std::vector<string16> labels; 393 std::vector<string16> labels;
361 std::vector<string16> icons; 394 std::vector<string16> icons;
362 std::vector<int> unique_ids; 395 std::vector<int> unique_ids;
363 396
364 RenderViewHost* host = NULL; 397 RenderViewHost* host = NULL;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 if (profile) { 534 if (profile) {
502 DCHECK_NE(AutofillType::CREDIT_CARD, 535 DCHECK_NE(AutofillType::CREDIT_CARD,
503 AutofillType(field_type).group()); 536 AutofillType(field_type).group());
504 FillFormField(*profile, *autofill_field, profile_guid.second, 537 FillFormField(*profile, *autofill_field, profile_guid.second,
505 &(*iter)); 538 &(*iter));
506 } else { 539 } else {
507 DCHECK_EQ(AutofillType::CREDIT_CARD, 540 DCHECK_EQ(AutofillType::CREDIT_CARD,
508 AutofillType(field_type).group()); 541 AutofillType(field_type).group());
509 FillCreditCardFormField(*credit_card, field_type, &(*iter)); 542 FillCreditCardFormField(*credit_card, field_type, &(*iter));
510 } 543 }
544
545 // Mark the cached field as autofilled, so that we can detect when a
546 // user edits an autofilled field (for metrics).
547 autofill_field->is_autofilled = true;
511 break; 548 break;
512 } 549 }
513 } 550 }
514 551
515 host->Send(new AutofillMsg_FormDataFilled(host->routing_id(), query_id, 552 host->Send(new AutofillMsg_FormDataFilled(host->routing_id(), query_id,
516 result)); 553 result));
517 return; 554 return;
518 } 555 }
519 556
520 // The list of fields in |form_structure| and |result.fields| often match 557 // The list of fields in |form_structure| and |result.fields| often match
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 if (result.fields[j] == field) { 589 if (result.fields[j] == field) {
553 FillFormField(*profile, *cached_field, profile_guid.second, 590 FillFormField(*profile, *cached_field, profile_guid.second,
554 &result.fields[j]); 591 &result.fields[j]);
555 } else { 592 } else {
556 FillFormField(*profile, *cached_field, 0, &result.fields[j]); 593 FillFormField(*profile, *cached_field, 0, &result.fields[j]);
557 } 594 }
558 } else { 595 } else {
559 DCHECK_EQ(AutofillType::CREDIT_CARD, field_group_type); 596 DCHECK_EQ(AutofillType::CREDIT_CARD, field_group_type);
560 FillCreditCardFormField(*credit_card, field_type, &result.fields[j]); 597 FillCreditCardFormField(*credit_card, field_type, &result.fields[j]);
561 } 598 }
599
600 // Mark the cached field as autofilled, so that we can detect when a user
601 // edits an autofilled field (for metrics).
602 form_structure->field(k)->is_autofilled = true;
562 } 603 }
563 604
564 // We found a matching field in the |form_structure|, so on the next 605 // We found a matching field in the |form_structure|, so on the next
565 // iteration we should proceed to the next |form_structure| field. 606 // iteration we should proceed to the next |form_structure| field.
566 ++i; 607 ++i;
567 } 608 }
568 609
569 autofilled_form_signatures_.push_front(form_structure->FormSignature()); 610 autofilled_form_signatures_.push_front(form_structure->FormSignature());
570 // Only remember the last few forms that we've seen, both to avoid false 611 // Only remember the last few forms that we've seen, both to avoid false
571 // positives and to avoid wasting memory. 612 // positives and to avoid wasting memory.
572 if (autofilled_form_signatures_.size() > kMaxRecentFormSignaturesToRemember) 613 if (autofilled_form_signatures_.size() > kMaxRecentFormSignaturesToRemember)
573 autofilled_form_signatures_.pop_back(); 614 autofilled_form_signatures_.pop_back();
574 615
575 host->Send(new AutofillMsg_FormDataFilled( 616 host->Send(new AutofillMsg_FormDataFilled(
576 host->routing_id(), query_id, result)); 617 host->routing_id(), query_id, result));
577 } 618 }
578 619
579 void AutofillManager::OnShowAutofillDialog() { 620 void AutofillManager::OnShowAutofillDialog() {
580 Browser* browser = BrowserList::GetLastActiveWithProfile( 621 Browser* browser = BrowserList::GetLastActiveWithProfile(
581 Profile::FromBrowserContext(tab_contents()->browser_context())); 622 Profile::FromBrowserContext(tab_contents()->browser_context()));
582 if (browser) 623 if (browser)
583 browser->ShowOptionsTab(chrome::kAutofillSubPage); 624 browser->ShowOptionsTab(chrome::kAutofillSubPage);
584 } 625 }
585 626
627 void AutofillManager::OnDidPreviewAutofillFormData() {
628 NotificationService::current()->Notify(
629 chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA,
630 Source<RenderViewHost>(tab_contents()->render_view_host()),
631 NotificationService::NoDetails());
632 }
633
634
586 void AutofillManager::OnDidFillAutofillFormData() { 635 void AutofillManager::OnDidFillAutofillFormData() {
587 NotificationService::current()->Notify( 636 NotificationService::current()->Notify(
588 chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA, 637 chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA,
589 Source<RenderViewHost>(tab_contents()->render_view_host()), 638 Source<RenderViewHost>(tab_contents()->render_view_host()),
590 NotificationService::NoDetails()); 639 NotificationService::NoDetails());
640
641 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL);
642 if (!user_did_autofill_) {
643 user_did_autofill_ = true;
644 metric_logger_->LogUserHappinessMetric(
645 AutofillMetrics::USER_DID_AUTOFILL_ONCE);
646 }
591 } 647 }
592 648
593 void AutofillManager::OnDidShowAutofillSuggestions() { 649 void AutofillManager::OnDidShowAutofillSuggestions(bool is_new_popup) {
594 NotificationService::current()->Notify( 650 NotificationService::current()->Notify(
595 chrome::NOTIFICATION_AUTOFILL_DID_SHOW_SUGGESTIONS, 651 chrome::NOTIFICATION_AUTOFILL_DID_SHOW_SUGGESTIONS,
596 Source<RenderViewHost>(tab_contents()->render_view_host()), 652 Source<RenderViewHost>(tab_contents()->render_view_host()),
597 NotificationService::NoDetails()); 653 NotificationService::NoDetails());
654
655 if (is_new_popup) {
656 metric_logger_->LogUserHappinessMetric(AutofillMetrics::SUGGESTIONS_SHOWN);
657
658 if (!did_show_suggestions_) {
659 did_show_suggestions_ = true;
660 metric_logger_->LogUserHappinessMetric(
661 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE);
662 }
663 }
598 } 664 }
599 665
600 void AutofillManager::OnLoadedServerPredictions( 666 void AutofillManager::OnLoadedServerPredictions(
601 const std::string& response_xml) { 667 const std::string& response_xml) {
602 // Parse and store the server predictions. 668 // Parse and store the server predictions.
603 FormStructure::ParseQueryResponse(response_xml, 669 FormStructure::ParseQueryResponse(response_xml,
604 form_structures_.get(), 670 form_structures_.get(),
605 *metric_logger_); 671 *metric_logger_);
606 672
607 // If the corresponding flag is set, annotate forms with the predicted types. 673 // If the corresponding flag is set, annotate forms with the predicted types.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 const std::vector<AutofillProfile*>& profiles = personal_data_->profiles(); 705 const std::vector<AutofillProfile*>& profiles = personal_data_->profiles();
640 const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards(); 706 const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards();
641 std::vector<FormGroup*> stored_data; 707 std::vector<FormGroup*> stored_data;
642 stored_data.insert(stored_data.end(), profiles.begin(), profiles.end()); 708 stored_data.insert(stored_data.end(), profiles.begin(), profiles.end());
643 stored_data.insert(stored_data.end(), credit_cards.begin(), 709 stored_data.insert(stored_data.end(), credit_cards.begin(),
644 credit_cards.end()); 710 credit_cards.end());
645 711
646 // For each field in the |submitted_form|, extract the value. Then for each 712 // For each field in the |submitted_form|, extract the value. Then for each
647 // profile or credit card, identify any stored types that match the value. 713 // profile or credit card, identify any stored types that match the value.
648 for (size_t i = 0; i < submitted_form->field_count(); i++) { 714 for (size_t i = 0; i < submitted_form->field_count(); i++) {
649 const AutofillField* field = submitted_form->field(i); 715 AutofillField* field = submitted_form->field(i);
650 string16 value = CollapseWhitespace(field->value, false); 716 string16 value = CollapseWhitespace(field->value, false);
651 FieldTypeSet matching_types; 717 FieldTypeSet matching_types;
652 for (std::vector<FormGroup*>::const_iterator it = stored_data.begin(); 718 for (std::vector<FormGroup*>::const_iterator it = stored_data.begin();
653 it != stored_data.end(); ++it) { 719 it != stored_data.end(); ++it) {
654 (*it)->GetMatchingTypes(value, &matching_types); 720 (*it)->GetMatchingTypes(value, &matching_types);
655 } 721 }
656 722
657 if (matching_types.empty()) 723 if (matching_types.empty())
658 matching_types.insert(UNKNOWN_TYPE); 724 matching_types.insert(UNKNOWN_TYPE);
659 725
660 submitted_form->set_possible_types(i, matching_types); 726 field->set_possible_types(matching_types);
661 } 727 }
662 } 728 }
663 729
664 void AutofillManager::ImportFormData(const FormStructure& submitted_form) { 730 void AutofillManager::ImportFormData(const FormStructure& submitted_form) {
665 const CreditCard* imported_credit_card; 731 const CreditCard* imported_credit_card;
666 if (!personal_data_->ImportFormData(submitted_form, &imported_credit_card)) 732 if (!personal_data_->ImportFormData(submitted_form, &imported_credit_card))
667 return; 733 return;
668 734
669 // If credit card information was submitted, show an infobar to offer to save 735 // If credit card information was submitted, show an infobar to offer to save
670 // it. 736 // it.
(...skipping 26 matching lines...) Expand all
697 personal_data_->GetNonEmptyTypes(&non_empty_types); 763 personal_data_->GetNonEmptyTypes(&non_empty_types);
698 764
699 download_manager_.StartUploadRequest(submitted_form, was_autofilled, 765 download_manager_.StartUploadRequest(submitted_form, was_autofilled,
700 non_empty_types); 766 non_empty_types);
701 } 767 }
702 768
703 void AutofillManager::Reset() { 769 void AutofillManager::Reset() {
704 form_structures_.reset(); 770 form_structures_.reset();
705 has_logged_autofill_enabled_ = false; 771 has_logged_autofill_enabled_ = false;
706 has_logged_address_suggestions_count_ = false; 772 has_logged_address_suggestions_count_ = false;
773 did_show_suggestions_ = false;
774 user_did_type_ = false;
775 user_did_autofill_ = false;
776 user_did_edit_autofilled_field_ = false;
707 } 777 }
708 778
709 AutofillManager::AutofillManager(TabContentsWrapper* tab_contents, 779 AutofillManager::AutofillManager(TabContentsWrapper* tab_contents,
710 PersonalDataManager* personal_data) 780 PersonalDataManager* personal_data)
711 : TabContentsObserver(tab_contents->tab_contents()), 781 : TabContentsObserver(tab_contents->tab_contents()),
712 tab_contents_wrapper_(tab_contents), 782 tab_contents_wrapper_(tab_contents),
713 personal_data_(personal_data), 783 personal_data_(personal_data),
714 download_manager_(NULL), 784 download_manager_(NULL),
715 disable_download_manager_requests_(true), 785 disable_download_manager_requests_(true),
716 metric_logger_(new AutofillMetrics), 786 metric_logger_(new AutofillMetrics),
717 has_logged_autofill_enabled_(false), 787 has_logged_autofill_enabled_(false),
718 has_logged_address_suggestions_count_(false) { 788 has_logged_address_suggestions_count_(false),
789 did_show_suggestions_(false),
790 user_did_type_(false),
791 user_did_autofill_(false),
792 user_did_edit_autofilled_field_(false) {
719 DCHECK(tab_contents); 793 DCHECK(tab_contents);
720 } 794 }
721 795
722 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { 796 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) {
723 metric_logger_.reset(metric_logger); 797 metric_logger_.reset(metric_logger);
724 } 798 }
725 799
726 bool AutofillManager::GetHost(const std::vector<AutofillProfile*>& profiles, 800 bool AutofillManager::GetHost(const std::vector<AutofillProfile*>& profiles,
727 const std::vector<CreditCard*>& credit_cards, 801 const std::vector<CreditCard*>& credit_cards,
728 RenderViewHost** host) const { 802 RenderViewHost** host) const {
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1006 // If none of the forms were parsed, no use querying the server. 1080 // If none of the forms were parsed, no use querying the server.
1007 if (!form_structures_.empty() && !disable_download_manager_requests_) 1081 if (!form_structures_.empty() && !disable_download_manager_requests_)
1008 download_manager_.StartQueryRequest(form_structures_, *metric_logger_); 1082 download_manager_.StartQueryRequest(form_structures_, *metric_logger_);
1009 1083
1010 for (std::vector<FormStructure*>::const_iterator iter = 1084 for (std::vector<FormStructure*>::const_iterator iter =
1011 non_queryable_forms.begin(); 1085 non_queryable_forms.begin();
1012 iter != non_queryable_forms.end(); ++iter) { 1086 iter != non_queryable_forms.end(); ++iter) {
1013 form_structures_.push_back(*iter); 1087 form_structures_.push_back(*iter);
1014 } 1088 }
1015 1089
1090 if (!form_structures_.empty())
1091 metric_logger_->LogUserHappinessMetric(AutofillMetrics::FORMS_LOADED);
1092
1016 CheckForPopularForms(form_structures_.get(), tab_contents_wrapper_, 1093 CheckForPopularForms(form_structures_.get(), tab_contents_wrapper_,
1017 tab_contents()); 1094 tab_contents());
1018 } 1095 }
1019 1096
1020 int AutofillManager::GUIDToID(const GUIDPair& guid) { 1097 int AutofillManager::GUIDToID(const GUIDPair& guid) {
1021 static int last_id = 1; 1098 static int last_id = 1;
1022 1099
1023 if (!guid::IsValidGUID(guid.first)) 1100 if (!guid::IsValidGUID(guid.first))
1024 return 0; 1101 return 0;
1025 1102
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 void AutofillManager::UnpackGUIDs(int id, 1143 void AutofillManager::UnpackGUIDs(int id,
1067 GUIDPair* cc_guid, 1144 GUIDPair* cc_guid,
1068 GUIDPair* profile_guid) { 1145 GUIDPair* profile_guid) {
1069 int cc_id = id >> std::numeric_limits<unsigned short>::digits & 1146 int cc_id = id >> std::numeric_limits<unsigned short>::digits &
1070 std::numeric_limits<unsigned short>::max(); 1147 std::numeric_limits<unsigned short>::max();
1071 int profile_id = id & std::numeric_limits<unsigned short>::max(); 1148 int profile_id = id & std::numeric_limits<unsigned short>::max();
1072 1149
1073 *cc_guid = IDToGUID(cc_id); 1150 *cc_guid = IDToGUID(cc_id);
1074 *profile_guid = IDToGUID(profile_id); 1151 *profile_guid = IDToGUID(profile_id);
1075 } 1152 }
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_manager.h ('k') | chrome/browser/autofill/autofill_metrics.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698