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