Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: components/autofill/content/browser/wallet/wallet_address.cc

Issue 151383003: Updates to wallet for i18n (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: retry upload Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/autofill/content/browser/wallet/wallet_address.h" 5 #include "components/autofill/content/browser/wallet/wallet_address.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/strings/string_split.h"
8 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
10 #include "base/values.h" 11 #include "base/values.h"
11 #include "components/autofill/core/browser/autofill_country.h" 12 #include "components/autofill/core/browser/autofill_country.h"
12 #include "components/autofill/core/browser/autofill_profile.h" 13 #include "components/autofill/core/browser/autofill_profile.h"
13 #include "components/autofill/core/browser/autofill_type.h" 14 #include "components/autofill/core/browser/autofill_type.h"
14 #include "components/autofill/core/browser/phone_number.h" 15 #include "components/autofill/core/browser/phone_number.h"
15 #include "components/autofill/core/browser/state_names.h" 16 #include "components/autofill/core/browser/state_names.h"
16 17
17 namespace autofill { 18 namespace autofill {
(...skipping 19 matching lines...) Expand all
37 DLOG(ERROR) << "Response from Google Wallet missing recipient name"; 38 DLOG(ERROR) << "Response from Google Wallet missing recipient name";
38 return NULL; 39 return NULL;
39 } 40 }
40 41
41 base::string16 postal_code_number; 42 base::string16 postal_code_number;
42 if (!dictionary.GetString("postal_address.postal_code_number", 43 if (!dictionary.GetString("postal_address.postal_code_number",
43 &postal_code_number)) { 44 &postal_code_number)) {
44 DLOG(ERROR) << "Response from Google Wallet missing postal code number"; 45 DLOG(ERROR) << "Response from Google Wallet missing postal code number";
45 return NULL; 46 return NULL;
46 } 47 }
48 // TODO(estade): what about postal_code_number_extension?
49
50 base::string16 sorting_code;
51 if (!dictionary.GetString("postal_address.sorting_code",
52 &sorting_code)) {
53 DVLOG(1) << "Response from Google Wallet missing sorting code";
54 }
47 55
48 base::string16 phone_number; 56 base::string16 phone_number;
49 if (!dictionary.GetString("phone_number", &phone_number)) 57 if (!dictionary.GetString("phone_number", &phone_number))
50 DVLOG(1) << "Response from Google Wallet missing phone number"; 58 DVLOG(1) << "Response from Google Wallet missing phone number";
51 59
52 base::string16 address_line_1; 60 std::vector<base::string16> street_address;
53 base::string16 address_line_2;
54 const base::ListValue* address_line_list; 61 const base::ListValue* address_line_list;
55 if (dictionary.GetList("postal_address.address_line", &address_line_list)) { 62 if (dictionary.GetList("postal_address.address_line", &address_line_list)) {
56 if (!address_line_list->GetString(0, &address_line_1)) 63 for (size_t i = 0; i < address_line_list->GetSize(); ++i) {
57 DVLOG(1) << "Response from Google Wallet missing address line 1"; 64 base::string16 line;
58 if (!address_line_list->GetString(1, &address_line_2)) 65 address_line_list->GetString(i, &line);
59 DVLOG(1) << "Response from Google Wallet missing address line 2"; 66 street_address.push_back(line);
67 }
60 } else { 68 } else {
61 DVLOG(1) << "Response from Google Wallet missing address lines"; 69 DVLOG(1) << "Response from Google Wallet missing address lines";
62 } 70 }
63 71
64 base::string16 locality_name; 72 base::string16 locality_name;
65 if (!dictionary.GetString("postal_address.locality_name", 73 if (!dictionary.GetString("postal_address.locality_name",
66 &locality_name)) { 74 &locality_name)) {
67 DVLOG(1) << "Response from Google Wallet missing locality name"; 75 DVLOG(1) << "Response from Google Wallet missing locality name";
68 } 76 }
69 77
78 base::string16 dependent_locality_name;
79 if (!dictionary.GetString("postal_address.dependent_locality_name",
80 &dependent_locality_name)) {
81 DVLOG(1) << "Response from Google Wallet missing dependent locality name";
82 }
83
70 base::string16 administrative_area_name; 84 base::string16 administrative_area_name;
71 if (!dictionary.GetString("postal_address.administrative_area_name", 85 if (!dictionary.GetString("postal_address.administrative_area_name",
72 &administrative_area_name)) { 86 &administrative_area_name)) {
73 DVLOG(1) << "Response from Google Wallet missing administrative area name"; 87 DVLOG(1) << "Response from Google Wallet missing administrative area name";
74 } 88 }
75 89
76 Address* address = new Address(country_name_code, 90 Address* address = new Address(country_name_code,
77 recipient_name, 91 recipient_name,
78 address_line_1, 92 street_address,
79 address_line_2,
80 locality_name, 93 locality_name,
94 dependent_locality_name,
81 administrative_area_name, 95 administrative_area_name,
82 postal_code_number, 96 postal_code_number,
97 sorting_code,
83 phone_number, 98 phone_number,
84 object_id); 99 object_id);
85 100
86 bool is_minimal_address = false; 101 bool is_minimal_address = false;
87 if (dictionary.GetBoolean("is_minimal_address", &is_minimal_address)) 102 if (dictionary.GetBoolean("is_minimal_address", &is_minimal_address))
88 address->set_is_complete_address(!is_minimal_address); 103 address->set_is_complete_address(!is_minimal_address);
89 else 104 else
90 DVLOG(1) << "Response from Google Wallet missing is_minimal_address bit"; 105 DVLOG(1) << "Response from Google Wallet missing is_minimal_address bit";
91 106
92 return address; 107 return address;
93 } 108 }
94 109
95 } // namespace 110 } // namespace
96 111
97 Address::Address() {} 112 Address::Address() {}
98 113
99 Address::Address(const AutofillProfile& profile) 114 Address::Address(const AutofillProfile& profile)
100 : country_name_code_( 115 : country_name_code_(
101 UTF16ToASCII(profile.GetRawInfo(ADDRESS_HOME_COUNTRY))), 116 UTF16ToASCII(profile.GetRawInfo(ADDRESS_HOME_COUNTRY))),
102 recipient_name_(profile.GetRawInfo(NAME_FULL)), 117 recipient_name_(profile.GetRawInfo(NAME_FULL)),
103 address_line_1_(profile.GetRawInfo(ADDRESS_HOME_LINE1)),
104 address_line_2_(profile.GetRawInfo(ADDRESS_HOME_LINE2)),
105 locality_name_(profile.GetRawInfo(ADDRESS_HOME_CITY)), 118 locality_name_(profile.GetRawInfo(ADDRESS_HOME_CITY)),
119 dependent_locality_name_(
120 profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)),
106 administrative_area_name_(profile.GetRawInfo(ADDRESS_HOME_STATE)), 121 administrative_area_name_(profile.GetRawInfo(ADDRESS_HOME_STATE)),
107 postal_code_number_(profile.GetRawInfo(ADDRESS_HOME_ZIP)), 122 postal_code_number_(profile.GetRawInfo(ADDRESS_HOME_ZIP)),
123 sorting_code_(profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)),
108 phone_number_(profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)), 124 phone_number_(profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)),
109 is_complete_address_(true) { 125 is_complete_address_(true) {
126 base::SplitString(
127 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS), '\n', &street_address_);
128
110 if (!country_name_code_.empty()) 129 if (!country_name_code_.empty())
111 phone_object_ = i18n::PhoneObject(phone_number_, country_name_code_); 130 phone_object_ = i18n::PhoneObject(phone_number_, country_name_code_);
112 } 131 }
113 132
114 Address::Address(const std::string& country_name_code, 133 Address::Address(const std::string& country_name_code,
115 const base::string16& recipient_name, 134 const base::string16& recipient_name,
116 const base::string16& address_line_1, 135 const std::vector<base::string16>& street_address,
117 const base::string16& address_line_2,
118 const base::string16& locality_name, 136 const base::string16& locality_name,
137 const base::string16& dependent_locality_name,
119 const base::string16& administrative_area_name, 138 const base::string16& administrative_area_name,
120 const base::string16& postal_code_number, 139 const base::string16& postal_code_number,
140 const base::string16& sorting_code,
121 const base::string16& phone_number, 141 const base::string16& phone_number,
122 const std::string& object_id) 142 const std::string& object_id)
123 : country_name_code_(country_name_code), 143 : country_name_code_(country_name_code),
124 recipient_name_(recipient_name), 144 recipient_name_(recipient_name),
125 address_line_1_(address_line_1), 145 street_address_(street_address),
126 address_line_2_(address_line_2),
127 locality_name_(locality_name), 146 locality_name_(locality_name),
147 dependent_locality_name_(dependent_locality_name),
128 administrative_area_name_(administrative_area_name), 148 administrative_area_name_(administrative_area_name),
129 postal_code_number_(postal_code_number), 149 postal_code_number_(postal_code_number),
150 sorting_code_(sorting_code),
130 phone_number_(phone_number), 151 phone_number_(phone_number),
131 phone_object_(phone_number, country_name_code), 152 phone_object_(phone_number, country_name_code),
132 object_id_(object_id), 153 object_id_(object_id),
133 is_complete_address_(true) {} 154 is_complete_address_(true) {}
134 155
135 Address::~Address() {} 156 Address::~Address() {}
136 157
137 // static 158 // static
138 scoped_ptr<Address> Address::CreateAddressWithID( 159 scoped_ptr<Address> Address::CreateAddressWithID(
139 const base::DictionaryValue& dictionary) { 160 const base::DictionaryValue& dictionary) {
(...skipping 27 matching lines...) Expand all
167 DLOG(ERROR) << "Reponse from Google Wallet missing name"; 188 DLOG(ERROR) << "Reponse from Google Wallet missing name";
168 return scoped_ptr<Address>(); 189 return scoped_ptr<Address>();
169 } 190 }
170 191
171 base::string16 postal_code; 192 base::string16 postal_code;
172 if (!dictionary.GetString("postal_code", &postal_code)) { 193 if (!dictionary.GetString("postal_code", &postal_code)) {
173 DLOG(ERROR) << "Reponse from Google Wallet missing postal code"; 194 DLOG(ERROR) << "Reponse from Google Wallet missing postal code";
174 return scoped_ptr<Address>(); 195 return scoped_ptr<Address>();
175 } 196 }
176 197
198 base::string16 sorting_code;
199 if (!dictionary.GetString("sorting_code", &sorting_code)) {
200 DVLOG(1) << "Reponse from Google Wallet missing sorting code";
201 }
202
203 std::vector<base::string16> street_address;
177 base::string16 address1; 204 base::string16 address1;
178 if (!dictionary.GetString("address1", &address1)) 205 if (dictionary.GetString("address1", &address1))
206 street_address.push_back(address1);
207 else
179 DVLOG(1) << "Reponse from Google Wallet missing address1"; 208 DVLOG(1) << "Reponse from Google Wallet missing address1";
180 209
181 base::string16 address2; 210 base::string16 address2;
182 if (!dictionary.GetString("address2", &address2)) 211 if (dictionary.GetString("address2", &address2) && !address2.empty()) {
183 DVLOG(1) << "Reponse from Google Wallet missing address2"; 212 street_address.resize(2);
213 street_address[1] = address2;
214 } else {
215 DVLOG(1) << "Reponse from Google Wallet missing or empty address2";
216 }
184 217
185 base::string16 city; 218 base::string16 city;
186 if (!dictionary.GetString("city", &city)) 219 if (!dictionary.GetString("city", &city))
187 DVLOG(1) << "Reponse from Google Wallet missing city"; 220 DVLOG(1) << "Reponse from Google Wallet missing city";
188 221
222 base::string16 dependent_locality_name;
223 if (!dictionary.GetString("dependent_locality_name",
224 &dependent_locality_name)) {
225 DVLOG(1) << "Reponse from Google Wallet missing district";
226 }
227
189 base::string16 state; 228 base::string16 state;
190 if (!dictionary.GetString("state", &state)) 229 if (!dictionary.GetString("state", &state))
191 DVLOG(1) << "Reponse from Google Wallet missing state"; 230 DVLOG(1) << "Reponse from Google Wallet missing state";
192 231
193 base::string16 phone_number; 232 base::string16 phone_number;
194 if (!dictionary.GetString("phone_number", &phone_number)) 233 if (!dictionary.GetString("phone_number", &phone_number))
195 DVLOG(1) << "Reponse from Google Wallet missing phone number"; 234 DVLOG(1) << "Reponse from Google Wallet missing phone number";
196 235
197 std::string address_state; 236 std::string address_state;
198 if (!dictionary.GetString("type", &address_state)) 237 if (!dictionary.GetString("type", &address_state))
199 DVLOG(1) << "Response from Google Wallet missing type/state of address"; 238 DVLOG(1) << "Response from Google Wallet missing type/state of address";
200 239
201 scoped_ptr<Address> address( 240 scoped_ptr<Address> address(
202 new Address(country_code, 241 new Address(country_code,
203 name, 242 name,
204 address1, 243 street_address,
205 address2,
206 city, 244 city,
245 dependent_locality_name,
207 state, 246 state,
208 postal_code, 247 postal_code,
248 sorting_code,
209 phone_number, 249 phone_number,
210 std::string())); 250 std::string()));
211 address->set_is_complete_address(address_state == kFullAddress); 251 address->set_is_complete_address(address_state == kFullAddress);
212 252
213 return address.Pass(); 253 return address.Pass();
214 } 254 }
215 255
216 scoped_ptr<base::DictionaryValue> Address::ToDictionaryWithID() const { 256 scoped_ptr<base::DictionaryValue> Address::ToDictionaryWithID() const {
217 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); 257 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
218 258
219 if (!object_id_.empty()) 259 if (!object_id_.empty())
220 dict->SetString("id", object_id_); 260 dict->SetString("id", object_id_);
221 dict->SetString("phone_number", phone_number_); 261 dict->SetString("phone_number", phone_number_);
222 dict->Set("postal_address", ToDictionaryWithoutID().release()); 262 dict->Set("postal_address", ToDictionaryWithoutID().release());
223 263
224 return dict.Pass(); 264 return dict.Pass();
225 } 265 }
226 266
227 scoped_ptr<base::DictionaryValue> Address::ToDictionaryWithoutID() const { 267 scoped_ptr<base::DictionaryValue> Address::ToDictionaryWithoutID() const {
228 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); 268 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
229 269
230 scoped_ptr<base::ListValue> address_lines(new base::ListValue()); 270 scoped_ptr<base::ListValue> address_lines(new base::ListValue());
231 address_lines->AppendString(address_line_1_); 271 address_lines->AppendStrings(street_address_);
232 if (!address_line_2_.empty())
233 address_lines->AppendString(address_line_2_);
234 dict->Set("address_line", address_lines.release()); 272 dict->Set("address_line", address_lines.release());
235 273
236 dict->SetString("country_name_code", country_name_code_); 274 dict->SetString("country_name_code", country_name_code_);
237 dict->SetString("recipient_name", recipient_name_); 275 dict->SetString("recipient_name", recipient_name_);
238 dict->SetString("locality_name", locality_name_); 276 dict->SetString("locality_name", locality_name_);
277 dict->SetString("dependent_locality_name", dependent_locality_name_);
239 dict->SetString("administrative_area_name", 278 dict->SetString("administrative_area_name",
240 administrative_area_name_); 279 administrative_area_name_);
241 dict->SetString("postal_code_number", postal_code_number_); 280 dict->SetString("postal_code_number", postal_code_number_);
281 dict->SetString("sorting_code", sorting_code_);
242 282
243 return dict.Pass(); 283 return dict.Pass();
244 } 284 }
245 285
246 base::string16 Address::DisplayName() const { 286 base::string16 Address::DisplayName() const {
247 #if defined(OS_ANDROID) 287 #if defined(OS_ANDROID)
248 // TODO(aruslan): improve this stub implementation. 288 // TODO(aruslan): improve this stub implementation.
249 return recipient_name(); 289 return recipient_name();
250 #else 290 #else
251 // TODO(estade): improve this stub implementation + l10n. 291 // TODO(estade): improve this stub implementation + l10n.
252 return recipient_name() + base::ASCIIToUTF16(", ") + address_line_1(); 292 return recipient_name() + base::ASCIIToUTF16(", ") + GetStreetAddressLine(0);
253 #endif 293 #endif
254 } 294 }
255 295
256 base::string16 Address::DisplayNameDetail() const { 296 base::string16 Address::DisplayNameDetail() const {
257 #if defined(OS_ANDROID) 297 #if defined(OS_ANDROID)
258 // TODO(aruslan): improve this stub implementation. 298 // TODO(aruslan): improve this stub implementation.
259 return address_line_1(); 299 return GetStreetAddressLine(0);
260 #else 300 #else
261 return base::string16(); 301 return base::string16();
262 #endif 302 #endif
263 } 303 }
264 304
265 base::string16 Address::DisplayPhoneNumber() const { 305 base::string16 Address::DisplayPhoneNumber() const {
266 // Return a formatted phone number. Wallet doesn't store user formatting, so 306 // Return a formatted phone number. Wallet doesn't store user formatting, so
267 // impose our own. phone_number() always includes a country code, so using 307 // impose our own. phone_number() always includes a country code, so using
268 // PhoneObject to format it would result in an internationalized format. Since 308 // PhoneObject to format it would result in an internationalized format. Since
269 // Wallet only supports the US right now, stick to national formatting. 309 // Wallet only supports the US right now, stick to national formatting.
270 return i18n::PhoneObject(phone_number(), country_name_code()). 310 return i18n::PhoneObject(phone_number(), country_name_code()).
271 GetNationallyFormattedNumber(); 311 GetNationallyFormattedNumber();
272 } 312 }
273 313
274 base::string16 Address::GetInfo(const AutofillType& type, 314 base::string16 Address::GetInfo(const AutofillType& type,
275 const std::string& app_locale) const { 315 const std::string& app_locale) const {
276 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) { 316 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) {
277 DCHECK(IsStringASCII(country_name_code())); 317 DCHECK(IsStringASCII(country_name_code()));
278 return base::ASCIIToUTF16(country_name_code()); 318 return base::ASCIIToUTF16(country_name_code());
279 } 319 }
280 320
281 switch (type.GetStorableType()) { 321 switch (type.GetStorableType()) {
282 case NAME_FULL: 322 case NAME_FULL:
283 return recipient_name(); 323 return recipient_name();
284 324
285 case ADDRESS_HOME_STREET_ADDRESS: { 325 case ADDRESS_HOME_STREET_ADDRESS:
286 base::string16 address = address_line_1(); 326 return JoinString(street_address_, base::ASCIIToUTF16("\n"));
287 if (!address_line_2().empty())
288 address += base::ASCIIToUTF16("\n") + address_line_2();
289 return address;
290 }
291 327
292 case ADDRESS_HOME_LINE1: 328 case ADDRESS_HOME_LINE1:
293 return address_line_1(); 329 return GetStreetAddressLine(0);
294 330
295 case ADDRESS_HOME_LINE2: 331 case ADDRESS_HOME_LINE2:
296 return address_line_2(); 332 return GetStreetAddressLine(1);
297 333
298 case ADDRESS_HOME_CITY: 334 case ADDRESS_HOME_CITY:
299 return locality_name(); 335 return locality_name();
300 336
301 case ADDRESS_HOME_STATE: 337 case ADDRESS_HOME_STATE:
302 return administrative_area_name(); 338 return administrative_area_name();
303 339
304 case ADDRESS_HOME_ZIP: 340 case ADDRESS_HOME_ZIP:
305 return postal_code_number(); 341 return postal_code_number();
306 342
307 case ADDRESS_HOME_COUNTRY: { 343 case ADDRESS_HOME_COUNTRY: {
308 AutofillCountry country(country_name_code(), app_locale); 344 AutofillCountry country(country_name_code(), app_locale);
309 return country.name(); 345 return country.name();
310 } 346 }
311 347
312 case PHONE_HOME_WHOLE_NUMBER: 348 case PHONE_HOME_WHOLE_NUMBER:
313 // Wallet doesn't store user phone number formatting, so just strip all 349 // Wallet doesn't store user phone number formatting, so just strip all
314 // formatting. 350 // formatting.
315 return phone_object_.GetWholeNumber(); 351 return phone_object_.GetWholeNumber();
316 352
317 case ADDRESS_HOME_DEPENDENT_LOCALITY: 353 case ADDRESS_HOME_DEPENDENT_LOCALITY:
354 return dependent_locality_name_;
355
318 case ADDRESS_HOME_SORTING_CODE: 356 case ADDRESS_HOME_SORTING_CODE:
357 return sorting_code_;
358
319 case COMPANY_NAME: 359 case COMPANY_NAME:
320 // Fields that some countries request but Wallet doesn't support. 360 // A field that Wallet doesn't support. TODO(dbeam): can it be supported?
321 // TODO(dbeam): can these be supported by Wallet?
322 return base::string16(); 361 return base::string16();
323 362
324 // TODO(estade): implement more.
325 default: 363 default:
326 NOTREACHED(); 364 NOTREACHED();
327 return base::string16(); 365 return base::string16();
328 } 366 }
329 } 367 }
330 368
331 void Address::SetPhoneNumber(const base::string16& phone_number) { 369 void Address::SetPhoneNumber(const base::string16& phone_number) {
332 phone_number_ = phone_number; 370 phone_number_ = phone_number;
333 phone_object_ = i18n::PhoneObject(phone_number_, country_name_code_); 371 phone_object_ = i18n::PhoneObject(phone_number_, country_name_code_);
334 } 372 }
335 373
336 bool Address::EqualsIgnoreID(const Address& other) const { 374 bool Address::EqualsIgnoreID(const Address& other) const {
337 return country_name_code_ == other.country_name_code_ && 375 return country_name_code_ == other.country_name_code_ &&
338 recipient_name_ == other.recipient_name_ && 376 recipient_name_ == other.recipient_name_ &&
339 address_line_1_ == other.address_line_1_ && 377 street_address_ == other.street_address_ &&
340 address_line_2_ == other.address_line_2_ &&
341 locality_name_ == other.locality_name_ && 378 locality_name_ == other.locality_name_ &&
379 dependent_locality_name_ == other.dependent_locality_name_ &&
342 administrative_area_name_ == other.administrative_area_name_ && 380 administrative_area_name_ == other.administrative_area_name_ &&
343 postal_code_number_ == other.postal_code_number_ && 381 postal_code_number_ == other.postal_code_number_ &&
382 sorting_code_ == other.sorting_code_ &&
344 phone_number_ == other.phone_number_ && 383 phone_number_ == other.phone_number_ &&
345 is_complete_address_ == other.is_complete_address_; 384 is_complete_address_ == other.is_complete_address_;
346 } 385 }
347 386
387 base::string16 Address::GetStreetAddressLine(size_t line) const {
388 return street_address_.size() > line ? street_address_[line] :
389 base::string16();
390 }
391
348 bool Address::operator==(const Address& other) const { 392 bool Address::operator==(const Address& other) const {
349 return object_id_ == other.object_id_ && EqualsIgnoreID(other); 393 return object_id_ == other.object_id_ && EqualsIgnoreID(other);
350 } 394 }
351 395
352 bool Address::operator!=(const Address& other) const { 396 bool Address::operator!=(const Address& other) const {
353 return !(*this == other); 397 return !(*this == other);
354 } 398 }
355 399
356 } // namespace wallet 400 } // namespace wallet
357 } // namespace autofill 401 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698