blob: 91226b3750fa7c56e64865545116cec46c5ee722 [file] [log] [blame]
// Copyright 2021 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/attribution_utils.h"
#include <vector>
#include "base/check.h"
#include "base/check_op.h"
#include "base/containers/span.h"
#include "base/json/json_writer.h"
#include "base/time/time.h"
#include "base/values.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace content {
namespace {
constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1);
} // namespace
base::TimeDelta ExpiryDeadline(base::Time source_time,
base::Time event_report_window_time) {
DCHECK_GT(event_report_window_time, source_time);
return event_report_window_time - source_time;
}
base::Time ReportTimeFromDeadline(base::Time source_time,
base::TimeDelta deadline) {
// Valid conversion reports should always have a valid reporting deadline.
DCHECK(!deadline.is_zero());
return source_time + deadline + kWindowDeadlineOffset;
}
base::Time ComputeReportTime(base::Time source_time,
base::Time trigger_time,
base::span<const base::TimeDelta> deadlines) {
// Follows the steps detailed in
// https://wicg.github.io/attribution-reporting-api/#obtain-an-event-level-report-delivery-time
// Starting from step 2.
DCHECK(!deadlines.empty());
base::TimeDelta deadline_to_use = deadlines.back();
for (base::TimeDelta deadline : deadlines) {
if (source_time + deadline < trigger_time) {
continue;
}
deadline_to_use = deadline;
break;
}
return ReportTimeFromDeadline(source_time, deadline_to_use);
}
base::Time LastTriggerTimeForReportTime(base::Time report_time) {
return report_time - kWindowDeadlineOffset;
}
std::string SerializeAttributionJson(base::ValueView body, bool pretty_print) {
int options = pretty_print ? base::JSONWriter::OPTIONS_PRETTY_PRINT : 0;
std::string output_json;
bool success =
base::JSONWriter::WriteWithOptions(body, options, &output_json);
DCHECK(success);
return output_json;
}
base::Time ComputeReportWindowTime(
absl::optional<base::Time> report_window_time,
base::Time expiry_time) {
return report_window_time.has_value() &&
report_window_time.value() <= expiry_time
? report_window_time.value()
: expiry_time;
}
} // namespace content