1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/autofill/core/browser/ui/accessory_sheet_data.h"
6
7 #include "base/logging.h"
8 #include "base/strings/string_piece.h"
9 #include "components/autofill/core/browser/ui/accessory_sheet_enums.h"
10
11 namespace autofill {
12
Field(base::string16 display_text,base::string16 a11y_description,bool is_obfuscated,bool selectable)13 UserInfo::Field::Field(base::string16 display_text,
14 base::string16 a11y_description,
15 bool is_obfuscated,
16 bool selectable)
17 : display_text_(std::move(display_text)),
18 a11y_description_(std::move(a11y_description)),
19 is_obfuscated_(is_obfuscated),
20 selectable_(selectable) {}
21
Field(base::string16 display_text,base::string16 a11y_description,std::string id,bool is_obfuscated,bool selectable)22 UserInfo::Field::Field(base::string16 display_text,
23 base::string16 a11y_description,
24 std::string id,
25 bool is_obfuscated,
26 bool selectable)
27 : display_text_(std::move(display_text)),
28 a11y_description_(std::move(a11y_description)),
29 id_(std::move(id)),
30 is_obfuscated_(is_obfuscated),
31 selectable_(selectable) {}
32
33 UserInfo::Field::Field(const Field& field) = default;
34
35 UserInfo::Field::Field(Field&& field) = default;
36
37 UserInfo::Field::~Field() = default;
38
39 UserInfo::Field& UserInfo::Field::operator=(const Field& field) = default;
40
41 UserInfo::Field& UserInfo::Field::operator=(Field&& field) = default;
42
operator ==(const UserInfo::Field & field) const43 bool UserInfo::Field::operator==(const UserInfo::Field& field) const {
44 return display_text_ == field.display_text_ &&
45 a11y_description_ == field.a11y_description_ && id_ == field.id_ &&
46 is_obfuscated_ == field.is_obfuscated_ &&
47 selectable_ == field.selectable_;
48 }
49
operator <<(std::ostream & os,const UserInfo::Field & field)50 std::ostream& operator<<(std::ostream& os, const UserInfo::Field& field) {
51 os << "(display text: \"" << field.display_text() << "\", "
52 << "a11y_description: \"" << field.a11y_description() << "\", "
53 << "id: \"" << field.id() << "\", "
54 << "is " << (field.selectable() ? "" : "not ") << "selectable, "
55 << "is " << (field.is_obfuscated() ? "" : "not ") << "obfuscated)";
56 return os;
57 }
58
59 UserInfo::UserInfo() = default;
60
UserInfo(std::string origin)61 UserInfo::UserInfo(std::string origin)
62 : UserInfo(std::move(origin), IsPslMatch(false)) {}
63
UserInfo(std::string origin,IsPslMatch is_psl_match)64 UserInfo::UserInfo(std::string origin, IsPslMatch is_psl_match)
65 : origin_(std::move(origin)), is_psl_match_(is_psl_match) {}
66
67 UserInfo::UserInfo(const UserInfo& user_info) = default;
68
69 UserInfo::UserInfo(UserInfo&& field) = default;
70
71 UserInfo::~UserInfo() = default;
72
73 UserInfo& UserInfo::operator=(const UserInfo& user_info) = default;
74
75 UserInfo& UserInfo::operator=(UserInfo&& user_info) = default;
76
operator ==(const UserInfo & user_info) const77 bool UserInfo::operator==(const UserInfo& user_info) const {
78 return fields_ == user_info.fields_ && origin_ == user_info.origin_ &&
79 is_psl_match_ == user_info.is_psl_match_;
80 }
81
operator <<(std::ostream & os,const UserInfo & user_info)82 std::ostream& operator<<(std::ostream& os, const UserInfo& user_info) {
83 os << "origin: \"" << user_info.origin() << "\", "
84 << "is_psl_match: " << std::boolalpha << user_info.is_psl_match() << ", "
85 << "fields: [\n";
86 for (const UserInfo::Field& field : user_info.fields()) {
87 os << field << ", \n";
88 }
89 return os << "]";
90 }
91
FooterCommand(base::string16 display_text,autofill::AccessoryAction action)92 FooterCommand::FooterCommand(base::string16 display_text,
93 autofill::AccessoryAction action)
94 : display_text_(std::move(display_text)), accessory_action_(action) {}
95
96 FooterCommand::FooterCommand(const FooterCommand& footer_command) = default;
97
98 FooterCommand::FooterCommand(FooterCommand&& footer_command) = default;
99
100 FooterCommand::~FooterCommand() = default;
101
102 FooterCommand& FooterCommand::operator=(const FooterCommand& footer_command) =
103 default;
104
105 FooterCommand& FooterCommand::operator=(FooterCommand&& footer_command) =
106 default;
107
operator ==(const FooterCommand & fc) const108 bool FooterCommand::operator==(const FooterCommand& fc) const {
109 return display_text_ == fc.display_text_ &&
110 accessory_action_ == fc.accessory_action_;
111 }
112
operator <<(std::ostream & os,const FooterCommand & fc)113 std::ostream& operator<<(std::ostream& os, const FooterCommand& fc) {
114 return os << "(display text: \"" << fc.display_text() << "\", "
115 << "action: " << static_cast<int>(fc.accessory_action()) << ")";
116 }
117
OptionToggle(base::string16 display_text,bool enabled,autofill::AccessoryAction action)118 OptionToggle::OptionToggle(base::string16 display_text,
119 bool enabled,
120 autofill::AccessoryAction action)
121 : display_text_(display_text),
122 enabled_(enabled),
123 accessory_action_(action) {}
124
125 OptionToggle::OptionToggle(const OptionToggle& option_toggle) = default;
126
127 OptionToggle::OptionToggle(OptionToggle&& option_toggle) = default;
128
129 OptionToggle::~OptionToggle() = default;
130
131 OptionToggle& OptionToggle::operator=(const OptionToggle& option_toggle) =
132 default;
133
134 OptionToggle& OptionToggle::operator=(OptionToggle&& option_toggle) = default;
135
operator ==(const OptionToggle & option_toggle) const136 bool OptionToggle::operator==(const OptionToggle& option_toggle) const {
137 return display_text_ == option_toggle.display_text_ &&
138 enabled_ == option_toggle.enabled_ &&
139 accessory_action_ == option_toggle.accessory_action_;
140 }
141
operator <<(std::ostream & os,const OptionToggle & ot)142 std::ostream& operator<<(std::ostream& os, const OptionToggle& ot) {
143 return os << "(display text: \"" << ot.display_text() << "\", "
144 << "state: " << ot.is_enabled() << ", "
145 << "action: " << static_cast<int>(ot.accessory_action()) << ")";
146 }
147
operator <<(std::ostream & os,const AccessoryTabType & type)148 std::ostream& operator<<(std::ostream& os, const AccessoryTabType& type) {
149 switch (type) {
150 case AccessoryTabType::PASSWORDS:
151 return os << "Passwords sheet";
152 case AccessoryTabType::CREDIT_CARDS:
153 return os << "Payments sheet";
154 case AccessoryTabType::ADDRESSES:
155 return os << "Address sheet";
156 case AccessoryTabType::TOUCH_TO_FILL:
157 return os << "Touch to Fill sheet";
158 case AccessoryTabType::ALL:
159 return os << "All sheets";
160 case AccessoryTabType::COUNT:
161 return os << "Invalid sheet";
162 }
163 return os;
164 }
165
AccessorySheetData(AccessoryTabType sheet_type,base::string16 title)166 AccessorySheetData::AccessorySheetData(AccessoryTabType sheet_type,
167 base::string16 title)
168 : AccessorySheetData(sheet_type, std::move(title), base::string16()) {}
AccessorySheetData(AccessoryTabType sheet_type,base::string16 title,base::string16 warning)169 AccessorySheetData::AccessorySheetData(AccessoryTabType sheet_type,
170 base::string16 title,
171 base::string16 warning)
172 : sheet_type_(sheet_type),
173 title_(std::move(title)),
174 warning_(std::move(warning)) {}
175
176 AccessorySheetData::AccessorySheetData(const AccessorySheetData& data) =
177 default;
178
179 AccessorySheetData::AccessorySheetData(AccessorySheetData&& data) = default;
180
181 AccessorySheetData::~AccessorySheetData() = default;
182
183 AccessorySheetData& AccessorySheetData::operator=(
184 const AccessorySheetData& data) = default;
185
186 AccessorySheetData& AccessorySheetData::operator=(AccessorySheetData&& data) =
187 default;
188
operator ==(const AccessorySheetData & data) const189 bool AccessorySheetData::operator==(const AccessorySheetData& data) const {
190 return sheet_type_ == data.sheet_type_ && title_ == data.title_ &&
191 warning_ == data.warning_ && option_toggle_ == data.option_toggle_ &&
192 user_info_list_ == data.user_info_list_ &&
193 footer_commands_ == data.footer_commands_;
194 }
195
operator <<(std::ostream & os,const AccessorySheetData & data)196 std::ostream& operator<<(std::ostream& os, const AccessorySheetData& data) {
197 os << data.get_sheet_type() << " with title: \"" << data.title();
198 if (data.option_toggle().has_value()) {
199 os << "\", with option toggle: \"" << data.option_toggle().value();
200 } else {
201 os << "\", with option toggle: \"none";
202 }
203
204 os << "\", warning: \"" << data.warning() << "\", and user info list: [";
205 for (const UserInfo& user_info : data.user_info_list()) {
206 os << user_info << ", ";
207 }
208 os << "], footer commands: [";
209 for (const FooterCommand& footer_command : data.footer_commands()) {
210 os << footer_command << ", ";
211 }
212 return os << "]";
213 }
214
Builder(AccessoryTabType type,base::string16 title)215 AccessorySheetData::Builder::Builder(AccessoryTabType type,
216 base::string16 title)
217 : accessory_sheet_data_(type, std::move(title)) {}
218
219 AccessorySheetData::Builder::~Builder() = default;
220
SetWarning(base::string16 warning)221 AccessorySheetData::Builder&& AccessorySheetData::Builder::SetWarning(
222 base::string16 warning) && {
223 // Calls SetWarning(base::string16 warning)()& since |this| is an lvalue.
224 return std::move(SetWarning(std::move(warning)));
225 }
226
SetWarning(base::string16 warning)227 AccessorySheetData::Builder& AccessorySheetData::Builder::SetWarning(
228 base::string16 warning) & {
229 accessory_sheet_data_.set_warning(std::move(warning));
230 return *this;
231 }
232
SetOptionToggle(base::string16 display_text,bool enabled,autofill::AccessoryAction action)233 AccessorySheetData::Builder&& AccessorySheetData::Builder::SetOptionToggle(
234 base::string16 display_text,
235 bool enabled,
236 autofill::AccessoryAction action) && {
237 // Calls SetOptionToggle(...)& since |this| is an lvalue.
238 return std::move(SetOptionToggle(std::move(display_text), enabled, action));
239 }
240
SetOptionToggle(base::string16 display_text,bool enabled,autofill::AccessoryAction action)241 AccessorySheetData::Builder& AccessorySheetData::Builder::SetOptionToggle(
242 base::string16 display_text,
243 bool enabled,
244 autofill::AccessoryAction action) & {
245 accessory_sheet_data_.set_option_toggle(
246 OptionToggle(std::move(display_text), enabled, action));
247 return *this;
248 }
249
AddUserInfo(std::string origin,UserInfo::IsPslMatch is_psl_match)250 AccessorySheetData::Builder&& AccessorySheetData::Builder::AddUserInfo(
251 std::string origin,
252 UserInfo::IsPslMatch is_psl_match) && {
253 // Calls AddUserInfo()& since |this| is an lvalue.
254 return std::move(AddUserInfo(std::move(origin), is_psl_match));
255 }
256
AddUserInfo(std::string origin,UserInfo::IsPslMatch is_psl_match)257 AccessorySheetData::Builder& AccessorySheetData::Builder::AddUserInfo(
258 std::string origin,
259 UserInfo::IsPslMatch is_psl_match) & {
260 accessory_sheet_data_.add_user_info(
261 UserInfo(std::move(origin), is_psl_match));
262 return *this;
263 }
264
AppendSimpleField(base::string16 text)265 AccessorySheetData::Builder&& AccessorySheetData::Builder::AppendSimpleField(
266 base::string16 text) && {
267 // Calls AppendSimpleField(...)& since |this| is an lvalue.
268 return std::move(AppendSimpleField(std::move(text)));
269 }
270
AppendSimpleField(base::string16 text)271 AccessorySheetData::Builder& AccessorySheetData::Builder::AppendSimpleField(
272 base::string16 text) & {
273 base::string16 display_text = text;
274 base::string16 a11y_description = std::move(text);
275 return AppendField(std::move(display_text), std::move(a11y_description),
276 false, true);
277 }
278
AppendField(base::string16 display_text,base::string16 a11y_description,bool is_obfuscated,bool selectable)279 AccessorySheetData::Builder&& AccessorySheetData::Builder::AppendField(
280 base::string16 display_text,
281 base::string16 a11y_description,
282 bool is_obfuscated,
283 bool selectable) && {
284 // Calls AppendField(...)& since |this| is an lvalue.
285 return std::move(AppendField(std::move(display_text),
286 std::move(a11y_description), is_obfuscated,
287 selectable));
288 }
289
AppendField(base::string16 display_text,base::string16 a11y_description,bool is_obfuscated,bool selectable)290 AccessorySheetData::Builder& AccessorySheetData::Builder::AppendField(
291 base::string16 display_text,
292 base::string16 a11y_description,
293 bool is_obfuscated,
294 bool selectable) & {
295 accessory_sheet_data_.mutable_user_info_list().back().add_field(
296 UserInfo::Field(std::move(display_text), std::move(a11y_description),
297 is_obfuscated, selectable));
298 return *this;
299 }
300
AppendField(base::string16 display_text,base::string16 a11y_description,std::string id,bool is_obfuscated,bool selectable)301 AccessorySheetData::Builder&& AccessorySheetData::Builder::AppendField(
302 base::string16 display_text,
303 base::string16 a11y_description,
304 std::string id,
305 bool is_obfuscated,
306 bool selectable) && {
307 // Calls AppendField(...)& since |this| is an lvalue.
308 return std::move(AppendField(std::move(display_text),
309 std::move(a11y_description), std::move(id),
310 is_obfuscated, selectable));
311 }
312
AppendField(base::string16 display_text,base::string16 a11y_description,std::string id,bool is_obfuscated,bool selectable)313 AccessorySheetData::Builder& AccessorySheetData::Builder::AppendField(
314 base::string16 display_text,
315 base::string16 a11y_description,
316 std::string id,
317 bool is_obfuscated,
318 bool selectable) & {
319 accessory_sheet_data_.mutable_user_info_list().back().add_field(
320 UserInfo::Field(std::move(display_text), std::move(a11y_description),
321 std::move(id), is_obfuscated, selectable));
322 return *this;
323 }
324
AppendFooterCommand(base::string16 display_text,autofill::AccessoryAction action)325 AccessorySheetData::Builder&& AccessorySheetData::Builder::AppendFooterCommand(
326 base::string16 display_text,
327 autofill::AccessoryAction action) && {
328 // Calls AppendFooterCommand(...)& since |this| is an lvalue.
329 return std::move(AppendFooterCommand(std::move(display_text), action));
330 }
331
AppendFooterCommand(base::string16 display_text,autofill::AccessoryAction action)332 AccessorySheetData::Builder& AccessorySheetData::Builder::AppendFooterCommand(
333 base::string16 display_text,
334 autofill::AccessoryAction action) & {
335 accessory_sheet_data_.add_footer_command(
336 FooterCommand(std::move(display_text), action));
337 return *this;
338 }
339
Build()340 AccessorySheetData&& AccessorySheetData::Builder::Build() && {
341 return std::move(accessory_sheet_data_);
342 }
343
344 } // namespace autofill
345