| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_INTEROP_PARSER_H_ |
| #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_INTEROP_PARSER_H_ |
| |
| #include <stdint.h> |
| |
| #include <iosfwd> |
| #include <optional> |
| #include <string> |
| #include <variant> |
| #include <vector> |
| |
| #include "base/containers/flat_set.h" |
| #include "base/memory/scoped_refptr.h" |
| #include "base/time/time.h" |
| #include "base/types/expected.h" |
| #include "base/values.h" |
| #include "components/attribution_reporting/privacy_math.h" |
| #include "components/attribution_reporting/suitable_origin.h" |
| #include "content/browser/attribution_reporting/attribution_config.h" |
| #include "content/browser/attribution_reporting/attribution_features.h" |
| #include "services/network/public/mojom/attribution.mojom-forward.h" |
| #include "url/gurl.h" |
| |
| namespace net { |
| class HttpResponseHeaders; |
| } // namespace net |
| |
| namespace url { |
| class Origin; |
| } // namespace url |
| |
| namespace content { |
| |
| struct AttributionSimulationEvent { |
| struct StartRequest { |
| int64_t request_id; |
| attribution_reporting::SuitableOrigin context_origin; |
| network::mojom::AttributionReportingEligibility eligibility; |
| bool fenced = false; |
| }; |
| |
| struct Response { |
| int64_t request_id; |
| GURL url; |
| scoped_refptr<net::HttpResponseHeaders> response_headers; |
| // Only relevant for sources, not triggers. |
| attribution_reporting::RandomizedResponse randomized_response; |
| // Only relevant for triggers, not sources. |
| base::flat_set<int> null_aggregatable_reports_days; |
| bool debug_permission = false; |
| |
| Response(int64_t request_id, |
| GURL url, |
| scoped_refptr<net::HttpResponseHeaders>, |
| attribution_reporting::RandomizedResponse, |
| base::flat_set<int> null_aggregatable_reports_days, |
| bool debug_permission); |
| |
| ~Response(); |
| |
| Response(const Response&) = delete; |
| Response& operator=(const Response&) = delete; |
| |
| Response(Response&&); |
| Response& operator=(Response&&); |
| }; |
| |
| struct EndRequest { |
| int64_t request_id; |
| }; |
| |
| // TODO(crbug.com/426412563): Scope connection events to individual report |
| // URLs. |
| struct Connection { |
| bool connected; |
| }; |
| |
| struct Navigation {}; |
| |
| using Data = |
| std::variant<StartRequest, Response, EndRequest, Connection, Navigation>; |
| |
| base::Time time; |
| Data data; |
| |
| AttributionSimulationEvent(base::Time, Data); |
| |
| ~AttributionSimulationEvent(); |
| |
| AttributionSimulationEvent(const AttributionSimulationEvent&) = delete; |
| AttributionSimulationEvent& operator=(const AttributionSimulationEvent&) = |
| delete; |
| |
| AttributionSimulationEvent(AttributionSimulationEvent&&); |
| AttributionSimulationEvent& operator=(AttributionSimulationEvent&&); |
| }; |
| |
| // See //content/test/data/attribution_reporting/interop/README.md for the |
| // schema. |
| |
| base::expected<std::vector<AttributionSimulationEvent>, std::string> |
| ParseAttributionInteropInput(base::Value::Dict); |
| |
| struct AttributionInteropConfig { |
| AttributionConfig attribution_config; |
| double max_event_level_epsilon = 0; |
| uint32_t max_trigger_state_cardinality = 0; |
| bool needs_cross_app_web = false; |
| std::optional<std::string> needs_retry_after_new_navigation = std::nullopt; |
| std::vector<url::Origin> aggregation_coordinator_origins; |
| |
| AttributionInteropConfig(); |
| |
| AttributionInteropConfig(const AttributionInteropConfig&); |
| AttributionInteropConfig& operator=(const AttributionInteropConfig&); |
| |
| AttributionInteropConfig(AttributionInteropConfig&&); |
| AttributionInteropConfig& operator=(AttributionInteropConfig&&); |
| |
| ~AttributionInteropConfig(); |
| |
| friend bool operator==(const AttributionInteropConfig&, |
| const AttributionInteropConfig&) = default; |
| }; |
| |
| base::expected<AttributionInteropConfig, std::string> |
| ParseAttributionInteropConfig(base::Value::Dict); |
| |
| base::expected<void, std::string> MergeAttributionInteropConfig( |
| base::Value::Dict, |
| AttributionInteropConfig&); |
| |
| struct AttributionInteropOutput { |
| struct Report { |
| base::Time time; |
| GURL url; |
| base::Value payload; |
| |
| Report(); |
| Report(base::Time time, GURL url, base::Value payload); |
| |
| // These are necessary because `base::Value` is not copyable. |
| Report(const Report&); |
| Report& operator=(const Report&); |
| |
| base::Value::Dict ToJson() const; |
| |
| // TODO(apaseltiner): The payload comparison here is too brittle. Reports |
| // can be logically equivalent without having exactly the same JSON |
| // structure. |
| friend bool operator==(const Report&, const Report&) = default; |
| }; |
| |
| std::vector<Report> reports; |
| |
| AttributionInteropOutput(); |
| ~AttributionInteropOutput(); |
| |
| AttributionInteropOutput(const AttributionInteropOutput&) = delete; |
| AttributionInteropOutput& operator=(const AttributionInteropOutput&) = delete; |
| |
| AttributionInteropOutput(AttributionInteropOutput&&); |
| AttributionInteropOutput& operator=(AttributionInteropOutput&&); |
| |
| base::Value::Dict ToJson() const; |
| |
| static base::expected<AttributionInteropOutput, std::string> Parse( |
| base::Value::Dict); |
| }; |
| |
| std::ostream& operator<<(std::ostream&, |
| const AttributionInteropOutput::Report&); |
| |
| std::ostream& operator<<(std::ostream&, const AttributionInteropOutput&); |
| |
| struct AttributionInteropRun { |
| std::vector<AttributionSimulationEvent> events; |
| AttributionInteropConfig config; |
| |
| static base::expected<AttributionInteropRun, std::string> Parse( |
| base::Value::Dict, |
| const AttributionInteropConfig& default_config); |
| |
| AttributionInteropRun(); |
| |
| ~AttributionInteropRun(); |
| |
| AttributionInteropRun(const AttributionInteropRun&) = delete; |
| AttributionInteropRun& operator=(const AttributionInteropRun&) = delete; |
| |
| AttributionInteropRun(AttributionInteropRun&&); |
| AttributionInteropRun& operator=(AttributionInteropRun&&); |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_INTEROP_PARSER_H_ |