File: registrar_info.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (132 lines) | stat: -rw-r--r-- 4,505 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/attribution_reporting/registrar_info.h"

#include <optional>

#include "base/containers/enum_set.h"
#include "base/functional/function_ref.h"
#include "base/metrics/histogram_functions.h"
#include "components/attribution_reporting/registrar.h"
#include "services/network/public/cpp/attribution_utils.h"
#include "services/network/public/mojom/attribution.mojom-shared.h"

namespace attribution_reporting {

namespace {

using SetRegistrarOrIssueFunc = base::FunctionRef<
    void(bool, network::mojom::AttributionSupport, RegistrarInfo&)>;

void SetRegistrarOrIssue(
    bool is_source,
    network::mojom::AttributionSupport support,
    Registrar registrar,
    IssueType issue,
    base::FunctionRef<bool(network::mojom::AttributionSupport)> check_func,
    RegistrarInfo& info) {
  if (check_func(support)) {
    info.registrar = registrar;
  } else {
    info.issues.Put(issue);
  }
}

void SetWebRegistrarOrIssue(bool is_source,
                            network::mojom::AttributionSupport support,
                            RegistrarInfo& info) {
  SetRegistrarOrIssue(is_source, support, Registrar::kWeb,
                      IssueType::kWebIgnored,
                      &network::HasAttributionWebSupport, info);
}

void SetOsRegistrarOrIssue(bool is_source,
                           network::mojom::AttributionSupport support,
                           RegistrarInfo& info) {
  SetRegistrarOrIssue(is_source, support, Registrar::kOs, IssueType::kOsIgnored,
                      &network::HasAttributionOsSupport, info);
}

void HandlePreferredPlatform(bool is_source,
                             network::mojom::AttributionSupport support,
                             IssueType issue,
                             bool has_preferred_header,
                             SetRegistrarOrIssueFunc preferred_func,
                             bool has_secondary_header,
                             SetRegistrarOrIssueFunc secondary_func,
                             RegistrarInfo& info) {
  if (!has_preferred_header) {
    info.issues.Put(issue);
    return;
  }

  preferred_func(is_source, support, info);

  if (!info.registrar.has_value() && has_secondary_header) {
    secondary_func(is_source, support, info);
  }
}

}  // namespace

RegistrarInfo::RegistrarInfo() = default;

RegistrarInfo::~RegistrarInfo() = default;

RegistrarInfo::RegistrarInfo(const RegistrarInfo&) = default;

RegistrarInfo& RegistrarInfo::operator=(const RegistrarInfo&) = default;

RegistrarInfo::RegistrarInfo(RegistrarInfo&&) = default;

RegistrarInfo& RegistrarInfo::operator=(RegistrarInfo&&) = default;

// static
RegistrarInfo RegistrarInfo::Get(bool has_web_header,
                                 bool has_os_header,
                                 bool is_source,
                                 std::optional<Registrar> preferred_platform,
                                 network::mojom::AttributionSupport support) {
  if (!has_web_header && !has_os_header) {
    return RegistrarInfo();
  }

  RegistrarInfo info;

  if (preferred_platform.has_value()) {
    switch (preferred_platform.value()) {
      case attribution_reporting::Registrar::kWeb:
        HandlePreferredPlatform(is_source, support, IssueType::kNoWebHeader,
                                has_web_header, &SetWebRegistrarOrIssue,
                                has_os_header, &SetOsRegistrarOrIssue, info);
        break;
      case attribution_reporting::Registrar::kOs:
        HandlePreferredPlatform(is_source, support, IssueType::kNoOsHeader,
                                has_os_header, &SetOsRegistrarOrIssue,
                                has_web_header, &SetWebRegistrarOrIssue, info);
        break;
    }
  } else {
    if (has_web_header && has_os_header) {
      info.issues.Put(IssueType::kWebAndOsHeaders);
    } else if (has_web_header) {
      SetWebRegistrarOrIssue(is_source, support, info);
    } else if (has_os_header) {
      SetOsRegistrarOrIssue(is_source, support, info);
    }
  }

  const char* metric = is_source
                           ? "Conversions.SourceRegistrationRegistrarIssue"
                           : "Conversions.TriggerRegistrationRegistrarIssue";

  for (IssueType issue : info.issues) {
    base::UmaHistogramEnumeration(metric, issue);
  }

  return info;
}

}  // namespace attribution_reporting