Include aggregate debug reporting rate limits data for all data keys

Aggregate debug reporting rate limits data would be deleted for
user-initiated data deletion.

Currently when fetching data keys for the browsing data model, only
reporting origins of sources, reports, and rate limits in storage are
returned. As aggregate debug reporting rate limits data may be stored
independent of sources, reports, and rate limits, returning reporting
origins of aggregate debug reporting rate limits data gives users the
choice to delete those data.

Bug: 379612192
Change-Id: I70d1a99e44da4ff660a1218aca2573524f61dcb0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6032038
Commit-Queue: Nan Lin <linnan@chromium.org>
Reviewed-by: Andrew Paseltiner <apaseltiner@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1384513}
diff --git a/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.cc b/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.cc
index f7d8863..93e5d86 100644
--- a/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.cc
+++ b/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.cc
@@ -6,8 +6,10 @@
 
 #include <stdint.h>
 
+#include <set>
 #include <string>
 #include <string_view>
+#include <utility>
 
 #include "base/check.h"
 #include "base/check_op.h"
@@ -29,6 +31,7 @@
 #include "sql/statement_id.h"
 #include "sql/transaction.h"
 #include "third_party/blink/public/common/storage_key/storage_key.h"
+#include "url/origin.h"
 
 namespace content {
 
@@ -273,6 +276,23 @@
   return statement.Run();
 }
 
+void AggregatableDebugRateLimitTable::AppendRateLimitDataKeys(
+    sql::Database* db,
+    std::set<AttributionDataModel::DataKey>& keys) {
+  sql::Statement statement(db->GetCachedStatement(
+      SQL_FROM_HERE,
+      attribution_queries::kGetAggregatableDebugRateLimitDataKeysSql));
+
+  while (statement.Step()) {
+    url::Origin reporting_origin =
+        DeserializeOrigin(statement.ColumnStringView(0));
+    if (reporting_origin.opaque()) {
+      continue;
+    }
+    keys.emplace(std::move(reporting_origin));
+  }
+}
+
 void AggregatableDebugRateLimitTable::SetDelegate(
     const AttributionResolverDelegate& delegate) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.h b/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.h
index 0d83128..426fd00 100644
--- a/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.h
+++ b/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.h
@@ -5,11 +5,14 @@
 #ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_AGGREGATABLE_DEBUG_RATE_LIMIT_TABLE_H_
 #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_AGGREGATABLE_DEBUG_RATE_LIMIT_TABLE_H_
 
+#include <set>
+
 #include "base/memory/raw_ref.h"
 #include "base/sequence_checker.h"
 #include "base/thread_annotations.h"
 #include "base/time/time.h"
 #include "content/common/content_export.h"
+#include "content/public/browser/attribution_data_model.h"
 #include "content/public/browser/storage_partition.h"
 
 namespace base {
@@ -62,6 +65,9 @@
       base::Time delete_end,
       StoragePartition::StorageKeyMatcherFunction filter);
 
+  void AppendRateLimitDataKeys(sql::Database* db,
+                               std::set<AttributionDataModel::DataKey>& keys);
+
   void SetDelegate(const AttributionResolverDelegate&);
 
  private:
diff --git a/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table_unittest.cc b/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table_unittest.cc
index 541ca53..8d2b369 100644
--- a/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table_unittest.cc
+++ b/content/browser/attribution_reporting/aggregatable_debug_rate_limit_table_unittest.cc
@@ -5,6 +5,7 @@
 #include "content/browser/attribution_reporting/aggregatable_debug_rate_limit_table.h"
 
 #include <optional>
+#include <set>
 #include <string>
 #include <string_view>
 #include <vector>
@@ -16,6 +17,7 @@
 #include "components/attribution_reporting/suitable_origin.h"
 #include "content/browser/attribution_reporting/aggregatable_debug_report.h"
 #include "content/browser/attribution_reporting/test/configurable_storage_delegate.h"
+#include "content/public/browser/attribution_data_model.h"
 #include "net/base/schemeful_site.h"
 #include "sql/database.h"
 #include "sql/statement.h"
@@ -24,6 +26,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/storage_key/storage_key.h"
 #include "third_party/blink/public/mojom/aggregation_service/aggregatable_report.mojom.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 namespace {
@@ -354,5 +358,27 @@
                   Field(&RateLimitData::context_site, "https://c3.test")));
 }
 
