Chromium Code Reviews| Index: components/autofill/content/browser/wallet/wallet_client.cc |
| diff --git a/components/autofill/content/browser/wallet/wallet_client.cc b/components/autofill/content/browser/wallet/wallet_client.cc |
| index 30fd6186abc7d722691239ed852b332db559d0f7..cc5c23aca5a4a12717102bc2811d723993d07040 100644 |
| --- a/components/autofill/content/browser/wallet/wallet_client.cc |
| +++ b/components/autofill/content/browser/wallet/wallet_client.cc |
| @@ -372,14 +372,19 @@ void WalletClient::GetFullWallet(const FullWalletRequest& full_wallet_request) { |
| kFormEncodedMimeType); |
| } |
| -void WalletClient::SaveToWallet(scoped_ptr<Instrument> instrument, |
| - scoped_ptr<Address> address) { |
| +void WalletClient::SaveToWallet( |
| + scoped_ptr<Instrument> instrument, |
| + scoped_ptr<Address> address, |
| + const WalletItems::MaskedInstrument* server_instrument, |
| + const Address* server_address) { |
| DCHECK(instrument || address); |
| if (HasRequestInProgress()) { |
| pending_requests_.push(base::Bind(&WalletClient::SaveToWallet, |
| base::Unretained(this), |
| base::Passed(&instrument), |
| - base::Passed(&address))); |
| + base::Passed(&address), |
| + base::Unretained(server_instrument), |
|
Evan Stade
2013/12/12 02:33:57
this is no bueno... you need to make a copy (add a
Dan Beam
2013/12/13 04:06:24
did option 2 and updated all the other methods
|
| + base::Unretained(server_address))); |
| return; |
| } |
| @@ -402,17 +407,23 @@ void WalletClient::SaveToWallet(scoped_ptr<Instrument> instrument, |
| card_verification_number = net::EscapeUrlEncodedData( |
| UTF16ToUTF8(instrument->card_verification_number()), true); |
| - if (instrument->object_id().empty()) { |
| + if (!server_instrument) { |
| request_dict.Set(kInstrumentKey, instrument->ToDictionary().release()); |
| request_dict.SetString(kInstrumentPhoneNumberKey, |
| instrument->address()->phone_number()); |
| } else { |
| - DCHECK(instrument->address() || |
| - (instrument->expiration_month() > 0 && |
| - instrument->expiration_year() > 0)); |
| + DCHECK(!server_instrument->object_id().empty()); |
| + |
| + int new_month = instrument->expiration_month(); |
| + int new_year = instrument->expiration_year(); |
| + bool expiration_differs_from_server = |
|
Evan Stade
2013/12/12 02:33:57
nit: expiration_date_changed
Dan Beam
2013/12/13 04:06:24
Done.
|
| + new_month != server_instrument->expiration_month() || |
| + new_year != server_instrument->expiration_year(); |
| + |
| + DCHECK(instrument->address() || expiration_differs_from_server); |
| request_dict.SetString(kUpgradedInstrumentIdKey, |
| - instrument->object_id()); |
| + server_instrument->object_id()); |
| if (instrument->address()) { |
| request_dict.SetString(kInstrumentPhoneNumberKey, |
| @@ -422,8 +433,8 @@ void WalletClient::SaveToWallet(scoped_ptr<Instrument> instrument, |
| instrument->address()->ToDictionaryWithoutID().release()); |
| } |
| - if (instrument->expiration_month() > 0 && |
| - instrument->expiration_year() > 0) { |
| + if (expiration_differs_from_server) { |
| + // Updating expiration date requires a CVC. |
| DCHECK(!instrument->card_verification_number().empty()); |
| request_dict.SetInteger(kInstrumentExpMonthKey, |
| instrument->expiration_month()); |
| @@ -436,6 +447,10 @@ void WalletClient::SaveToWallet(scoped_ptr<Instrument> instrument, |
| } |
| } |
| if (address) { |
| + if (server_address) { |
| + address->set_object_id(server_address->object_id()); |
| + DCHECK(!address->object_id().empty()); |
| + } |
| request_dict.Set(kShippingAddressKey, |
| address->ToDictionaryWithID().release()); |
| } |