File: autofill_ablation_study.h

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,122,156 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 (105 lines) | stat: -rw-r--r-- 3,994 bytes parent folder | download | duplicates (6)
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
// 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.

#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_STUDIES_AUTOFILL_ABLATION_STUDY_H_
#define COMPONENTS_AUTOFILL_CORE_BROWSER_STUDIES_AUTOFILL_ABLATION_STUDY_H_

#include <stdint.h>

#include <string>
#include <string_view>

class GURL;
class PrefService;
namespace base {
class Time;
}
namespace autofill {
class AutofillOptimizationGuide;
}

namespace autofill {

// Number of days for which the ablation behavior stays constant for a client.
inline constexpr int kAblationWindowInDays = 14;

// The ablation group of a specific [site * 14 day window * seed].
enum class AblationGroup {
  // Autofill (the drop down or chip in the keyboard accessory) is disabled.
  kAblation,
  // Default behavior but labeled as control group to partition traffic in
  // shares such that the ablation and control group have the same size.
  kControl,
  kDefault,
};

// Distinction of form types. For ablation purposes, address and payment forms
// can be configured for ablation independently. Today we don't offer autofill
// for other form types. They would be put into the AblationGroup::kDefault.
enum class FormTypeForAblationStudy {
  kOther,
  kAddress,
  kPayment,
};

#if defined(UNIT_TEST)
int DaysSinceLocalWindowsEpoch(base::Time now);
uint64_t GetAblationHash(const std::string& seed,
                         const GURL& url,
                         base::Time now);
#endif  // defined(UNIT_TEST)

// Returns a number between 0 (incl.) and kAblationWindowInDays (excl.)
// reflecting the number of days that have passed since the beginning of an
// ablation window during which the ablation behavior remains constant for a
// client.
int GetDayInAblationWindow(base::Time now);

// A class to control the ablation study. The decision whether a given form
// is subject to an ablated experience is pseudorandomly derived from the
// combination of [site * 14 day window * seed]: Different sites may have
// ablation configurations. The ablation state changes every 14 days.
// Different users may have different ablation configurations.
// The ablation is controlled by features::kAutofillEnableAblationStudy.
class AutofillAblationStudy {
 public:
  // The `seed` controls diversion between clients. If `seed` is empty, clients
  // cannot participate in the ablation study and end-up in
  // AblationGroup::kDefault.
  explicit AutofillAblationStudy(std::string_view seed);
  // Constructs an ablation study with entropy stored in a preference in
  // `local_state`. `local_state`` may be a nullptr in which case, the study
  // always returns the `AblationGroup::kDefault`.
  explicit AutofillAblationStudy(PrefService* local_state);
  ~AutofillAblationStudy();
  AutofillAblationStudy(const AutofillAblationStudy&) = delete;
  AutofillAblationStudy& operator=(const AutofillAblationStudy&) = delete;

  // Returns an `AutofillAblationStudy` that always returns
  // `AblationGroup::kDefault`.
  static const AutofillAblationStudy& disabled_study();

  // Returns for a site and form type, whether autofill should give the ablated
  // experience. If `autofill_optimization_guide` is null, the
  // optimization_guide::proto::AUTOFILL_ABLATION_SITES_LISTx guides are not
  // consulted.
  AblationGroup GetAblationGroup(
      const GURL& url,
      FormTypeForAblationStudy form_type,
      AutofillOptimizationGuide* autofill_optimization_guide) const;

 private:
  AblationGroup GetAblationGroupImpl(const GURL& url,
                                     base::Time now,
                                     uint32_t ablation_weight_per_mille) const;

  // Seed so that different users (and browsing experiences) don't have
  // correlated behavior. If empty, clients cannot participate in the ablation
  // study.
  const std::string seed_;
};

}  // namespace autofill

#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_STUDIES_AUTOFILL_ABLATION_STUDY_H_