+TEST_F(AggregatableDebugRateLimitTableTest, GetAttributionDataKeysSet) {
+  ASSERT_TRUE(table_.AddRateLimit(
+      &db_, CreateAggregatableDebugReport(
+                /*context_site=*/"https://a.test",
+                /*reporting_origin=*/"https://a.r.test", base::Time::Now(),
+                /*consumed_budget=*/1)));
+  ASSERT_TRUE(table_.AddRateLimit(
+      &db_, CreateAggregatableDebugReport(
+                /*context_site=*/"https://b.test",
+                /*reporting_origin=*/"https://b.r.test", base::Time::Now(),
+                /*consumed_budget=*/1)));
+
+  std::set<AttributionDataModel::DataKey> keys;
+  table_.AppendRateLimitDataKeys(&db_, keys);
+
+  EXPECT_THAT(keys, UnorderedElementsAre(
+                        AttributionDataModel::DataKey(
+                            url::Origin::Create(GURL("https://a.r.test"))),
+                        AttributionDataModel::DataKey(
+                            url::Origin::Create(GURL("https://b.r.test")))));
+}
+
 }  // namespace
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_resolver_unittest.cc b/content/browser/attribution_reporting/attribution_resolver_unittest.cc
index ce7a9b2..63476e11 100644
--- a/content/browser/attribution_reporting/attribution_resolver_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_resolver_unittest.cc
@@ -38,6 +38,7 @@
 #include "components/attribution_reporting/attribution_scopes_data.h"
 #include "components/attribution_reporting/attribution_scopes_set.h"
 #include "components/attribution_reporting/constants.h"
+#include "components/attribution_reporting/debug_types.mojom.h"
 #include "components/attribution_reporting/event_report_windows.h"
 #include "components/attribution_reporting/event_trigger_data.h"
 #include "components/attribution_reporting/filters.h"
@@ -2945,6 +2946,8 @@
       url::Origin::Create(GURL("https://a.r.test")));
   auto expected_2 = AttributionDataModel::DataKey(
       url::Origin::Create(GURL("https://b.r.test")));
+  auto expected_3 = AttributionDataModel::DataKey(
+      url::Origin::Create(GURL("https://c.r.test")));
 
   auto s1 =
       SourceBuilder()
@@ -2970,7 +2973,16 @@
   storage()->StoreSource(s2);
   storage()->StoreSource(s3);
 
-  EXPECT_THAT(storage()->GetAllDataKeys(), ElementsAre(expected_1, expected_2));
+  storage()->ProcessAggregatableDebugReport(
+      CreateAggregatableDebugReport({AggregatableReportHistogramContribution(
+                                        /*bucket=*/1, /*value=*/1,
+                                        /*filtering_id=*/std::nullopt)},
+                                    /*reporting_origin=*/"https://c.r.test"),
+      /*remaining_budget=*/std::nullopt,
+      /*source_id=*/std::nullopt);
+
+  EXPECT_THAT(storage()->GetAllDataKeys(),
+              ElementsAre(expected_1, expected_2, expected_3));
 }
 
 TEST_F(AttributionResolverTest, SourceDebugKey_RoundTrips) {
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index fb2b9ec..a7e2647 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -2884,6 +2884,9 @@
   get_data_keys(null_reports_statement);
 
   rate_limit_table_.AppendRateLimitDataKeys(&db_, keys);
+
+  aggregatable_debug_rate_limit_table_.AppendRateLimitDataKeys(&db_, keys);
+
   return keys;
 }
 
diff --git a/content/browser/attribution_reporting/sql_queries.h b/content/browser/attribution_reporting/sql_queries.h
index dc86c84..abc5a74 100644
--- a/content/browser/attribution_reporting/sql_queries.h
+++ b/content/browser/attribution_reporting/sql_queries.h
@@ -85,6 +85,9 @@
 inline constexpr const char kGetRateLimitDataKeysSql[] =
     "SELECT reporting_origin FROM rate_limits";
 
+inline constexpr const char kGetAggregatableDebugRateLimitDataKeysSql[] =
+    "SELECT reporting_origin FROM aggregatable_debug_rate_limits";
+
 static_assert(static_cast<int>(
                   attribution_reporting::mojom::ReportType::kEventLevel) == 0,
               "update `report_type=0` clause below");