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 97834772a53a020cf6ae1aa3ad7c76d6e52b7bb1..21696562a4be615aca38e385bb6da51c3c2c2498 100644 |
--- a/chrome/browser/permissions/permission_decision_auto_blocker.cc |
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.cc |
@@ -4,6 +4,8 @@ |
#include "chrome/browser/permissions/permission_decision_auto_blocker.h" |
+#include <string.h> |
+ |
#include <memory> |
#include "base/feature_list.h" |
@@ -14,6 +16,7 @@ |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
#include "chrome/browser/permissions/permission_blacklist_client.h" |
+#include "chrome/browser/permissions/permission_uma_util.h" |
#include "chrome/browser/permissions/permission_util.h" |
#include "chrome/browser/profiles/incognito_helpers.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -113,6 +116,20 @@ int GetActionCount(const GURL& url, |
return current_count; |
} |
+// Returns true if |url| has been embargoed from requesting |permission| for the |
+// reason corresponding to |key|. |
+bool WasPreviouslyEmbargoed(Profile* profile, |
+ const GURL& url, |
+ content::PermissionType permission, |
+ const char* key) { |
+ HostContentSettingsMap* map = |
+ HostContentSettingsMapFactory::GetForProfile(profile); |
+ std::unique_ptr<base::DictionaryValue> dict = GetOriginDict(map, url); |
+ base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( |
+ dict.get(), PermissionUtil::GetPermissionString(permission)); |
+ return permission_dict->HasKey(key); |
+} |
+ |
} // namespace |
// PermissionDecisionAutoBlocker::Factory -------------------------------------- |
@@ -227,6 +244,12 @@ bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo( |
if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) && |
current_dismissal_count >= g_prompt_dismissals_before_block) { |
+ if (WasPreviouslyEmbargoed(profile_, url, permission, |
+ kPermissionDismissalEmbargoKey)) { |
+ PermissionUmaUtil::RecordRepeatedEmbargo( |
+ PermissionEmbargoReason::REPEATED_DISMISSALS); |
+ } |
+ |
PlaceUnderEmbargo(permission, url, kPermissionDismissalEmbargoKey); |
return true; |
} |
@@ -341,12 +364,17 @@ void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult( |
base::Callback<void(bool)> callback, |
bool should_be_embargoed) { |
if (should_be_embargoed) { |
- // Requesting site is blacklisted for this permission, update the content |
- // setting to place it under embargo. |
+ if (WasPreviouslyEmbargoed(profile_, request_origin, permission, |
+ kPermissionBlacklistEmbargoKey)) { |
+ PermissionUmaUtil::RecordRepeatedEmbargo( |
+ PermissionEmbargoReason::PERMISSIONS_BLACKLISTING); |
+ } |
+ |
PlaceUnderEmbargo(permission, request_origin, |
kPermissionBlacklistEmbargoKey); |
} |
- callback.Run(should_be_embargoed /* permission blocked */); |
+ |
+ callback.Run(should_be_embargoed); |
} |
// static |
@@ -364,6 +392,11 @@ void PermissionDecisionAutoBlocker::PlaceUnderEmbargo( |
map->SetWebsiteSettingDefaultScope( |
request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, |
std::string(), std::move(dict)); |
+ PermissionEmbargoReason embargo_reason = |
+ PermissionEmbargoReason::PERMISSIONS_BLACKLISTING; |
+ if (std::strcmp(key, kPermissionDismissalEmbargoKey) == 0) |
+ embargo_reason = PermissionEmbargoReason::REPEATED_DISMISSALS; |
+ PermissionUmaUtil::RecordPermissionEmbargoReason(embargo_reason); |
} |
void PermissionDecisionAutoBlocker:: |