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

Unified Diff: ios/chrome/browser/ui/activity_services/activity_type_util.mm

Issue 2823883002: List Password Manager extensions in a static data structure (Closed)
Patch Set: add PasswordManagerExtensions.plist Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/ui/activity_services/activity_type_util.mm
diff --git a/ios/chrome/browser/ui/activity_services/activity_type_util.mm b/ios/chrome/browser/ui/activity_services/activity_type_util.mm
index 8a8378ef3f7e8d98f24e62d4a1183afd1d46f52f..2ea4ef815836dcb2a6b60e237e70676ad95c9f0b 100644
--- a/ios/chrome/browser/ui/activity_services/activity_type_util.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_type_util.mm
@@ -17,13 +17,46 @@
#endif
namespace {
+
// A substring to identify activity strings that are from Password Management
// App Extensions. This string is intentionally without the leading and
// trailing "." so it can be used as a prefix, suffix, or substring of the
// App Extension's bundle ID.
NSString* const kFindLoginActionBundleSubstring = @"find-login-action";
+
+// Returns whether |activityString| refers to a supported Password Management
+// App Extension. Supported extensions are listed in
+// PasswordManagerExtensions.plist as an array of dictionaries. Each
+// dictionary entry contains the following key-value pairs:
+// App: Name of app
+// BundleId: Full or leading substring of Password Manager extension bundle ID
+// ExactMatch: Boolean value of whether BundleId requires exact match
+bool IsPasswordManagerActivity(NSString* activityString) {
+ static NSArray<NSDictionary*>* allPasswordManagerApps;
+ static dispatch_once_t once;
+ dispatch_once(&once, ^{
+ NSString* path =
+ [[NSBundle mainBundle] pathForResource:@"PasswordManagerExtensions"
+ ofType:@"plist"];
+ allPasswordManagerApps = [NSArray arrayWithContentsOfFile:path];
+ });
+
+ for (NSDictionary* app in allPasswordManagerApps) {
+ NSString* bundleId = app[@"BundleId"];
+ BOOL requestsExactMatch = [app[@"ExactMatch"] boolValue];
+ if (requestsExactMatch) {
+ if ([activityString isEqualToString:bundleId])
+ return true;
+ } else {
+ if ([activityString hasPrefix:bundleId])
+ return true;
+ }
+ }
+ return false;
}
+} // namespace
+
namespace activity_type_util {
struct PrefixTypeAssociation {
@@ -60,13 +93,7 @@ const PrefixTypeAssociation prefixTypeAssociations[] = {
{THIRD_PARTY_PINTEREST, @"pinterest.", false},
{THIRD_PARTY_POCKET, @"com.ideashower.ReadItLaterPro.", false},
{THIRD_PARTY_READABILITY, @"com.readability.ReadabilityMobile.", false},
- {THIRD_PARTY_INSTAPAPER, @"com.marcoarment.instapaperpro.", false},
- {APPEX_PASSWORD_MANAGEMENT_1PASSWORD,
- activity_services::kAppExtensionOnePassword, true},
- {APPEX_PASSWORD_MANAGEMENT_LASTPASS,
- activity_services::kAppExtensionLastPass, true},
- {APPEX_PASSWORD_MANAGEMENT_DASHLANE,
- activity_services::kAppExtensionDashlanePrefix, false}};
+ {THIRD_PARTY_INSTAPAPER, @"com.marcoarment.instapaperpro.", false}};
ActivityType TypeFromString(NSString* activityString) {
DCHECK(activityString);
@@ -75,7 +102,7 @@ ActivityType TypeFromString(NSString* activityString) {
NSRange found =
[activityString rangeOfString:kFindLoginActionBundleSubstring];
if (found.length)
- return APPEX_PASSWORD_MANAGEMENT_OTHERS;
+ return APPEX_PASSWORD_MANAGEMENT;
for (auto const& assocation : prefixTypeAssociations) {
if (assocation.requiresExactMatch_) {
if ([activityString isEqualToString:assocation.prefix_])
@@ -85,15 +112,15 @@ ActivityType TypeFromString(NSString* activityString) {
return assocation.type_;
}
}
+ if (IsPasswordManagerActivity(activityString)) {
+ return APPEX_PASSWORD_MANAGEMENT;
+ }
return UNKNOWN;
}
NSNumber* PasswordAppExActivityVersion(NSString* activityString) {
switch (TypeFromString(activityString)) {
- case APPEX_PASSWORD_MANAGEMENT_1PASSWORD:
- case APPEX_PASSWORD_MANAGEMENT_LASTPASS:
- case APPEX_PASSWORD_MANAGEMENT_DASHLANE:
- case APPEX_PASSWORD_MANAGEMENT_OTHERS:
+ case APPEX_PASSWORD_MANAGEMENT:
return activity_services::kPasswordAppExVersionNumber;
default:
return nil;
@@ -111,10 +138,7 @@ NSString* CompletionMessageForActivity(ActivityType type) {
switch (type) {
case NATIVE_CLIPBOARD:
return l10n_util::GetNSString(IDS_IOS_SHARE_TO_CLIPBOARD_SUCCESS);
- case APPEX_PASSWORD_MANAGEMENT_1PASSWORD:
- case APPEX_PASSWORD_MANAGEMENT_LASTPASS:
- case APPEX_PASSWORD_MANAGEMENT_DASHLANE:
- case APPEX_PASSWORD_MANAGEMENT_OTHERS:
+ case APPEX_PASSWORD_MANAGEMENT:
return l10n_util::GetNSString(IDS_IOS_APPEX_PASSWORD_FORM_FILLED_SUCCESS);
default:
return nil;
@@ -182,10 +206,7 @@ void RecordMetricForActivity(ActivityType type) {
base::RecordAction(
base::UserMetricsAction("MobileShareMenuToContentApp"));
break;
- case APPEX_PASSWORD_MANAGEMENT_1PASSWORD:
- case APPEX_PASSWORD_MANAGEMENT_LASTPASS:
- case APPEX_PASSWORD_MANAGEMENT_DASHLANE:
- case APPEX_PASSWORD_MANAGEMENT_OTHERS:
+ case APPEX_PASSWORD_MANAGEMENT:
base::RecordAction(
base::UserMetricsAction("MobileAppExFormFilledByPasswordManager"));
break;

Powered by Google App Engine
This is Rietveld 408576698