1 // Copyright 2013 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.
8 #include "base/json/json_writer.h"
9 #include "base/strings/string16.h"
10 #include "base/strings/string_util.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/values.h"
13 #include "components/autofill/core/common/password_form.h"
19 // Serializes a PasswordForm to a JSON object. Used only for logging in tests.
20 void PasswordFormToJSON(const PasswordForm
& form
,
21 base::DictionaryValue
* target
) {
22 target
->SetInteger("scheme", form
.scheme
);
23 target
->SetString("signon_realm", form
.signon_realm
);
24 target
->SetString("signon_realm", form
.signon_realm
);
25 target
->SetString("original_signon_realm", form
.original_signon_realm
);
26 target
->SetString("origin", form
.origin
.possibly_invalid_spec());
27 target
->SetString("action", form
.action
.possibly_invalid_spec());
28 target
->SetString("submit_element", form
.submit_element
);
29 target
->SetString("username_elem", form
.username_element
);
30 target
->SetBoolean("username_marked_by_site", form
.username_marked_by_site
);
31 target
->SetString("username_value", form
.username_value
);
32 target
->SetString("password_elem", form
.password_element
);
33 target
->SetString("password_value", form
.password_value
);
34 target
->SetString("new_password_element", form
.new_password_element
);
35 target
->SetString("new_password_value", form
.new_password_value
);
36 target
->SetBoolean("new_password_marked_by_site",
37 form
.new_password_marked_by_site
);
38 target
->SetString("other_possible_usernames",
39 JoinString(form
.other_possible_usernames
, '|'));
40 target
->SetBoolean("autocomplete_set", form
.password_autocomplete_set
);
41 target
->SetBoolean("blacklisted", form
.blacklisted_by_user
);
42 target
->SetBoolean("preferred", form
.preferred
);
43 target
->SetBoolean("ssl_valid", form
.ssl_valid
);
44 target
->SetDouble("date_created", form
.date_created
.ToDoubleT());
45 target
->SetDouble("date_synced", form
.date_synced
.ToDoubleT());
46 target
->SetInteger("type", form
.type
);
47 target
->SetInteger("times_used", form
.times_used
);
48 std::ostringstream form_data_string_stream
;
49 form_data_string_stream
<< form
.form_data
;
50 target
->SetString("form_data", form_data_string_stream
.str());
51 target
->SetInteger("generation_upload_status", form
.generation_upload_status
);
52 target
->SetString("display_name", form
.display_name
);
53 target
->SetString("avatar_url", form
.avatar_url
.possibly_invalid_spec());
54 target
->SetString("federation_url",
55 form
.federation_url
.possibly_invalid_spec());
56 target
->SetBoolean("skip_next_zero_click", form
.skip_zero_click
);
57 std::ostringstream layout_string_stream
;
58 layout_string_stream
<< form
.layout
;
59 target
->SetString("layout", layout_string_stream
.str());
60 target
->SetBoolean("was_parsed_using_autofill_predictions",
61 form
.was_parsed_using_autofill_predictions
);
66 PasswordForm::PasswordForm()
67 : scheme(SCHEME_HTML
),
68 username_marked_by_site(false),
69 password_autocomplete_set(true),
70 new_password_marked_by_site(false),
73 blacklisted_by_user(false),
76 generation_upload_status(NO_SIGNAL_SENT
),
77 skip_zero_click(false),
78 layout(Layout::LAYOUT_OTHER
),
79 was_parsed_using_autofill_predictions(false) {
82 PasswordForm::~PasswordForm() {
85 bool PasswordForm::IsPublicSuffixMatch() const {
86 return !original_signon_realm
.empty();
89 bool PasswordForm::operator==(const PasswordForm
& form
) const {
90 return scheme
== form
.scheme
&&
91 signon_realm
== form
.signon_realm
&&
92 original_signon_realm
== form
.original_signon_realm
&&
93 origin
== form
.origin
&&
94 action
== form
.action
&&
95 submit_element
== form
.submit_element
&&
96 username_element
== form
.username_element
&&
97 username_marked_by_site
== form
.username_marked_by_site
&&
98 username_value
== form
.username_value
&&
99 other_possible_usernames
== form
.other_possible_usernames
&&
100 password_element
== form
.password_element
&&
101 password_value
== form
.password_value
&&
102 password_autocomplete_set
== form
.password_autocomplete_set
&&
103 new_password_element
== form
.new_password_element
&&
104 new_password_marked_by_site
== form
.new_password_marked_by_site
&&
105 new_password_value
== form
.new_password_value
&&
106 ssl_valid
== form
.ssl_valid
&&
107 preferred
== form
.preferred
&&
108 date_created
== form
.date_created
&&
109 date_synced
== form
.date_synced
&&
110 blacklisted_by_user
== form
.blacklisted_by_user
&&
112 times_used
== form
.times_used
&&
113 form_data
.SameFormAs(form
.form_data
) &&
114 generation_upload_status
== form
.generation_upload_status
&&
115 display_name
== form
.display_name
&&
116 avatar_url
== form
.avatar_url
&&
117 federation_url
== form
.federation_url
&&
118 skip_zero_click
== form
.skip_zero_click
&&
119 layout
== form
.layout
&&
120 was_parsed_using_autofill_predictions
==
121 form
.was_parsed_using_autofill_predictions
;
124 bool PasswordForm::operator!=(const PasswordForm
& form
) const {
125 return !operator==(form
);
128 std::ostream
& operator<<(std::ostream
& os
, PasswordForm::Layout layout
) {
130 case PasswordForm::Layout::LAYOUT_OTHER
:
131 os
<< "LAYOUT_OTHER";
133 case PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP
:
134 os
<< "LAYOUT_LOGIN_AND_SIGNUP";
140 std::ostream
& operator<<(std::ostream
& os
, const PasswordForm
& form
) {
141 base::DictionaryValue form_json
;
142 PasswordFormToJSON(form
, &form_json
);
144 // Serialize the default PasswordForm, and remove values from the result that
145 // are equal to this to make the results more concise.
146 base::DictionaryValue default_form_json
;
147 PasswordFormToJSON(PasswordForm(), &default_form_json
);
148 for (base::DictionaryValue::Iterator
it_default_key_values(default_form_json
);
149 !it_default_key_values
.IsAtEnd(); it_default_key_values
.Advance()) {
150 const base::Value
* actual_value
;
151 if (form_json
.Get(it_default_key_values
.key(), &actual_value
) &&
152 it_default_key_values
.value().Equals(actual_value
)) {
153 form_json
.Remove(it_default_key_values
.key(), nullptr);
157 std::string form_as_string
;
158 base::JSONWriter::WriteWithOptions(
159 &form_json
, base::JSONWriter::OPTIONS_PRETTY_PRINT
, &form_as_string
);
160 base::TrimWhitespaceASCII(form_as_string
, base::TRIM_ALL
, &form_as_string
);
161 return os
<< "PasswordForm(" << form_as_string
<< ")";
164 std::ostream
& operator<<(std::ostream
& os
, PasswordForm
* form
) {
165 return os
<< "&" << *form
;
168 } // namespace autofill