| Index: components/autofill/core/browser/personal_data_manager_mac.mm
|
| diff --git a/components/autofill/core/browser/personal_data_manager_mac.mm b/components/autofill/core/browser/personal_data_manager_mac.mm
|
| index 8cae978ac4549911e691aacc3eac7b4dad3c29fc..2be22fca949233856cad780c6f9aa4a3b575c3b0 100644
|
| --- a/components/autofill/core/browser/personal_data_manager_mac.mm
|
| +++ b/components/autofill/core/browser/personal_data_manager_mac.mm
|
| @@ -21,8 +21,10 @@
|
| #include "components/autofill/core/browser/autofill_country.h"
|
| #include "components/autofill/core/browser/autofill_profile.h"
|
| #include "components/autofill/core/browser/autofill_type.h"
|
| +#include "components/autofill/core/browser/form_structure.h"
|
| #include "components/autofill/core/browser/phone_number.h"
|
| #include "components/autofill/core/common/autofill_pref_names.h"
|
| +#include "components/autofill/core/common/form_data.h"
|
| #include "grit/components_strings.h"
|
| #include "ui/base/l10n/l10n_util_mac.h"
|
|
|
| @@ -31,6 +33,39 @@ namespace {
|
|
|
| const char kAddressBookOrigin[] = "OS X Address Book";
|
|
|
| +// Whether Chrome has prompted the user for permission to access the user's
|
| +// address book.
|
| +bool HasPromptedForAccessToAddressBook(PrefService* pref_service) {
|
| + return pref_service->GetBoolean(prefs::kAutofillMacAddressBookQueried);
|
| +}
|
| +
|
| +// Whether the user wants Chrome to use the AddressBook to populate Autofill
|
| +// entries.
|
| +bool ShouldUseAddressBook(PrefService* pref_service) {
|
| + return pref_service->GetBoolean(prefs::kAutofillUseMacAddressBook);
|
| +}
|
| +
|
| +ABAddressBook* GetAddressBook(PrefService* pref_service) {
|
| + bool first_access = !HasPromptedForAccessToAddressBook(pref_service);
|
| +
|
| + // +[ABAddressBook sharedAddressBook] throws an exception internally in
|
| + // circumstances that aren't clear. The exceptions are only observed in crash
|
| + // reports, so it is unknown whether they would be caught by AppKit and nil
|
| + // returned, or if they would take down the app. In either case, avoid
|
| + // crashing. http://crbug.com/129022
|
| + ABAddressBook* addressBook = base::mac::RunBlockIgnoringExceptions(
|
| + ^{ return [ABAddressBook sharedAddressBook]; });
|
| + UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailable", addressBook != nil);
|
| +
|
| + if (first_access) {
|
| + UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailableOnFirstAttempt",
|
| + addressBook != nil);
|
| + }
|
| +
|
| + pref_service->SetBoolean(prefs::kAutofillMacAddressBookQueried, true);
|
| + return addressBook;
|
| +}
|
| +
|
| // This implementation makes use of the Address Book API. Profiles are
|
| // generated that correspond to addresses in the "me" card that reside in the
|
| // user's Address Book. The caller passes a vector of profiles into the
|
| @@ -81,20 +116,12 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale,
|
| PrefService* pref_service) {
|
| profiles_.clear();
|
|
|
| - // +[ABAddressBook sharedAddressBook] throws an exception internally in
|
| - // circumstances that aren't clear. The exceptions are only observed in crash
|
| - // reports, so it is unknown whether they would be caught by AppKit and nil
|
| - // returned, or if they would take down the app. In either case, avoid
|
| - // crashing. http://crbug.com/129022
|
| - ABAddressBook* addressBook = base::mac::RunBlockIgnoringExceptions(^{
|
| - return [ABAddressBook sharedAddressBook];
|
| - });
|
| - UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailable", addressBook != nil);
|
| - if (!pref_service->GetBoolean(prefs::kAutofillAuxiliaryProfilesQueried)) {
|
| - pref_service->SetBoolean(prefs::kAutofillAuxiliaryProfilesQueried, true);
|
| - UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailableOnFirstAttempt",
|
| - addressBook != nil);
|
| - }
|
| + // The user does not want Chrome to use the AddressBook to populate Autofill
|
| + // entries.
|
| + if (!ShouldUseAddressBook(pref_service))
|
| + return;
|
| +
|
| + ABAddressBook* addressBook = GetAddressBook(pref_service);
|
|
|
| ABPerson* me = [addressBook me];
|
| if (!me)
|
| @@ -281,4 +308,39 @@ void PersonalDataManager::LoadAuxiliaryProfiles() const {
|
| impl.GetAddressBookMeCard(app_locale_, pref_service_);
|
| }
|
|
|
| +bool PersonalDataManager::AccessAddressBook() {
|
| + // The user is attempting to give Chrome access to the user's Address Book.
|
| + // This implicitly acknowledges that the user wants to use auxiliary
|
| + // profiles.
|
| + pref_service_->SetBoolean(prefs::kAutofillUseMacAddressBook, true);
|
| +
|
| + // Request permissions.
|
| + GetAddressBook(pref_service_);
|
| + return true;
|
| +}
|
| +
|
| +bool PersonalDataManager::ShouldShowAccessAddressBookSuggestion(
|
| + AutofillType type) {
|
| + if (HasPromptedForAccessToAddressBook(pref_service_))
|
| + return false;
|
| +
|
| + switch (type.group()) {
|
| + case ADDRESS_BILLING:
|
| + case ADDRESS_HOME:
|
| + case EMAIL:
|
| + case NAME:
|
| + case NAME_BILLING:
|
| + case PHONE_BILLING:
|
| + case PHONE_HOME:
|
| + return true;
|
| + case NO_GROUP:
|
| + case COMPANY:
|
| + case CREDIT_CARD:
|
| + case PASSWORD_FIELD:
|
| + return false;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| } // namespace autofill
|
|
|