From 714a06233a8c80356729ff9b51a0e4840a7ad1a2 Mon Sep 17 00:00:00 2001
From: Olesia Marukhno <olesiamarukhno@google.com>
Date: Mon, 24 Feb 2025 06:17:06 -0800
Subject: [PATCH] [DNS] Add a new content setting
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add a new REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS content setting.
It will be used to store the revoked (or potentially revoked) sites that
have been sending disruptive notifications.

After revocation, the users will receive a notification and the list of
revoked websites will be available in Safety Hub.

For more details, see go/dns-dd.

Bug: 397363276
Change-Id: Iec9b8be940140e4daa80e877db51452109a8c2b5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6276093
Reviewed-by: Antonio Sartori <antoniosartori@chromium.org>
Reviewed-by: Robbie McElrath <rmcelrath@chromium.org>
Reviewed-by: Christian Dullweber <dullweber@chromium.org>
Commit-Queue: Olesia Marukhno <olesiamarukhno@google.com>
Reviewed-by: Martin Šrámek <msramek@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1423872}
---
 .../site_settings/WebsitePermissionsFetcherTest.java        | 2 +-
 .../browsing_data/chrome_browsing_data_remover_delegate.cc  | 4 ++++
 .../controlled_frame_permissions_unittest.cc                | 1 +
 chrome/browser/ui/webui/settings/site_settings_helper.cc    | 1 +
 .../core/browser/content_settings_uma_util.cc               | 1 +
 .../core/browser/website_settings_registry.cc               | 6 ++++++
 .../core/common/content_settings_types.mojom                | 4 ++++
 tools/metrics/histograms/enums.xml                          | 1 +
 8 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
index 57482ed209b7e..acf8cd025fa27 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
@@ -707,7 +707,7 @@ public class WebsitePermissionsFetcherTest {
         // Otherwise, just update count in the assert.
         // TODO(https://b/332704817): Add test for Tracking Protection content setting after Android
         // integration.
-        assertEquals(117, ContentSettingsType.MAX_VALUE);
+        assertEquals(118, ContentSettingsType.MAX_VALUE);
         websitePreferenceBridge.addContentSettingException(
                 new ContentSettingException(
                         ContentSettingsType.COOKIES,
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 5036bc4f5c309..4edb6fb0e562a 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -897,6 +897,10 @@ void ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData(
         ContentSettingsType::REVOKED_ABUSIVE_NOTIFICATION_PERMISSIONS,
         delete_begin_, delete_end_, website_settings_filter);
 
+    host_content_settings_map_->ClearSettingsForOneTypeWithPredicate(
+        ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
+        delete_begin_, delete_end_, website_settings_filter);
+
     host_content_settings_map_->ClearSettingsForOneTypeWithPredicate(
         ContentSettingsType::NOTIFICATION_PERMISSION_REVIEW, delete_begin_,
         delete_end_, website_settings_filter);
diff --git a/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc b/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc
index f9e0d567c888b..ab3d7ab17811f 100644
--- a/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc
+++ b/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc
@@ -196,6 +196,7 @@ TEST_F(ControlledFramePermissionsTest, Verify) {
       case ContentSettingsType::
           ARE_SUSPICIOUS_NOTIFICATIONS_ALLOWLISTED_BY_USER:
       case ContentSettingsType::CONTROLLED_FRAME:
+      case ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS:
         break;
 
       default:
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc
index e8c5e5cec26de..8856936f6b0a2 100644
--- a/chrome/browser/ui/webui/settings/site_settings_helper.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -247,6 +247,7 @@ constexpr auto kContentSettingsTypeGroupNames = std::to_array<
     {ContentSettingsType::CONTROLLED_FRAME, nullptr},
     // POINTER_LOCK has been deprecated.
     {ContentSettingsType::POINTER_LOCK, nullptr},
+    {ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, nullptr},
 });
 
 static_assert(
diff --git a/components/content_settings/core/browser/content_settings_uma_util.cc b/components/content_settings/core/browser/content_settings_uma_util.cc
index 87519a1fbffb5..1a6ff66af738a 100644
--- a/components/content_settings/core/browser/content_settings_uma_util.cc
+++ b/components/content_settings/core/browser/content_settings_uma_util.cc
@@ -153,6 +153,7 @@ constexpr auto kHistogramValue = base::MakeFixedFlatMap<ContentSettingsType,
     {ContentSettingsType::ARE_SUSPICIOUS_NOTIFICATIONS_ALLOWLISTED_BY_USER,
      132},
     {ContentSettingsType::CONTROLLED_FRAME, 133},
+    {ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, 134},
 
     // As mentioned at the top, please don't forget to update ContentType in
     // enums.xml when you add entries here!
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc
index a8a82d082ae82..c22a98633a233 100644
--- a/components/content_settings/core/browser/website_settings_registry.cc
+++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -326,6 +326,12 @@ void WebsiteSettingsRegistry::Init() {
       WebsiteSettingsInfo::GENERIC_SINGLE_ORIGIN_SCOPE,
       DESKTOP | PLATFORM_ANDROID,
       WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO);
+  Register(ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
+           "disruptive-notification-permissions", base::Value(),
+           WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY,
+           WebsiteSettingsInfo::GENERIC_SINGLE_ORIGIN_SCOPE,
+           DESKTOP | PLATFORM_ANDROID,
+           WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO);
 }
 
 }  // namespace content_settings
diff --git a/components/content_settings/core/common/content_settings_types.mojom b/components/content_settings/core/common/content_settings_types.mojom
index 5ddb2cd807f01..2b5085af0bba5 100644
--- a/components/content_settings/core/common/content_settings_types.mojom
+++ b/components/content_settings/core/common/content_settings_types.mojom
@@ -475,5 +475,9 @@ enum ContentSettingsType {
 
   // Content settings for access to the Controlled Frame API.
   CONTROLLED_FRAME,
+
+  // Website setting which is used for UnusedSitePermissionsService to
+  // store revoked notification permissions of disruptive sites.
+  REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS,
 };
 // LINT.ThenChange(//components/content_settings/core/browser/content_settings_uma_util.cc:kHistogramValue)
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 010b0774f1272..acf5c0b66af3f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2751,6 +2751,7 @@ Called by update_net_error_codes.py.-->
   <int value="131" label="Legacy cookie scope"/>
   <int value="132" label="Are suspicious notifications allowlisted by user"/>
   <int value="133" label="Controlled Frame"/>
+  <int value="134" label="Revoked disruptive notification permissions"/>
 </enum>
 
 <!-- LINT.ThenChange(//components/content_settings/core/browser/content_settings_uma_util.cc:kHistogramValue) -->