blob: 42574f74f0b9653ffceb5988dbf816291478e745 [file] [log] [blame]
// 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.
#include "content/browser/attribution_reporting/create_report_result.h"
#include <optional>
#include <utility>
#include <variant>
#include "base/check.h"
#include "base/check_op.h"
#include "base/time/time.h"
#include "base/types/optional_util.h"
#include "content/browser/attribution_reporting/attribution_report.h"
#include "content/browser/attribution_reporting/attribution_trigger.h"
#include "content/browser/attribution_reporting/stored_source.h"
#include "third_party/abseil-cpp/absl/functional/overload.h"
namespace content {
namespace {
using EventLevelResult = ::content::AttributionTrigger::EventLevelResult;
using AggregatableResult = ::content::AttributionTrigger::AggregatableResult;
using EventLevelSuccess = ::content::CreateReportResult::EventLevelSuccess;
} // namespace
EventLevelSuccess::EventLevelSuccess(
AttributionReport new_report,
std::optional<AttributionReport> replaced_report)
: new_report(std::move(new_report)),
replaced_report(std::move(replaced_report)) {}
EventLevelSuccess::~EventLevelSuccess() = default;
EventLevelSuccess::EventLevelSuccess(const EventLevelSuccess&) = default;
EventLevelSuccess& EventLevelSuccess::operator=(const EventLevelSuccess&) =
default;
EventLevelSuccess::EventLevelSuccess(EventLevelSuccess&&) = default;
EventLevelSuccess& EventLevelSuccess::operator=(EventLevelSuccess&&) = default;
CreateReportResult::CreateReportResult(
base::Time trigger_time,
AttributionTrigger trigger,
EventLevel event_level_result,
Aggregatable aggregatable_result,
std::optional<StoredSource> source,
std::optional<base::Time> min_null_aggregatable_report_time)
: trigger_time_(trigger_time),
source_(std::move(source)),
min_null_aggregatable_report_time_(min_null_aggregatable_report_time),
event_level_result_(std::move(event_level_result)),
aggregatable_result_(std::move(aggregatable_result)),
trigger_(std::move(trigger)) {
if (EventLevelResult event_level_status = this->event_level_status();
event_level_status != EventLevelResult::kInternalError &&
event_level_status != EventLevelResult::kNotRegistered) {
CHECK_EQ(
source_.has_value(),
event_level_status != EventLevelResult::kNoMatchingImpressions &&
event_level_status != EventLevelResult::kProhibitedByBrowserPolicy);
}
if (AggregatableResult aggregatable_status = this->aggregatable_status();
aggregatable_status != AggregatableResult::kInternalError &&
aggregatable_status != AggregatableResult::kNotRegistered) {
CHECK_EQ(
source_.has_value(),
aggregatable_status != AggregatableResult::kNoMatchingImpressions &&
aggregatable_status !=
AggregatableResult::kProhibitedByBrowserPolicy);
}
}
CreateReportResult::~CreateReportResult() = default;
CreateReportResult::CreateReportResult(const CreateReportResult&) = default;
CreateReportResult::CreateReportResult(CreateReportResult&&) = default;
CreateReportResult& CreateReportResult::operator=(const CreateReportResult&) =
default;
CreateReportResult& CreateReportResult::operator=(CreateReportResult&&) =
default;
EventLevelResult CreateReportResult::event_level_status() const {
return std::visit(
absl::Overload{
[](const EventLevelSuccess& v) {
return v.replaced_report.has_value()
? EventLevelResult::kSuccessDroppedLowerPriority
: EventLevelResult::kSuccess;
},
[](const InternalError&) { return EventLevelResult::kInternalError; },
[](const NoCapacityForConversionDestination&) {
return EventLevelResult::kNoCapacityForConversionDestination;
},
[](const NoMatchingImpressions&) {
return EventLevelResult::kNoMatchingImpressions;
},
[](const Deduplicated&) { return EventLevelResult::kDeduplicated; },
[](const ExcessiveAttributions&) {
return EventLevelResult::kExcessiveAttributions;
},
[](const PriorityTooLow&) {
return EventLevelResult::kPriorityTooLow;
},
[](const NeverAttributedSource&) {
return EventLevelResult::kNeverAttributedSource;
},
[](const ExcessiveReportingOrigins&) {
return EventLevelResult::kExcessiveReportingOrigins;
},
[](const NoMatchingSourceFilterData&) {
return EventLevelResult::kNoMatchingSourceFilterData;
},
[](const ProhibitedByBrowserPolicy&) {
return EventLevelResult::kProhibitedByBrowserPolicy;
},
[](const NoMatchingConfigurations&) {
return EventLevelResult::kNoMatchingConfigurations;
},
[](const ExcessiveEventLevelReports&) {
return EventLevelResult::kExcessiveReports;
},
[](const FalselyAttributedSource&) {
return EventLevelResult::kFalselyAttributedSource;
},
[](const ReportWindowPassed&) {
return EventLevelResult::kReportWindowPassed;
},
[](const NotRegistered&) { return EventLevelResult::kNotRegistered; },
[](const ReportWindowNotStarted&) {
return EventLevelResult::kReportWindowNotStarted;
},
[](const NoMatchingTriggerData&) {
return EventLevelResult::kNoMatchingTriggerData;
},
},
event_level_result_);
}
AggregatableResult CreateReportResult::aggregatable_status() const {
return std::visit(
absl::Overload{
[](const AggregatableSuccess&) {
return AggregatableResult::kSuccess;
},
[](const InternalError&) {
return AggregatableResult::kInternalError;
},
[](const NoCapacityForConversionDestination&) {
return AggregatableResult::kNoCapacityForConversionDestination;
},
[](const NoMatchingImpressions&) {
return AggregatableResult::kNoMatchingImpressions;
},
[](const ExcessiveAttributions&) {
return AggregatableResult::kExcessiveAttributions;
},
[](const ExcessiveReportingOrigins&) {
return AggregatableResult::kExcessiveReportingOrigins;
},
[](const NoHistograms&) { return AggregatableResult::kNoHistograms; },
[](const InsufficientBudget&) {
return AggregatableResult::kInsufficientBudget;
},
[](const InsufficientNamedBudget&) {
return AggregatableResult::kInsufficientNamedBudget;
},
[](const NoMatchingSourceFilterData&) {
return AggregatableResult::kNoMatchingSourceFilterData;
},
[](const NotRegistered&) {
return AggregatableResult::kNotRegistered;
},
[](const ProhibitedByBrowserPolicy&) {
return AggregatableResult::kProhibitedByBrowserPolicy;
},
[](const Deduplicated&) { return AggregatableResult::kDeduplicated; },
[](const ReportWindowPassed&) {
return AggregatableResult::kReportWindowPassed;
},
[](const ExcessiveAggregatableReports) {
return AggregatableResult::kExcessiveReports;
},
},
aggregatable_result_);
}
const AttributionReport* CreateReportResult::replaced_event_level_report()
const {
if (const auto* v = std::get_if<EventLevelSuccess>(&event_level_result_)) {
return base::OptionalToPtr(v->replaced_report);
}
return nullptr;
}
const AttributionReport* CreateReportResult::new_event_level_report() const {
if (const auto* v = std::get_if<EventLevelSuccess>(&event_level_result_)) {
return &v->new_report;
}
return nullptr;
}
AttributionReport* CreateReportResult::new_event_level_report() {
if (auto* v = std::get_if<EventLevelSuccess>(&event_level_result_)) {
return &v->new_report;
}
return nullptr;
}
const AttributionReport* CreateReportResult::new_aggregatable_report() const {
if (const auto* v = std::get_if<AggregatableSuccess>(&aggregatable_result_)) {
return &v->new_report;
}
return nullptr;
}
AttributionReport* CreateReportResult::new_aggregatable_report() {
if (auto* v = std::get_if<AggregatableSuccess>(&aggregatable_result_)) {
return &v->new_report;
}
return nullptr;
}
const AttributionReport* CreateReportResult::dropped_event_level_report()
const {
return std::visit(
absl::Overload{
[](const PriorityTooLow& v) { return &v.dropped_report; },
[](const ExcessiveEventLevelReports& v) { return &v.dropped_report; },
[](const auto&) -> const AttributionReport* { return nullptr; }},
event_level_result_);
}
} // namespace content