diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc index 20c9c0f3b37ac..6537d8477c26e 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl.cc @@ -958,7 +958,18 @@ void AttributionManagerImpl::RemoveAttributionDataByDataKey( base::OnceClosure callback) { attribution_storage_.AsyncCall(&AttributionStorage::DeleteByDataKey) .WithArgs(data_key) - .Then(std::move(callback)); + .Then(std::move(callback).Then( + // TODO(crbug.com/1446693): Replace this lambda with + // `OnClearDataComplete()` so that observers are notified and the + // task-runner priority is restored. + base::BindOnce( + [](base::WeakPtr manager) { + if (manager) { + manager->NotifySourcesChanged(); + manager->NotifyReportsChanged(); + } + }, + weak_factory_.GetWeakPtr()))); } void AttributionManagerImpl::GetReportsToSend() { diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc index e8eb487e940d5..7f75774a2e9be 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc @@ -61,6 +61,7 @@ #include "content/browser/attribution_reporting/test/mock_content_browser_client.h" #include "content/browser/browsing_data/browsing_data_filter_builder_impl.h" #include "content/browser/storage_partition_impl.h" +#include "content/public/browser/attribution_data_model.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browsing_data_filter_builder.h" #include "content/public/browser/global_routing_id.h" @@ -2839,6 +2840,24 @@ TEST_F(AttributionManagerImplTest, PendingReportsMetrics_OverLimits) { (base::Seconds(10) * kMaxPendingReportsTimings).InMilliseconds()); } +TEST_F(AttributionManagerImplTest, + RemoveAttributionDataByDataKey_NotifiesObservers) { + MockAttributionObserver observer; + base::ScopedObservation observation( + &observer); + observation.Observe(attribution_manager_.get()); + + EXPECT_CALL(observer, OnSourcesChanged); + EXPECT_CALL(observer, OnReportsChanged); + + base::RunLoop run_loop; + attribution_manager_->RemoveAttributionDataByDataKey( + AttributionDataModel::DataKey( + url::Origin::Create(GURL("https://x.test"))), + run_loop.QuitClosure()); + run_loop.Run(); +} + class AttributionManagerImplDebugReportTest : public AttributionManagerImplTest { protected: