File: server_prediction_overrides.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (156 lines) | stat: -rw-r--r-- 6,778 bytes parent folder | download | duplicates (3)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Copyright 2023 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_CROWDSOURCING_SERVER_PREDICTION_OVERRIDES_H_
#define COMPONENTS_AUTOFILL_CORE_BROWSER_CROWDSOURCING_SERVER_PREDICTION_OVERRIDES_H_

#include <deque>
#include <string>
#include <string_view>
#include <utility>

#include "base/containers/flat_map.h"
#include "base/types/expected.h"
#include "components/autofill/core/browser/proto/api_v1.pb.h"
#include "components/autofill/core/common/signatures.h"

namespace autofill {

using ServerPredictionOverrideKey = std::pair<FormSignature, FieldSignature>;
using ServerPredictionOverrides = base::flat_map<
    ServerPredictionOverrideKey,
    std::deque<AutofillQueryResponse::FormSuggestion::FieldSuggestion>>;

enum class OverrideFormat {
  // Overrides are strings of the format:
  //   override1-override2-override3-...
  // where each override has the following structure:
  //   formsignature_fieldsignature_typeprediction1_typeprediction2_...
  //
  // Here formsignature is the decimal representation of a `FormSignature`,
  // fieldsignature is a decimal representation of a `FieldSignature` and
  // typeprediction is the decimal representation of a FieldType (see
  // components/autofill/core/browser/field_types.h). Any number of type
  // predictions is permitted, including zero. If there are zero type
  // predictions, i.e., the override is formsignature_fieldsignature, then the
  // override acts as a "pass through", i.e. it defaults to server / local
  // predictions (more details in the examples).
  //
  // Example 1: Overrides for a single field:
  // Specification:
  //   10011880710453506489_1654523497_3
  // Effect:
  //   The prediction for the field with signature 1654523497 in the form
  //   with signature 10011880710453506489 is overridden to 3, i.e. NAME_FIRST.
  //
  // Example 2: Overrides for multiple fields:
  // Specification:
  //   10011880710453506489_1654523497_90-10011880710345406489_2001230230_9_100
  // Effect:
  //   The prediction for the field with signature 1654523497 in the form
  //   with signature 10011880710453506489 is overridden to 90, i.e.
  //   NOT_NEW_PASSWORD.
  //   The prediction for the field with signature 2001230230 in the form with
  //   signature 10011880710345406489 is overridden to two predictions, 9
  //   (EMAIL_ADDRESS) and 100 (SINGLE_USERNAME).
  //
  // The more complex cases occur when there are multiple fields with the same
  // form and field signature. In this case, the server can send multiple
  // `FieldSuggestion`s per (form signature, field signature) pair and they are
  // matched to the fields in the order in which they appear in the form. If
  // there are more fields (with this signature pair) in the form than there are
  // server predictions, then all additional fields will receive the last server
  // prediction. Manual overrides follow the same behavior.
  //
  // Example 3: Signature collision
  // Specification:
  //   10011880710453506489_1654523497_3-10011880710453506489_1654523497_5
  // Effect:
  //   The first field with field signature 1654523497 in the form with
  //   signature
  //   10011880710453506489 has type prediction 3 (NAME_FIRST), the second field
  //   with the same signatures has type prediction 5 (NAME_LAST), and if there
  //   are any further fields with the same signatures, they also receive type
  //   prediction 5.
  //
  // Finally, when there are signature collisions, it may be desirable to only
  // override some of the predictions. This can be achieved by using "pass
  // through"s, i.e. omitting a field type prediction.
  //
  // Example 4: Signature collision and pass through for initial field
  // Specification:
  //   10011880710453506489_1654523497-10011880710453506489_1654523497_5
  // Effect:
  //   The first field with field signature 1654523497 in the form with
  //   signature
  //   10011880710453506489 has no manually overridden type specification - it
  //   will be whatever the server or the local heuristics specify. The second
  //   field with the same signatures has type prediction 5 (NAME_LAST), and if
  //   there are any further fields with the same signatures, they also receive
  //   type prediction 5.
  //
  // Example 5: Signature collision and pass through for last field
  // Specification:
  //   10011880710453506489_1654523497_3-10011880710453506489_1654523497
  // Effect:
  //   The first field with field signature 1654523497 in the form with
  //   signature
  //   10011880710453506489 has its type specification manually overridden to 3.
  //   The second field and all other fields that follow will have whatever type
  //   the server (or the local heuristics) prescribe.
  //
  // Example 6: Overriding form signatures and alternative form signatures
  // Specification:
  //     10011880710453506489_1654523497_3-10488510731126445485_4130863203_100
  // Effect:
  //   Will override field 1654523497 in the form with form signature
  //   10011880710453506489 to 3 and field 4130863203 in the form with
  //   alternative form signature 10488510731126445485 to 100.
  kSpec,
  // Overrides are given in a JSON format.
  //
  // The following is an example for two forms, each of which has two fields:
  // - The form with signature 12345 has has fields with signatures 123 and 456.
  // - The form with signature 67890 has has two fields with signature 789.
  //
  //   {
  //     "12345": {
  //        "123": {
  //          "predictions": ["NAME_FIRST"]
  //        },
  //        "456": {
  //          "predictions": ["NAME_FIRST", "PASSPORT_NAME_TAG"]
  //        },
  //     },
  //     "67890": {
  //        "789": [ {
  //          "predictions": ["PASSPORT_ISSUE_DATE"],
  //          "format_string": "YYYY-MM-DD"
  //        }, {
  //          "predictions": [172],
  //          "format_string": "DD/MM/YYYY"
  //        } ],
  //     }
  //   }
  kJson
};

// Attempts to parse an override specification string into
// `ServerPredictionOverrides`.
//
// These overrides can be specified as follows:
//
//   chrome --enable-features=AutofillOverridePredictions:spec/SPECIFICATION
//   chrome --enable-features=AutofillOverridePredictions:json/BASE64_JSON
//
// where SPECIFICATION is a string as documented in OverrideFormat::kSpec and
// BASE64_JSON is a Base64-encoded JSON dict as documented in
// OverrideFormat::kJson.
base::expected<ServerPredictionOverrides, std::string>
ParseServerPredictionOverrides(std::string_view overrides_as_string,
                               OverrideFormat format);

}  // namespace autofill

#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_CROWDSOURCING_SERVER_PREDICTION_OVERRIDES_H_