Avi Drissman | 4e1b7bc | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2021 The Chromium Authors |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef CONTENT_BROWSER_AGGREGATION_SERVICE_AGGREGATION_SERVICE_IMPL_H_ |
| 6 | #define CONTENT_BROWSER_AGGREGATION_SERVICE_AGGREGATION_SERVICE_IMPL_H_ |
| 7 | |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 8 | #include <memory> |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 9 | #include <optional> |
Thomas Quintanilla | dce5ba9b | 2023-06-16 18:49:44 | [diff] [blame] | 10 | #include <set> |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 11 | #include <vector> |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 12 | |
Avi Drissman | adac2199 | 2023-01-11 23:46:39 | [diff] [blame] | 13 | #include "base/functional/callback_forward.h" |
Alex Turner | ae96910 | 2022-11-16 18:22:42 | [diff] [blame] | 14 | #include "base/memory/scoped_refptr.h" |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 15 | #include "base/memory/weak_ptr.h" |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 16 | #include "base/observer_list.h" |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 17 | #include "base/threading/sequence_bound.h" |
| 18 | #include "content/browser/aggregation_service/aggregatable_report_assembler.h" |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 19 | #include "content/browser/aggregation_service/aggregatable_report_scheduler.h" |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 20 | #include "content/browser/aggregation_service/aggregatable_report_sender.h" |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 21 | #include "content/browser/aggregation_service/aggregation_service.h" |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 22 | #include "content/browser/aggregation_service/aggregation_service_observer.h" |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 23 | #include "content/browser/aggregation_service/aggregation_service_storage.h" |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 24 | #include "content/browser/aggregation_service/aggregation_service_storage_context.h" |
| 25 | #include "content/common/content_export.h" |
Alex Turner | b835b3a | 2022-07-21 21:42:18 | [diff] [blame] | 26 | #include "content/public/browser/storage_partition.h" |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 27 | |
Nan Lin | 8de22bc | 2022-04-02 02:51:14 | [diff] [blame] | 28 | class GURL; |
| 29 | |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 30 | namespace base { |
| 31 | class Clock; |
Dan McArdle | 84d7374 | 2023-12-05 21:23:21 | [diff] [blame] | 32 | class ElapsedTimer; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 33 | class FilePath; |
Alex Turner | ae96910 | 2022-11-16 18:22:42 | [diff] [blame] | 34 | class UpdateableSequencedTaskRunner; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 35 | } // namespace base |
| 36 | |
Thomas Quintanilla | dce5ba9b | 2023-06-16 18:49:44 | [diff] [blame] | 37 | namespace url { |
| 38 | class Origin; |
| 39 | } // namespace url |
| 40 | |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 41 | namespace content { |
| 42 | |
Nan Lin | 8de22bc | 2022-04-02 02:51:14 | [diff] [blame] | 43 | struct PublicKeyset; |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 44 | class AggregatableReport; |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 45 | class AggregatableReportRequest; |
Alex Turner | 7151277 | 2022-06-29 19:20:27 | [diff] [blame] | 46 | class AggregationServiceStorage; |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 47 | class AggregatableReportScheduler; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 48 | class StoragePartitionImpl; |
| 49 | |
| 50 | // UI thread class that manages the lifetime of the underlying storage. Owned by |
| 51 | // the StoragePartitionImpl. Lifetime is bound to lifetime of the |
| 52 | // StoragePartitionImpl. |
| 53 | class CONTENT_EXPORT AggregationServiceImpl |
| 54 | : public AggregationService, |
| 55 | public AggregationServiceStorageContext { |
| 56 | public: |
| 57 | static std::unique_ptr<AggregationServiceImpl> CreateForTesting( |
| 58 | bool run_in_memory, |
| 59 | const base::FilePath& user_data_directory, |
| 60 | const base::Clock* clock, |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 61 | std::unique_ptr<AggregatableReportScheduler> scheduler, |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 62 | std::unique_ptr<AggregatableReportAssembler> assembler, |
| 63 | std::unique_ptr<AggregatableReportSender> sender); |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 64 | |
| 65 | AggregationServiceImpl(bool run_in_memory, |
| 66 | const base::FilePath& user_data_directory, |
| 67 | StoragePartitionImpl* storage_partition); |
| 68 | AggregationServiceImpl(const AggregationServiceImpl& other) = delete; |
| 69 | AggregationServiceImpl& operator=(const AggregationServiceImpl& other) = |
| 70 | delete; |
| 71 | AggregationServiceImpl(AggregationServiceImpl&& other) = delete; |
| 72 | AggregationServiceImpl& operator=(AggregationServiceImpl&& other) = delete; |
| 73 | ~AggregationServiceImpl() override; |
| 74 | |
| 75 | // AggregationService: |
| 76 | void AssembleReport(AggregatableReportRequest report_request, |
| 77 | AssemblyCallback callback) override; |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 78 | void SendReport(const GURL& url, |
Nan Lin | a7cffd0 | 2022-01-06 15:20:29 | [diff] [blame] | 79 | const AggregatableReport& report, |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 80 | SendCallback callback) override; |
| 81 | void SendReport(const GURL& url, |
| 82 | const base::Value& contents, |
| 83 | SendCallback callback) override; |
Nan Lin | b771003b | 2022-01-19 21:05:53 | [diff] [blame] | 84 | void ClearData(base::Time delete_begin, |
| 85 | base::Time delete_end, |
Alex Turner | b835b3a | 2022-07-21 21:42:18 | [diff] [blame] | 86 | StoragePartition::StorageKeyMatcherFunction filter, |
Nan Lin | b771003b | 2022-01-19 21:05:53 | [diff] [blame] | 87 | base::OnceClosure done) override; |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 88 | void ScheduleReport(AggregatableReportRequest report_request) override; |
Alex Turner | 4162376f | 2022-10-20 18:04:10 | [diff] [blame] | 89 | void AssembleAndSendReport(AggregatableReportRequest report_request) override; |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 90 | void GetPendingReportRequestsForWebUI( |
| 91 | base::OnceCallback< |
| 92 | void(std::vector<AggregationServiceStorage::RequestAndId>)> callback) |
| 93 | override; |
| 94 | void SendReportsForWebUI( |
| 95 | const std::vector<AggregationServiceStorage::RequestId>& ids, |
| 96 | base::OnceClosure reports_sent_callback) override; |
Thomas Quintanilla | dce5ba9b | 2023-06-16 18:49:44 | [diff] [blame] | 97 | void GetPendingReportReportingOrigins( |
| 98 | base::OnceCallback<void(std::set<url::Origin>)> callback) override; |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 99 | void AddObserver(AggregationServiceObserver* observer) override; |
| 100 | void RemoveObserver(AggregationServiceObserver* observer) override; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 101 | |
| 102 | // AggregationServiceStorageContext: |
Alex Turner | 7151277 | 2022-06-29 19:20:27 | [diff] [blame] | 103 | const base::SequenceBound<AggregationServiceStorage>& GetStorage() override; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 104 | |
Nan Lin | 8de22bc | 2022-04-02 02:51:14 | [diff] [blame] | 105 | // Sets the public keys for `url` in storage to allow testing without network. |
| 106 | void SetPublicKeysForTesting(const GURL& url, const PublicKeyset& keyset); |
| 107 | |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 108 | private: |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 109 | // Allows access to `OnScheduledReportTimeReached()`. |
| 110 | friend class AggregationServiceImplTest; |
| 111 | |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 112 | AggregationServiceImpl(bool run_in_memory, |
| 113 | const base::FilePath& user_data_directory, |
| 114 | const base::Clock* clock, |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 115 | std::unique_ptr<AggregatableReportScheduler> scheduler, |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 116 | std::unique_ptr<AggregatableReportAssembler> assembler, |
| 117 | std::unique_ptr<AggregatableReportSender> sender); |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 118 | |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 119 | void OnScheduledReportTimeReached( |
| 120 | std::vector<AggregationServiceStorage::RequestAndId> requests_and_ids); |
Alex Turner | a022ec6 | 2022-07-20 21:10:27 | [diff] [blame] | 121 | |
Alex Turner | 4162376f | 2022-10-20 18:04:10 | [diff] [blame] | 122 | void AssembleAndSendReports( |
| 123 | std::vector<AggregationServiceStorage::RequestAndId> requests_and_ids, |
| 124 | base::RepeatingClosure done); |
| 125 | |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 126 | // `request_id` is `std::nullopt` iff `report_request` was not |
Alex Turner | 4162376f | 2022-10-20 18:04:10 | [diff] [blame] | 127 | // stored/scheduled. |
| 128 | void AssembleAndSendReportImpl( |
| 129 | AggregatableReportRequest report_request, |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 130 | std::optional<AggregationServiceStorage::RequestId> request_id, |
Alex Turner | 4162376f | 2022-10-20 18:04:10 | [diff] [blame] | 131 | base::OnceClosure done); |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 132 | void OnReportAssemblyComplete( |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 133 | base::OnceClosure done, |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 134 | std::optional<AggregationServiceStorage::RequestId> request_id, |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 135 | GURL reporting_url, |
Dan McArdle | 84d7374 | 2023-12-05 21:23:21 | [diff] [blame] | 136 | base::ElapsedTimer elapsed_timer, |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 137 | AggregatableReportRequest report_request, |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 138 | std::optional<AggregatableReport> report, |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 139 | AggregatableReportAssembler::AssemblyStatus status); |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 140 | void OnReportSendingComplete( |
| 141 | base::OnceClosure done, |
Alex Turner | 4162376f | 2022-10-20 18:04:10 | [diff] [blame] | 142 | AggregatableReportRequest report_request, |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 143 | std::optional<AggregationServiceStorage::RequestId> request_id, |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 144 | AggregatableReport report, |
Dan McArdle | 84d7374 | 2023-12-05 21:23:21 | [diff] [blame] | 145 | base::ElapsedTimer elapsed_timer, |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 146 | AggregatableReportSender::RequestStatus status); |
Thomas Quintanilla | dce5ba9b | 2023-06-16 18:49:44 | [diff] [blame] | 147 | void OnUserVisibleTaskStarted(); |
| 148 | void OnUserVisibleTaskComplete(); |
Alex Turner | ae96910 | 2022-11-16 18:22:42 | [diff] [blame] | 149 | void OnClearDataComplete(); |
Alex Turner | 48e2530 | 2022-07-21 20:25:35 | [diff] [blame] | 150 | |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 151 | void OnGetRequestsToSendFromWebUI( |
| 152 | base::OnceClosure reports_sent_callback, |
| 153 | std::vector<AggregationServiceStorage::RequestAndId> requests_and_ids); |
| 154 | |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 155 | void NotifyReportHandled( |
Alex Turner | 4162376f | 2022-10-20 18:04:10 | [diff] [blame] | 156 | const AggregatableReportRequest& request, |
Dan McArdle | 08ad611 | 2023-11-21 20:39:47 | [diff] [blame] | 157 | std::optional<AggregationServiceStorage::RequestId> request_id, |
| 158 | const std::optional<AggregatableReport>& report, |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 159 | AggregationServiceObserver::ReportStatus status); |
| 160 | |
| 161 | void NotifyRequestStorageModified(); |
| 162 | |
Alex Turner | ae96910 | 2022-11-16 18:22:42 | [diff] [blame] | 163 | // The task runner for all aggregation service storage operations. Updateable |
| 164 | // to allow for priority to be temporarily increased to `USER_VISIBLE` when a |
| 165 | // clear data task is queued or running. Otherwise `BEST_EFFORT` is used. |
| 166 | scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner_; |
| 167 | |
Thomas Quintanilla | dce5ba9b | 2023-06-16 18:49:44 | [diff] [blame] | 168 | // How many user visible storage tasks are queued or running currently, i.e. |
Alex Turner | ae96910 | 2022-11-16 18:22:42 | [diff] [blame] | 169 | // have been posted but the reply has not been run. |
Thomas Quintanilla | dce5ba9b | 2023-06-16 18:49:44 | [diff] [blame] | 170 | int num_pending_user_visible_tasks_ = 0; |
Alex Turner | ae96910 | 2022-11-16 18:22:42 | [diff] [blame] | 171 | |
Alex Turner | 7151277 | 2022-06-29 19:20:27 | [diff] [blame] | 172 | base::SequenceBound<AggregationServiceStorage> storage_; |
Alex Turner | b859b9c | 2022-08-03 21:47:54 | [diff] [blame] | 173 | std::unique_ptr<AggregatableReportScheduler> scheduler_; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 174 | std::unique_ptr<AggregatableReportAssembler> assembler_; |
Nan Lin | 16e55f48 | 2021-12-10 15:05:47 | [diff] [blame] | 175 | std::unique_ptr<AggregatableReportSender> sender_; |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 176 | |
Nan Lin | 55ad2a5a | 2022-08-15 21:32:57 | [diff] [blame] | 177 | base::ObserverList<AggregationServiceObserver> observers_; |
| 178 | |
Nan Lin | 6a52078 | 2022-08-15 19:45:13 | [diff] [blame] | 179 | base::WeakPtrFactory<AggregationServiceImpl> weak_factory_{this}; |
Nan Lin | 89244d6 | 2021-11-12 21:38:17 | [diff] [blame] | 180 | }; |
| 181 | |
| 182 | } // namespace content |
| 183 | |
Sean Maher | e672a66 | 2023-01-09 21:42:28 | [diff] [blame] | 184 | #endif // CONTENT_BROWSER_AGGREGATION_SERVICE_AGGREGATION_SERVICE_IMPL_H_ |