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

Unified Diff: chrome/browser/permissions/permission_decision_auto_blocker.cc

Issue 2790473004: Permissions: Clear embargo if user changes an embargoed permission's setting. (Closed)
Patch Set: Review comments. 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: 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..9afa6853b778144935ec1eb873674fd4f1a49f8c 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.cc
@@ -304,6 +304,41 @@ int PermissionDecisionAutoBlocker::RecordIgnore(
profile_);
}
+void PermissionDecisionAutoBlocker::RemoveEmbargoByUrl(
+ const GURL& url,
+ ContentSettingsType permission) {
+ if (!PermissionUtil::IsPermission(permission))
+ return;
+
+ // Don't proceed if |permission| was not under embargo for |url|.
+ PermissionResult result = GetEmbargoResult(url, permission);
+ if (result.source != PermissionStatusSource::MULTIPLE_DISMISSALS &&
+ result.source != PermissionStatusSource::SAFE_BROWSING_BLACKLIST) {
+ return;
+ }
+
+ HostContentSettingsMap* map =
+ HostContentSettingsMapFactory::GetForProfile(profile_);
+ std::unique_ptr<base::DictionaryValue> dict = GetOriginDict(map, url);
+ base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
+ dict.get(), PermissionUtil::GetPermissionString(permission));
+
+ // Deleting non-existent entries will return a false value. Since it should be
+ // impossible for a permission to have been embargoed for two different
+ // reasons at the same time, check that exactly one deletion was successful.
+ const bool dismissal_key_deleted =
+ permission_dict->RemoveWithoutPathExpansion(
+ kPermissionDismissalEmbargoKey, nullptr);
+ const bool blacklist_key_deleted =
+ permission_dict->RemoveWithoutPathExpansion(
+ kPermissionBlacklistEmbargoKey, nullptr);
+ DCHECK(dismissal_key_deleted != blacklist_key_deleted);
+
+ map->SetWebsiteSettingDefaultScope(
+ url, GURL(), CONTENT_SETTINGS_TYPE_PERMISSION_AUTOBLOCKER_DATA,
+ std::string(), std::move(dict));
+}
+
void PermissionDecisionAutoBlocker::RemoveCountsByUrl(
base::Callback<bool(const GURL& url)> filter) {
HostContentSettingsMap* map =

Powered by Google App Engine
This is Rietveld 408576698