Index: chrome/browser/permissions/permission_decision_auto_blocker.cc |
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker.cc b/chrome/browser/permissions/permission_decision_auto_blocker.cc |
index a41d4ba59e1b39117fbbc976e00d49bc2ba6dabd..d3c11bab6f06ed277ec8e57a8e01253bc11aabe5 100644 |
--- a/chrome/browser/permissions/permission_decision_auto_blocker.cc |
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.cc |
@@ -29,16 +29,24 @@ namespace { |
// The number of times that users may explicitly dismiss a permission prompt |
// from an origin before it is automatically blocked. |
-int g_prompt_dismissals_before_block = 3; |
+int g_dismissals_before_block = 3; |
-// The number of days that an origin will stay under embargo for a requested |
-// permission due to blacklisting. |
-int g_blacklist_embargo_days = 7; |
+// The number of times that users may ignore a permission prompt from an origin |
+// before it is automatically blocked. |
+int g_ignores_before_block = 4; |
// The number of days that an origin will stay under embargo for a requested |
// permission due to repeated dismissals. |
int g_dismissal_embargo_days = 7; |
+// The number of days that an origin will stay under embargo for a requested |
+// permission due to repeated ignores. |
+int g_ignore_embargo_days = 7; |
+ |
+// The number of days that an origin will stay under embargo for a requested |
+// permission due to blacklisting. |
+int g_blacklist_embargo_days = 7; |
+ |
// Maximum time in milliseconds to wait for safe browsing service to check a |
// url for blacklisting. After this amount of time, the check will be aborted |
// and the url will be treated as not safe. |
@@ -109,6 +117,22 @@ int GetActionCount(const GURL& url, |
return current_count; |
} |
+bool IsUnderEmbargo(base::DictionaryValue* permission_dict, |
+ const base::Feature& feature, |
+ const char* key, |
+ base::Time current_time, |
+ base::TimeDelta offset) { |
+ double embargo_date = -1; |
+ |
+ if (base::FeatureList::IsEnabled(feature) && |
+ permission_dict->GetDouble(key, &embargo_date)) { |
+ if (current_time < base::Time::FromInternalValue(embargo_date) + offset) |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
} // namespace |
// PermissionDecisionAutoBlocker::Factory -------------------------------------- |
@@ -156,14 +180,18 @@ const char PermissionDecisionAutoBlocker::kPromptIgnoreCountKey[] = |
"ignore_count"; |
// static |
-const char PermissionDecisionAutoBlocker::kPermissionBlacklistEmbargoKey[] = |
- "blacklisting_embargo_days"; |
- |
-// static |
const char PermissionDecisionAutoBlocker::kPermissionDismissalEmbargoKey[] = |
"dismissal_embargo_days"; |
// static |
+const char PermissionDecisionAutoBlocker::kPermissionIgnoreEmbargoKey[] = |
+ "ignore_embargo_days"; |
+ |
+// static |
+const char PermissionDecisionAutoBlocker::kPermissionBlacklistEmbargoKey[] = |
+ "blacklisting_embargo_days"; |
+ |
+// static |
PermissionDecisionAutoBlocker* PermissionDecisionAutoBlocker::GetForProfile( |
Profile* profile) { |
return PermissionDecisionAutoBlocker::Factory::GetForProfile(profile); |
@@ -171,31 +199,53 @@ PermissionDecisionAutoBlocker* PermissionDecisionAutoBlocker::GetForProfile( |
// static |
void PermissionDecisionAutoBlocker::UpdateFromVariations() { |
- int prompt_dismissals = -1; |
- int blacklist_embargo_days = -1; |
+ int dismissals_before_block = -1; |
+ int ignores_before_block = -1; |
int dismissal_embargo_days = -1; |
- std::string dismissals_value = variations::GetVariationParamValueByFeature( |
- features::kBlockPromptsIfDismissedOften, kPromptDismissCountKey); |
- std::string blacklist_embargo_value = |
+ int ignore_embargo_days = -1; |
+ int blacklist_embargo_days = -1; |
+ |
+ std::string dismissals_before_block_value = |
variations::GetVariationParamValueByFeature( |
- features::kPermissionsBlacklist, kPermissionBlacklistEmbargoKey); |
- std::string dismissal_embargo_value = |
+ features::kBlockPromptsIfDismissedOften, kPromptDismissCountKey); |
+ std::string ignores_before_block_value = |
+ variations::GetVariationParamValueByFeature( |
+ features::kBlockPromptsIfIgnoredOften, kPromptIgnoreCountKey); |
+ std::string dismissal_embargo_days_value = |
variations::GetVariationParamValueByFeature( |
features::kBlockPromptsIfDismissedOften, |
kPermissionDismissalEmbargoKey); |
+ std::string ignore_embargo_days_value = |
+ variations::GetVariationParamValueByFeature( |
+ features::kBlockPromptsIfIgnoredOften, kPermissionIgnoreEmbargoKey); |
+ std::string blacklist_embargo_days_value = |
+ variations::GetVariationParamValueByFeature( |
+ features::kPermissionsBlacklist, kPermissionBlacklistEmbargoKey); |
+ |
// If converting the value fails, stick with the current value. |
- if (base::StringToInt(dismissals_value, &prompt_dismissals) && |
- prompt_dismissals > 0) { |
- g_prompt_dismissals_before_block = prompt_dismissals; |
+ if (base::StringToInt(dismissals_before_block_value, |
+ &dismissals_before_block) && |
+ dismissals_before_block > 0) { |
+ g_dismissals_before_block = dismissals_before_block; |
} |
- if (base::StringToInt(blacklist_embargo_value, &blacklist_embargo_days) && |
- blacklist_embargo_days > 0) { |
- g_blacklist_embargo_days = blacklist_embargo_days; |
+ if (base::StringToInt(ignores_before_block_value, &ignores_before_block) && |
+ ignores_before_block > 0) { |
+ g_ignores_before_block = ignores_before_block; |
} |
- if (base::StringToInt(dismissal_embargo_value, &dismissal_embargo_days) && |
+ if (base::StringToInt(dismissal_embargo_days_value, |
+ &dismissal_embargo_days) && |
dismissal_embargo_days > 0) { |
g_dismissal_embargo_days = dismissal_embargo_days; |
} |
+ if (base::StringToInt(ignore_embargo_days_value, &ignore_embargo_days) && |
+ ignore_embargo_days > 0) { |
+ g_ignore_embargo_days = ignore_embargo_days; |
+ } |
+ if (base::StringToInt(blacklist_embargo_days_value, |
+ &blacklist_embargo_days) && |
+ blacklist_embargo_days > 0) { |
+ g_blacklist_embargo_days = blacklist_embargo_days; |
+ } |
} |
void PermissionDecisionAutoBlocker::CheckSafeBrowsingBlacklist( |
@@ -232,29 +282,27 @@ PermissionResult PermissionDecisionAutoBlocker::GetEmbargoResult( |
GetOriginDict(map, request_origin); |
base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( |
dict.get(), PermissionUtil::GetPermissionString(permission)); |
- double embargo_date = -1; |
base::Time current_time = clock_->Now(); |
- if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) && |
- permission_dict->GetDouble(kPermissionBlacklistEmbargoKey, |
- &embargo_date)) { |
- if (current_time < |
- base::Time::FromInternalValue(embargo_date) + |
- base::TimeDelta::FromDays(g_blacklist_embargo_days)) { |
- return PermissionResult(CONTENT_SETTING_BLOCK, |
- PermissionStatusSource::SAFE_BROWSING_BLACKLIST); |
- } |
+ if (IsUnderEmbargo(permission_dict, features::kPermissionsBlacklist, |
+ kPermissionBlacklistEmbargoKey, current_time, |
+ base::TimeDelta::FromDays(g_blacklist_embargo_days))) { |
+ return PermissionResult(CONTENT_SETTING_BLOCK, |
+ PermissionStatusSource::SAFE_BROWSING_BLACKLIST); |
} |
- if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) && |
- permission_dict->GetDouble(kPermissionDismissalEmbargoKey, |
- &embargo_date)) { |
- if (current_time < |
- base::Time::FromInternalValue(embargo_date) + |
- base::TimeDelta::FromDays(g_dismissal_embargo_days)) { |
- return PermissionResult(CONTENT_SETTING_BLOCK, |
- PermissionStatusSource::MULTIPLE_DISMISSALS); |
- } |
+ if (IsUnderEmbargo(permission_dict, features::kBlockPromptsIfDismissedOften, |
+ kPermissionDismissalEmbargoKey, current_time, |
+ base::TimeDelta::FromDays(g_dismissal_embargo_days))) { |
+ return PermissionResult(CONTENT_SETTING_BLOCK, |
+ PermissionStatusSource::MULTIPLE_DISMISSALS); |
+ } |
+ |
+ if (IsUnderEmbargo(permission_dict, features::kBlockPromptsIfIgnoredOften, |
+ kPermissionIgnoreEmbargoKey, current_time, |
+ base::TimeDelta::FromDays(g_ignore_embargo_days))) { |
+ return PermissionResult(CONTENT_SETTING_BLOCK, |
+ PermissionStatusSource::MULTIPLE_IGNORES); |
} |
return PermissionResult(CONTENT_SETTING_ASK, |
@@ -290,18 +338,26 @@ bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo( |
// to make this nicer once PermissionQueueController is removed. |
if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) && |
permission != CONTENT_SETTINGS_TYPE_PLUGINS && |
- current_dismissal_count >= g_prompt_dismissals_before_block) { |
+ current_dismissal_count >= g_dismissals_before_block) { |
PlaceUnderEmbargo(url, permission, kPermissionDismissalEmbargoKey); |
return true; |
} |
return false; |
} |
-int PermissionDecisionAutoBlocker::RecordIgnore( |
+bool PermissionDecisionAutoBlocker::RecordIgnoreAndEmbargo( |
const GURL& url, |
ContentSettingsType permission) { |
- return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey, |
- profile_); |
+ int current_ignore_count = RecordActionInWebsiteSettings( |
+ url, permission, kPromptIgnoreCountKey, profile_); |
+ |
+ if (base::FeatureList::IsEnabled(features::kBlockPromptsIfIgnoredOften) && |
+ permission != CONTENT_SETTINGS_TYPE_PLUGINS && |
+ current_ignore_count >= g_ignores_before_block) { |
+ PlaceUnderEmbargo(url, permission, kPermissionIgnoreEmbargoKey); |
+ return true; |
+ } |
+ return false; |
} |
void PermissionDecisionAutoBlocker::RemoveCountsByUrl( |