Autofill: Add WalletIntegrationAvailable() to components.
[chromium-blink-merge.git] / components / autofill / core / common / password_form.cc
blob110a08e0e1cd320ff51740d8a7b80da0e1fe0b72
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.
5 #include <ostream>
6 #include <sstream>
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"
15 namespace autofill {
17 namespace {
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);
64 } // namespace
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),
71 ssl_valid(false),
72 preferred(false),
73 blacklisted_by_user(false),
74 type(TYPE_MANUAL),
75 times_used(0),
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 &&
111 type == form.type &&
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) {
129 switch (layout) {
130 case PasswordForm::Layout::LAYOUT_OTHER:
131 os << "LAYOUT_OTHER";
132 break;
133 case PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP:
134 os << "LAYOUT_LOGIN_AND_SIGNUP";
135 break;
137 return os;
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