Commit ef2d25eb authored by erikchen's avatar erikchen Committed by Commit bot

mac: Add histograms to measure impact of Address Book integration.

BUG=488146

Review URL: https://codereview.chromium.org/1130773004

Cr-Commit-Position: refs/heads/master@{#330651}
parent e97185bf
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/metrics/field_trial.h" #include "base/metrics/field_trial.h"
#include "base/metrics/histogram_macros.h"
#include "base/prefs/pref_service.h" #include "base/prefs/pref_service.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
...@@ -622,6 +623,10 @@ void AutofillManager::FillOrPreviewForm( ...@@ -622,6 +623,10 @@ void AutofillManager::FillOrPreviewForm(
const FormData& form, const FormData& form,
const FormFieldData& field, const FormFieldData& field,
int unique_id) { int unique_id) {
#if defined(OS_MACOSX) && !defined(OS_IOS)
EmitIsFromAddressBookMetric(unique_id);
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
if (!IsValidFormData(form) || !IsValidFormFieldData(field)) if (!IsValidFormData(form) || !IsValidFormFieldData(field))
return; return;
...@@ -1579,4 +1584,20 @@ bool AutofillManager::ShouldUploadForm(const FormStructure& form) { ...@@ -1579,4 +1584,20 @@ bool AutofillManager::ShouldUploadForm(const FormStructure& form) {
return true; return true;
} }
#if defined(OS_MACOSX) && !defined(OS_IOS)
void AutofillManager::EmitIsFromAddressBookMetric(int unique_id) {
size_t variant = 0;
const AutofillProfile* profile = nullptr;
bool result = GetProfile(unique_id, &profile, &variant);
if (!result)
return;
bool is_from_address_book =
profile->record_type() == AutofillProfile::AUXILIARY_PROFILE;
UMA_HISTOGRAM_BOOLEAN(
"Autofill.MacAddressBook.AcceptedSuggestionIsFromAddressBook",
is_from_address_book);
}
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
} // namespace autofill } // namespace autofill
...@@ -363,6 +363,12 @@ class AutofillManager : public AutofillDownloadManager::Observer, ...@@ -363,6 +363,12 @@ class AutofillManager : public AutofillDownloadManager::Observer,
// Shared code to determine if |form| should be uploaded. // Shared code to determine if |form| should be uploaded.
bool ShouldUploadForm(const FormStructure& form); bool ShouldUploadForm(const FormStructure& form);
#if defined(OS_MACOSX) && !defined(OS_IOS)
// Emits a UMA metric indicating whether the accepted Autofill suggestion is
// from the Mac Address Book.
void EmitIsFromAddressBookMetric(int unique_id);
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
// Provides driver-level context to the shared code of the component. Must // Provides driver-level context to the shared code of the component. Must
// outlive this object. // outlive this object.
AutofillDriver* driver_; AutofillDriver* driver_;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "base/prefs/pref_service.h" #include "base/prefs/pref_service.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "base/time/time.h"
#include "components/autofill/core/browser/autofill_country.h" #include "components/autofill/core/browser/autofill_country.h"
#include "components/autofill/core/browser/autofill_profile.h" #include "components/autofill/core/browser/autofill_profile.h"
#include "components/autofill/core/browser/autofill_type.h" #include "components/autofill/core/browser/autofill_type.h"
...@@ -76,9 +77,38 @@ void RecordAccessSkipped(bool skipped) { ...@@ -76,9 +77,38 @@ void RecordAccessSkipped(bool skipped) {
UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBook.AccessSkipped", skipped); UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBook.AccessSkipped", skipped);
} }
// Emits a histogram indicating whether the Address Book contained a me-card.
void EmitAddressBookContainedMeCard(bool containedMeCard) {
UMA_HISTOGRAM_BOOLEAN("Autofill.MacAddressBook.ContainedMeCard",
containedMeCard);
}
// Emits a histogram indicating whether the me-card had a name.
void EmitMeCardHadName(bool hadName) {
UMA_HISTOGRAM_BOOLEAN("Autofill.MacAddressBook.MeCard.HadName", hadName);
}
// Emits a histogram indicating whether the me-card had an address.
void EmitMeCardHadAddress(bool hadAddress) {
UMA_HISTOGRAM_BOOLEAN("Autofill.MacAddressBook.MeCard.HadAddress",
hadAddress);
}
// Emits a histogram indicating whether the me-card had an email.
void EmitMeCardHadEmail(bool hadEmail) {
UMA_HISTOGRAM_BOOLEAN("Autofill.MacAddressBook.MeCard.HadEmail", hadEmail);
}
// Emits a histogram indicating whether the me-card had a phone number.
void EmitMeCardHadPhoneNumber(bool hadPhoneNumber) {
UMA_HISTOGRAM_BOOLEAN("Autofill.MacAddressBook.MeCard.HadPhoneNumber",
hadPhoneNumber);
}
ABAddressBook* GetAddressBook(PrefService* pref_service) { ABAddressBook* GetAddressBook(PrefService* pref_service) {
bool first_access = !HasQueriedMacAddressBook(pref_service); bool first_access = !HasQueriedMacAddressBook(pref_service);
base::Time start_time = base::Time::Now();
// +[ABAddressBook sharedAddressBook] throws an exception internally in // +[ABAddressBook sharedAddressBook] throws an exception internally in
// circumstances that aren't clear. The exceptions are only observed in crash // 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 // reports, so it is unknown whether they would be caught by AppKit and nil
...@@ -88,6 +118,13 @@ ABAddressBook* GetAddressBook(PrefService* pref_service) { ...@@ -88,6 +118,13 @@ ABAddressBook* GetAddressBook(PrefService* pref_service) {
^{ return [ABAddressBook sharedAddressBook]; }); ^{ return [ABAddressBook sharedAddressBook]; });
UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailable", addressBook != nil); UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailable", addressBook != nil);
if (!g_accessed_address_book) {
// The amount of time that the access takes gives a good indication as to
// whether the user was shown a prompt.
UMA_HISTOGRAM_TIMES("Autofill.MacAddressBook.AccessTime",
base::Time::Now() - start_time);
}
if (first_access) { if (first_access) {
UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailableOnFirstAttempt", UMA_HISTOGRAM_BOOLEAN("Autofill.AddressBookAvailableOnFirstAttempt",
addressBook != nil); addressBook != nil);
...@@ -121,16 +158,16 @@ class AuxiliaryProfilesImpl { ...@@ -121,16 +158,16 @@ class AuxiliaryProfilesImpl {
bool record_metrics); bool record_metrics);
private: private:
void GetAddressBookNames(ABPerson* me, bool GetAddressBookNames(ABPerson* me,
NSString* addressLabelRaw, NSString* addressLabelRaw,
AutofillProfile* profile); AutofillProfile* profile);
void GetAddressBookAddress(const std::string& app_locale, bool GetAddressBookAddress(const std::string& app_locale,
NSDictionary* address, NSDictionary* address,
AutofillProfile* profile); AutofillProfile* profile);
void GetAddressBookEmail(ABPerson* me, bool GetAddressBookEmail(ABPerson* me,
NSString* addressLabelRaw, NSString* addressLabelRaw,
AutofillProfile* profile); AutofillProfile* profile);
void GetAddressBookPhoneNumbers(ABPerson* me, bool GetAddressBookPhoneNumbers(ABPerson* me,
NSString* addressLabelRaw, NSString* addressLabelRaw,
AutofillProfile* profile); AutofillProfile* profile);
...@@ -169,9 +206,12 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale, ...@@ -169,9 +206,12 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale,
ABAddressBook* addressBook = GetAddressBook(pref_service); ABAddressBook* addressBook = GetAddressBook(pref_service);
ABPerson* me = [addressBook me]; ABPerson* me = [addressBook me];
if (!me) if (!me) {
EmitAddressBookContainedMeCard(false);
return; return;
}
EmitAddressBookContainedMeCard(true);
ABMultiValue* addresses = [me valueForProperty:kABAddressProperty]; ABMultiValue* addresses = [me valueForProperty:kABAddressProperty];
// The number of characters at the end of the GUID to reserve for // The number of characters at the end of the GUID to reserve for
...@@ -182,6 +222,11 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale, ...@@ -182,6 +222,11 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale,
const size_t kNumHexDigits = 16; const size_t kNumHexDigits = 16;
const size_t kMaxAddressCount = pow(kNumHexDigits, kNumAddressGUIDChars); const size_t kMaxAddressCount = pow(kNumHexDigits, kNumAddressGUIDChars);
NSUInteger count = MIN([addresses count], kMaxAddressCount); NSUInteger count = MIN([addresses count], kMaxAddressCount);
bool hasName = false;
bool hasEmail = false;
bool hasAddress = false;
bool hasPhoneNumber = false;
for (NSUInteger i = 0; i < count; i++) { for (NSUInteger i = 0; i < count; i++) {
NSDictionary* address = [addresses valueAtIndex:i]; NSDictionary* address = [addresses valueAtIndex:i];
NSString* addressLabelRaw = [addresses labelAtIndex:i]; NSString* addressLabelRaw = [addresses labelAtIndex:i];
...@@ -211,28 +256,34 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale, ...@@ -211,28 +256,34 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard(const std::string& app_locale,
DCHECK(base::IsValidGUID(profile->guid())); DCHECK(base::IsValidGUID(profile->guid()));
// Fill in name and company information. // Fill in name and company information.
GetAddressBookNames(me, addressLabelRaw, profile.get()); hasName |= GetAddressBookNames(me, addressLabelRaw, profile.get());
// Fill in address information. // Fill in address information.
GetAddressBookAddress(app_locale, address, profile.get()); hasEmail |= GetAddressBookAddress(app_locale, address, profile.get());
// Fill in email information. // Fill in email information.
GetAddressBookEmail(me, addressLabelRaw, profile.get()); hasAddress |= GetAddressBookEmail(me, addressLabelRaw, profile.get());
// Fill in phone number information. // Fill in phone number information.
GetAddressBookPhoneNumbers(me, addressLabelRaw, profile.get()); hasPhoneNumber |=
GetAddressBookPhoneNumbers(me, addressLabelRaw, profile.get());
profiles_.push_back(profile.release()); profiles_.push_back(profile.release());
} }
EmitMeCardHadName(hasName);
EmitMeCardHadEmail(hasEmail);
EmitMeCardHadAddress(hasAddress);
EmitMeCardHadPhoneNumber(hasPhoneNumber);
} }
// Name and company information is stored once in the Address Book against // Name and company information is stored once in the Address Book against
// multiple addresses. We replicate that information for each profile. // multiple addresses. We replicate that information for each profile.
// We only propagate the company name to work profiles. // We only propagate the company name to work profiles.
void AuxiliaryProfilesImpl::GetAddressBookNames( // Returns whether |me| contains any name information.
ABPerson* me, bool AuxiliaryProfilesImpl::GetAddressBookNames(ABPerson* me,
NSString* addressLabelRaw, NSString* addressLabelRaw,
AutofillProfile* profile) { AutofillProfile* profile) {
NSString* firstName = [me valueForProperty:kABFirstNameProperty]; NSString* firstName = [me valueForProperty:kABFirstNameProperty];
NSString* middleName = [me valueForProperty:kABMiddleNameProperty]; NSString* middleName = [me valueForProperty:kABMiddleNameProperty];
NSString* lastName = [me valueForProperty:kABLastNameProperty]; NSString* lastName = [me valueForProperty:kABLastNameProperty];
...@@ -243,6 +294,9 @@ void AuxiliaryProfilesImpl::GetAddressBookNames( ...@@ -243,6 +294,9 @@ void AuxiliaryProfilesImpl::GetAddressBookNames(
profile->SetRawInfo(NAME_LAST, base::SysNSStringToUTF16(lastName)); profile->SetRawInfo(NAME_LAST, base::SysNSStringToUTF16(lastName));
if ([addressLabelRaw isEqualToString:kABAddressWorkLabel]) if ([addressLabelRaw isEqualToString:kABAddressWorkLabel])
profile->SetRawInfo(COMPANY_NAME, base::SysNSStringToUTF16(companyName)); profile->SetRawInfo(COMPANY_NAME, base::SysNSStringToUTF16(companyName));
return [firstName length] > 0 || [middleName length] > 0 ||
[lastName length] > 0;
} }
// Addresss information from the Address Book may span multiple lines. // Addresss information from the Address Book may span multiple lines.
...@@ -250,10 +304,15 @@ void AuxiliaryProfilesImpl::GetAddressBookNames( ...@@ -250,10 +304,15 @@ void AuxiliaryProfilesImpl::GetAddressBookNames(
// second line we join with commas. // second line we join with commas.
// For example: "c/o John Doe\n1122 Other Avenue\nApt #7" translates to // For example: "c/o John Doe\n1122 Other Avenue\nApt #7" translates to
// line 1: "c/o John Doe", line 2: "1122 Other Avenue, Apt #7". // line 1: "c/o John Doe", line 2: "1122 Other Avenue, Apt #7".
void AuxiliaryProfilesImpl::GetAddressBookAddress(const std::string& app_locale, // Returns whether |address| contains a complete address.
bool AuxiliaryProfilesImpl::GetAddressBookAddress(const std::string& app_locale,
NSDictionary* address, NSDictionary* address,
AutofillProfile* profile) { AutofillProfile* profile) {
bool hasStreetAddress = false;
bool hasCityOrZip = false;
if (NSString* addressField = [address objectForKey:kABAddressStreetKey]) { if (NSString* addressField = [address objectForKey:kABAddressStreetKey]) {
hasStreetAddress |= [addressField length] > 0;
// If there are newlines in the address, split into two lines. // If there are newlines in the address, split into two lines.
if ([addressField rangeOfCharacterFromSet: if ([addressField rangeOfCharacterFromSet:
[NSCharacterSet newlineCharacterSet]].location != NSNotFound) { [NSCharacterSet newlineCharacterSet]].location != NSNotFound) {
...@@ -278,29 +337,34 @@ void AuxiliaryProfilesImpl::GetAddressBookAddress(const std::string& app_locale, ...@@ -278,29 +337,34 @@ void AuxiliaryProfilesImpl::GetAddressBookAddress(const std::string& app_locale,
} }
} }
if (NSString* city = [address objectForKey:kABAddressCityKey]) if (NSString* city = [address objectForKey:kABAddressCityKey]) {
hasCityOrZip |= [city length] > 0;
profile->SetRawInfo(ADDRESS_HOME_CITY, base::SysNSStringToUTF16(city)); profile->SetRawInfo(ADDRESS_HOME_CITY, base::SysNSStringToUTF16(city));
}
if (NSString* state = [address objectForKey:kABAddressStateKey]) if (NSString* state = [address objectForKey:kABAddressStateKey])
profile->SetRawInfo(ADDRESS_HOME_STATE, base::SysNSStringToUTF16(state)); profile->SetRawInfo(ADDRESS_HOME_STATE, base::SysNSStringToUTF16(state));
if (NSString* zip = [address objectForKey:kABAddressZIPKey]) if (NSString* zip = [address objectForKey:kABAddressZIPKey]) {
hasCityOrZip |= [zip length] > 0;
profile->SetRawInfo(ADDRESS_HOME_ZIP, base::SysNSStringToUTF16(zip)); profile->SetRawInfo(ADDRESS_HOME_ZIP, base::SysNSStringToUTF16(zip));
}
if (NSString* country = [address objectForKey:kABAddressCountryKey]) { if (NSString* country = [address objectForKey:kABAddressCountryKey])
profile->SetInfo(AutofillType(ADDRESS_HOME_COUNTRY), profile->SetInfo(AutofillType(ADDRESS_HOME_COUNTRY),
base::SysNSStringToUTF16(country), base::SysNSStringToUTF16(country),
app_locale); app_locale);
}
return hasStreetAddress && hasCityOrZip;
} }
// Fills in email address matching current address label. Note that there may // Fills in email address matching current address label. Note that there may
// be multiple matching email addresses for a given label. We take the // be multiple matching email addresses for a given label. We take the
// first we find (topmost) as preferred. // first we find (topmost) as preferred.
void AuxiliaryProfilesImpl::GetAddressBookEmail( // Returns whether |me| contains an email.
ABPerson* me, bool AuxiliaryProfilesImpl::GetAddressBookEmail(ABPerson* me,
NSString* addressLabelRaw, NSString* addressLabelRaw,
AutofillProfile* profile) { AutofillProfile* profile) {
ABMultiValue* emailAddresses = [me valueForProperty:kABEmailProperty]; ABMultiValue* emailAddresses = [me valueForProperty:kABEmailProperty];
NSString* emailAddress = nil; NSString* emailAddress = nil;
for (NSUInteger j = 0, emailCount = [emailAddresses count]; for (NSUInteger j = 0, emailCount = [emailAddresses count];
...@@ -312,16 +376,19 @@ void AuxiliaryProfilesImpl::GetAddressBookEmail( ...@@ -312,16 +376,19 @@ void AuxiliaryProfilesImpl::GetAddressBookEmail(
} }
} }
profile->SetRawInfo(EMAIL_ADDRESS, base::SysNSStringToUTF16(emailAddress)); profile->SetRawInfo(EMAIL_ADDRESS, base::SysNSStringToUTF16(emailAddress));
return [emailAddress length] > 0;
} }
// Fills in telephone numbers. Each of these are special cases. // Fills in telephone numbers. Each of these are special cases.
// We match two cases: home/tel, work/tel. // We match two cases: home/tel, work/tel.
// Note, we traverse in reverse order so that top values in address book // Note, we traverse in reverse order so that top values in address book
// take priority. // take priority.
void AuxiliaryProfilesImpl::GetAddressBookPhoneNumbers( // Returns whether |me| contains a phone number.
bool AuxiliaryProfilesImpl::GetAddressBookPhoneNumbers(
ABPerson* me, ABPerson* me,
NSString* addressLabelRaw, NSString* addressLabelRaw,
AutofillProfile* profile) { AutofillProfile* profile) {
bool hasPhoneNumber = false;
ABMultiValue* phoneNumbers = [me valueForProperty:kABPhoneProperty]; ABMultiValue* phoneNumbers = [me valueForProperty:kABPhoneProperty];
for (NSUInteger k = 0, phoneCount = [phoneNumbers count]; for (NSUInteger k = 0, phoneCount = [phoneNumbers count];
k < phoneCount; k++) { k < phoneCount; k++) {
...@@ -332,18 +399,22 @@ void AuxiliaryProfilesImpl::GetAddressBookPhoneNumbers( ...@@ -332,18 +399,22 @@ void AuxiliaryProfilesImpl::GetAddressBookPhoneNumbers(
base::string16 homePhone = base::SysNSStringToUTF16( base::string16 homePhone = base::SysNSStringToUTF16(
[phoneNumbers valueAtIndex:reverseK]); [phoneNumbers valueAtIndex:reverseK]);
profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, homePhone); profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, homePhone);
hasPhoneNumber |= !homePhone.empty();
} else if ([addressLabelRaw isEqualToString:kABAddressWorkLabel] && } else if ([addressLabelRaw isEqualToString:kABAddressWorkLabel] &&
[phoneLabelRaw isEqualToString:kABPhoneWorkLabel]) { [phoneLabelRaw isEqualToString:kABPhoneWorkLabel]) {
base::string16 workPhone = base::SysNSStringToUTF16( base::string16 workPhone = base::SysNSStringToUTF16(
[phoneNumbers valueAtIndex:reverseK]); [phoneNumbers valueAtIndex:reverseK]);
profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, workPhone); profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, workPhone);
hasPhoneNumber |= !workPhone.empty();
} else if ([phoneLabelRaw isEqualToString:kABPhoneMobileLabel] || } else if ([phoneLabelRaw isEqualToString:kABPhoneMobileLabel] ||
[phoneLabelRaw isEqualToString:kABPhoneMainLabel]) { [phoneLabelRaw isEqualToString:kABPhoneMainLabel]) {
base::string16 phone = base::SysNSStringToUTF16( base::string16 phone = base::SysNSStringToUTF16(
[phoneNumbers valueAtIndex:reverseK]); [phoneNumbers valueAtIndex:reverseK]);
profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, phone); profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, phone);
hasPhoneNumber |= !phone.empty();
} }
} }
return hasPhoneNumber;
} }
} // namespace } // namespace
......
...@@ -2037,6 +2037,69 @@ Therefore, the affected-histogram name has to have at least one dot in it. ...@@ -2037,6 +2037,69 @@ Therefore, the affected-histogram name has to have at least one dot in it.
</summary> </summary>
</histogram> </histogram>
<histogram name="Autofill.MacAddressBook.AcceptedSuggestionIsFromAddressBook"
enum="BooleanFromAddressBook">
<owner>erikchen@chromium.org</owner>
<summary>
This metric is emitted each time the user accepts an Autofill suggestion. It
records whether the result is from the Address Book.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.AccessTime" units="ms">
<owner>erikchen@chromium.org</owner>
<summary>
The amount of time spent accessing the OSX Address Book the first time after
Chrome was launched. If this time is larger than ~100ms, this it is likely
that the user was shown a blocking, modal dialog.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.ContainedMeCard"
enum="BooleanContainedMeCard">
<owner>erikchen@chromium.org</owner>
<summary>
After a Chrome is given access to the Mac Address Book, whether the Address
Book contained a Me card.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.MeCard.HadAddress"
enum="BooleanHadAddress">
<owner>erikchen@chromium.org</owner>
<summary>
When Chrome is given access to the Me Card of the Address Book, whether the
card has an address that contained a street number and either a city or zip
code.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.MeCard.HadEmail"
enum="BooleanHadEmail">
<owner>erikchen@chromium.org</owner>
<summary>
When Chrome is given access to the Me Card of the Address Book, whether the
card has an email.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.MeCard.HadName" enum="BooleanHadName">
<owner>erikchen@chromium.org</owner>
<summary>
When Chrome is given access to the Me Card of the Address Book, whether the
card has a name.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.MeCard.HadPhoneNumber"
enum="BooleanHadPhoneNumber">
<owner>erikchen@chromium.org</owner>
<summary>
When Chrome is given access to the Me Card of the Address Book, whether the
card has a phone number.
</summary>
</histogram>
<histogram name="Autofill.MacAddressBook.NumShowsBeforeSelected"> <histogram name="Autofill.MacAddressBook.NumShowsBeforeSelected">
<owner>erikchen@chromium.org</owner> <owner>erikchen@chromium.org</owner>
<summary> <summary>
...@@ -48253,6 +48316,11 @@ Therefore, the affected-histogram name has to have at least one dot in it. ...@@ -48253,6 +48316,11 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<int value="1" label="Completed"/> <int value="1" label="Completed"/>
</enum> </enum>
<enum name="BooleanContainedMeCard" type="int">
<int value="0" label="Did not contain me card."/>
<int value="1" label="Contained me card."/>
</enum>
<enum name="BooleanCorrupt" type="int"> <enum name="BooleanCorrupt" type="int">
<int value="0" label="Not Corrupt"/> <int value="0" label="Not Corrupt"/>
<int value="1" label="Corrupt"/> <int value="1" label="Corrupt"/>
...@@ -48328,16 +48396,41 @@ Therefore, the affected-histogram name has to have at least one dot in it. ...@@ -48328,16 +48396,41 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<int value="1" label="Force Disabled"/> <int value="1" label="Force Disabled"/>
</enum> </enum>
<enum name="BooleanFromAddressBook" type="int">
<int value="0" label="Not From Address Book"/>
<int value="1" label="From Address Book"/>
</enum>
<enum name="BooleanGAIAWebViewFlow" type="int"> <enum name="BooleanGAIAWebViewFlow" type="int">
<int value="0" label="iframe-based flow"/> <int value="0" label="iframe-based flow"/>
<int value="1" label="WebView-based flow"/> <int value="1" label="WebView-based flow"/>
</enum> </enum>
<enum name="BooleanHadAddress" type="int">
<int value="0" label="Did not have address."/>
<int value="1" label="Had address."/>
</enum>
<enum name="BooleanHadBlankText" type="int"> <enum name="BooleanHadBlankText" type="int">
<int value="0" label="Did not have blank text"/> <int value="0" label="Did not have blank text"/>
<int value="1" label="Had blank text"/> <int value="1" label="Had blank text"/>
</enum> </enum>
<enum name="BooleanHadEmail" type="int">
<int value="0" label="Did not have email."/>
<int value="1" label="Had email."/>
</enum>
<enum name="BooleanHadName" type="int">
<int value="0" label="Did not have name."/>
<int value="1" label="Had name."/>
</enum>
<enum name="BooleanHadPhoneNumber" type="int">
<int value="0" label="Did not have phone number."/>
<int value="1" label="Had phone number."/>
</enum>
<enum name="BooleanHandshakeConfirmed" type="int"> <enum name="BooleanHandshakeConfirmed" type="int">
<int value="0" label="Handshake not confirmed"/> <int value="0" label="Handshake not confirmed"/>
<int value="1" label="Handshake confirmed"/> <int value="1" label="Handshake confirmed"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment