Index: components/autofill/content/browser/wallet/wallet_items.cc |
diff --git a/components/autofill/content/browser/wallet/wallet_items.cc b/components/autofill/content/browser/wallet/wallet_items.cc |
deleted file mode 100644 |
index c660277a5b36972e6e1c02913a354175116fec3c..0000000000000000000000000000000000000000 |
--- a/components/autofill/content/browser/wallet/wallet_items.cc |
+++ /dev/null |
@@ -1,596 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/autofill/content/browser/wallet/wallet_items.h" |
- |
-#include <limits> |
- |
-#include "base/logging.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "components/autofill/content/browser/wallet/gaia_account.h" |
-#include "components/autofill/content/browser/wallet/wallet_service_url.h" |
-#include "components/autofill/core/browser/autofill_sync_constants.h" |
-#include "components/autofill/core/browser/autofill_type.h" |
-#include "components/autofill/core/browser/credit_card.h" |
-#include "grit/components_scaled_resources.h" |
-#include "grit/components_strings.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/image/image.h" |
-#include "url/gurl.h" |
- |
-namespace autofill { |
-namespace wallet { |
- |
-namespace { |
- |
-// TODO(estade): move to base/. |
-template<class T> |
-bool VectorsAreEqual(const std::vector<T*>& a, const std::vector<T*>& b) { |
- if (a.size() != b.size()) |
- return false; |
- |
- for (size_t i = 0; i < a.size(); ++i) { |
- if (*a[i] != *b[i]) |
- return false; |
- } |
- |
- return true; |
-} |
- |
-WalletItems::MaskedInstrument::Type |
- TypeFromString(const std::string& type_string) { |
- if (type_string == kSyncCardTypeVisa) |
- return WalletItems::MaskedInstrument::VISA; |
- if (type_string == kSyncCardTypeMasterCard) |
- return WalletItems::MaskedInstrument::MASTER_CARD; |
- if (type_string == kSyncCardTypeAmex) |
- return WalletItems::MaskedInstrument::AMEX; |
- if (type_string == kSyncCardTypeDiscover) |
- return WalletItems::MaskedInstrument::DISCOVER; |
- if (type_string == kSyncCardTypeSolo) |
- return WalletItems::MaskedInstrument::SOLO; |
- if (type_string == kSyncCardTypeSolo) |
- return WalletItems::MaskedInstrument::MAESTRO; |
- if (type_string == kSyncCardTypeSwitch) |
- return WalletItems::MaskedInstrument::SWITCH; |
- return WalletItems::MaskedInstrument::UNKNOWN; |
-} |
- |
-WalletItems::MaskedInstrument::Status |
- StatusFromString(const std::string& status_string) { |
- if (status_string == "AMEX_NOT_SUPPORTED") |
- return WalletItems::MaskedInstrument::AMEX_NOT_SUPPORTED; |
- if (status_string == "PENDING") |
- return WalletItems::MaskedInstrument::PENDING; |
- if (status_string == "VALID") |
- return WalletItems::MaskedInstrument::VALID; |
- if (status_string == "DECLINED") |
- return WalletItems::MaskedInstrument::DECLINED; |
- if (status_string == "DISABLED_FOR_THIS_MERCHANT") |
- return WalletItems::MaskedInstrument::DISABLED_FOR_THIS_MERCHANT; |
- if (status_string == "UNSUPPORTED_COUNTRY") |
- return WalletItems::MaskedInstrument::UNSUPPORTED_COUNTRY; |
- if (status_string == "EXPIRED") |
- return WalletItems::MaskedInstrument::EXPIRED; |
- if (status_string == "BILLING_INCOMPLETE") |
- return WalletItems::MaskedInstrument::BILLING_INCOMPLETE; |
- return WalletItems::MaskedInstrument::INAPPLICABLE; |
-} |
- |
-base::string16 DisplayStringFromType(WalletItems::MaskedInstrument::Type type) { |
- switch (type) { |
- case WalletItems::MaskedInstrument::AMEX: |
- return CreditCard::TypeForDisplay(kAmericanExpressCard); |
- case WalletItems::MaskedInstrument::DISCOVER: |
- return CreditCard::TypeForDisplay(kDiscoverCard); |
- case WalletItems::MaskedInstrument::MASTER_CARD: |
- return CreditCard::TypeForDisplay(kMasterCard); |
- case WalletItems::MaskedInstrument::VISA: |
- return CreditCard::TypeForDisplay(kVisaCard); |
- default: |
- return CreditCard::TypeForDisplay(kGenericCard); |
- } |
-} |
- |
-} // anonymous namespace |
- |
-WalletItems::MaskedInstrument::MaskedInstrument( |
- const base::string16& descriptive_name, |
- const WalletItems::MaskedInstrument::Type& type, |
- const base::string16& last_four_digits, |
- int expiration_month, |
- int expiration_year, |
- scoped_ptr<Address> address, |
- const WalletItems::MaskedInstrument::Status& status, |
- const std::string& object_id) |
- : descriptive_name_(descriptive_name), |
- type_(type), |
- last_four_digits_(last_four_digits), |
- expiration_month_(expiration_month), |
- expiration_year_(expiration_year), |
- address_(address.Pass()), |
- status_(status), |
- object_id_(object_id) { |
- DCHECK(address_); |
-} |
- |
-WalletItems::MaskedInstrument::~MaskedInstrument() {} |
- |
-scoped_ptr<WalletItems::MaskedInstrument> |
- WalletItems::MaskedInstrument::CreateMaskedInstrument( |
- const base::DictionaryValue& dictionary) { |
- std::string type_string; |
- Type type; |
- if (dictionary.GetString("type", &type_string)) { |
- type = TypeFromString(type_string); |
- } else { |
- DLOG(ERROR) << "Response from Google Payments missing card type"; |
- return scoped_ptr<MaskedInstrument>(); |
- } |
- |
- base::string16 last_four_digits; |
- if (!dictionary.GetString("last_four_digits", &last_four_digits)) { |
- DLOG(ERROR) << "Response from Google Payments missing last four digits"; |
- return scoped_ptr<MaskedInstrument>(); |
- } |
- |
- std::string status_string; |
- Status status; |
- if (dictionary.GetString("status", &status_string)) { |
- status = StatusFromString(status_string); |
- } else { |
- DLOG(ERROR) << "Response from Google Payments missing status"; |
- return scoped_ptr<MaskedInstrument>(); |
- } |
- |
- std::string object_id; |
- if (!dictionary.GetString("object_id", &object_id)) { |
- DLOG(ERROR) << "Response from Google Payments missing object id"; |
- return scoped_ptr<MaskedInstrument>(); |
- } |
- |
- const base::DictionaryValue* address_dict; |
- if (!dictionary.GetDictionary("billing_address", &address_dict)) { |
- DLOG(ERROR) << "Response from Google wallet missing address"; |
- return scoped_ptr<MaskedInstrument>(); |
- } |
- scoped_ptr<Address> address = Address::CreateDisplayAddress(*address_dict); |
- |
- if (!address) { |
- DLOG(ERROR) << "Response from Google wallet contained malformed address"; |
- return scoped_ptr<MaskedInstrument>(); |
- } |
- |
- int expiration_month; |
- if (!dictionary.GetInteger("expiration_month", &expiration_month)) |
- DVLOG(1) << "Response from Google Payments missing expiration month"; |
- |
- int expiration_year; |
- if (!dictionary.GetInteger("expiration_year", &expiration_year)) |
- DVLOG(1) << "Response from Google Payments missing expiration year"; |
- |
- base::string16 descriptive_name; |
- if (!dictionary.GetString("descriptive_name", &descriptive_name)) |
- DVLOG(1) << "Response from Google Payments missing descriptive name"; |
- |
- return scoped_ptr<MaskedInstrument>(new MaskedInstrument(descriptive_name, |
- type, |
- last_four_digits, |
- expiration_month, |
- expiration_year, |
- address.Pass(), |
- status, |
- object_id)); |
-} |
- |
-bool WalletItems::MaskedInstrument::operator==( |
- const WalletItems::MaskedInstrument& other) const { |
- if (descriptive_name_ != other.descriptive_name_) |
- return false; |
- if (type_ != other.type_) |
- return false; |
- if (last_four_digits_ != other.last_four_digits_) |
- return false; |
- if (expiration_month_ != other.expiration_month_) |
- return false; |
- if (expiration_year_ != other.expiration_year_) |
- return false; |
- if (address_) { |
- if (other.address_) { |
- if (*address_ != *other.address_) |
- return false; |
- } else { |
- return false; |
- } |
- } else if (other.address_) { |
- return false; |
- } |
- if (status_ != other.status_) |
- return false; |
- if (object_id_ != other.object_id_) |
- return false; |
- return true; |
-} |
- |
-bool WalletItems::MaskedInstrument::operator!=( |
- const WalletItems::MaskedInstrument& other) const { |
- return !(*this == other); |
-} |
- |
-const WalletItems::MaskedInstrument* WalletItems::GetInstrumentById( |
- const std::string& object_id) const { |
- if (object_id.empty()) |
- return NULL; |
- |
- for (size_t i = 0; i < instruments_.size(); ++i) { |
- if (instruments_[i]->object_id() == object_id) |
- return instruments_[i]; |
- } |
- |
- return NULL; |
-} |
- |
-bool WalletItems::HasRequiredAction(RequiredAction action) const { |
- DCHECK(ActionAppliesToWalletItems(action)); |
- return std::find(required_actions_.begin(), |
- required_actions_.end(), |
- action) != required_actions_.end(); |
-} |
- |
-bool WalletItems::SupportsCard(const base::string16& card_number, |
- base::string16* message) const { |
- const char* const card_type = CreditCard::GetCreditCardType(card_number); |
- |
- if (card_type == kVisaCard || |
- card_type == kMasterCard || |
- card_type == kDiscoverCard) { |
- return true; |
- } |
- |
- if (card_type == kAmericanExpressCard) { |
- if (amex_permission_ == AMEX_ALLOWED) |
- return true; |
- |
- *message = l10n_util::GetStringUTF16( |
- IDS_AUTOFILL_CREDIT_CARD_NOT_SUPPORTED_BY_WALLET_FOR_MERCHANT); |
- return false; |
- } |
- |
- *message = l10n_util::GetStringUTF16( |
- IDS_AUTOFILL_CREDIT_CARD_NOT_SUPPORTED_BY_WALLET); |
- return false; |
-} |
- |
-std::string WalletItems::ObfuscatedGaiaId() const { |
- if (active_account_index_ >= gaia_accounts_.size()) |
- return std::string(); |
- |
- return gaia_accounts_[active_account_index_]->obfuscated_id(); |
-} |
- |
-base::string16 WalletItems::MaskedInstrument::DisplayName() const { |
-#if defined(OS_ANDROID) |
- // TODO(aruslan): improve this stub implementation. |
- return descriptive_name(); |
-#else |
- return descriptive_name(); |
-#endif |
-} |
- |
-base::string16 WalletItems::MaskedInstrument::DisplayNameDetail() const { |
-#if defined(OS_ANDROID) |
- // TODO(aruslan): improve this stub implementation. |
- return address().DisplayName(); |
-#else |
- return base::string16(); |
-#endif |
-} |
- |
-base::string16 WalletItems::MaskedInstrument::TypeAndLastFourDigits() const { |
- // TODO(dbeam): i18n. |
- return DisplayStringFromType(type_) + base::ASCIIToUTF16(" - ") + |
- last_four_digits(); |
-} |
- |
-const gfx::Image& WalletItems::MaskedInstrument::CardIcon() const { |
- int idr = 0; |
- switch (type_) { |
- case AMEX: |
- idr = IDR_AUTOFILL_CC_AMEX; |
- break; |
- |
- case DISCOVER: |
- idr = IDR_AUTOFILL_CC_DISCOVER; |
- break; |
- |
- case MASTER_CARD: |
- idr = IDR_AUTOFILL_CC_MASTERCARD; |
- break; |
- |
- case VISA: |
- idr = IDR_AUTOFILL_CC_VISA; |
- break; |
- |
- case SOLO: |
- case MAESTRO: |
- case SWITCH: |
- case UNKNOWN: |
- idr = IDR_AUTOFILL_CC_GENERIC; |
- break; |
- } |
- |
- return ResourceBundle::GetSharedInstance().GetImageNamed(idr); |
-} |
- |
-base::string16 WalletItems::MaskedInstrument::GetInfo( |
- const AutofillType& type, |
- const std::string& app_locale) const { |
- if (type.group() != CREDIT_CARD) |
- return address().GetInfo(type, app_locale); |
- |
- switch (type.GetStorableType()) { |
- case CREDIT_CARD_NAME: |
- return address().recipient_name(); |
- |
- case CREDIT_CARD_NUMBER: |
- return DisplayName(); |
- |
- case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
- return base::IntToString16(expiration_year()); |
- |
- case CREDIT_CARD_VERIFICATION_CODE: |
- break; |
- |
- case CREDIT_CARD_TYPE: |
- return DisplayStringFromType(type_); |
- |
- default: |
- NOTREACHED(); |
- } |
- |
- return base::string16(); |
-} |
- |
-WalletItems::LegalDocument::~LegalDocument() {} |
- |
-scoped_ptr<WalletItems::LegalDocument> |
- WalletItems::LegalDocument::CreateLegalDocument( |
- const base::DictionaryValue& dictionary) { |
- std::string id; |
- if (!dictionary.GetString("legal_document_id", &id)) { |
- DLOG(ERROR) << "Response from Google Payments missing legal document id"; |
- return scoped_ptr<LegalDocument>(); |
- } |
- |
- base::string16 display_name; |
- if (!dictionary.GetString("display_name", &display_name)) { |
- DLOG(ERROR) << "Response from Google Payments missing display name"; |
- return scoped_ptr<LegalDocument>(); |
- } |
- |
- std::string url; |
- if (!dictionary.GetString("url", &url)) { |
- DLOG(ERROR) << "Response from Google Payments missing URL"; |
- return scoped_ptr<LegalDocument>(); |
- } |
- |
- return scoped_ptr<LegalDocument>( |
- new LegalDocument(id, GURL(url), display_name)); |
-} |
- |
-scoped_ptr<WalletItems::LegalDocument> |
- WalletItems::LegalDocument::CreatePrivacyPolicyDocument() { |
- return scoped_ptr<LegalDocument>(new LegalDocument( |
- std::string(), GetPrivacyNoticeUrl(), |
- l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PRIVACY_POLICY_LINK))); |
-} |
- |
-bool WalletItems::LegalDocument::operator==(const LegalDocument& other) const { |
- return id_ == other.id_ && |
- url_ == other.url_ && |
- display_name_ == other.display_name_; |
-} |
- |
-bool WalletItems::LegalDocument::operator!=(const LegalDocument& other) const { |
- return !(*this == other); |
-} |
- |
-WalletItems::LegalDocument::LegalDocument(const std::string& id, |
- const GURL& url, |
- const base::string16& display_name) |
- : id_(id), url_(url), display_name_(display_name) { |
-} |
- |
-WalletItems::WalletItems(const std::vector<RequiredAction>& required_actions, |
- const std::string& google_transaction_id, |
- const std::string& default_instrument_id, |
- const std::string& default_address_id, |
- AmexPermission amex_permission) |
- : required_actions_(required_actions), |
- google_transaction_id_(google_transaction_id), |
- default_instrument_id_(default_instrument_id), |
- default_address_id_(default_address_id), |
- active_account_index_(std::numeric_limits<size_t>::max()), |
- amex_permission_(amex_permission) {} |
- |
-WalletItems::~WalletItems() {} |
- |
-scoped_ptr<WalletItems> |
- WalletItems::CreateWalletItems(const base::DictionaryValue& dictionary) { |
- std::vector<RequiredAction> required_action; |
- const base::ListValue* required_action_list; |
- if (dictionary.GetList("required_action", &required_action_list)) { |
- for (size_t i = 0; i < required_action_list->GetSize(); ++i) { |
- std::string action_string; |
- if (required_action_list->GetString(i, &action_string)) { |
- RequiredAction action = ParseRequiredActionFromString(action_string); |
- if (!ActionAppliesToWalletItems(action)) { |
- DLOG(ERROR) << "Response from Google wallet with bad required action:" |
- " \"" << action_string << "\""; |
- return scoped_ptr<WalletItems>(); |
- } |
- required_action.push_back(action); |
- } |
- } |
- } else { |
- DVLOG(1) << "Response from Google wallet missing required actions"; |
- } |
- |
- std::string google_transaction_id; |
- if (!dictionary.GetString("google_transaction_id", &google_transaction_id) && |
- required_action.empty()) { |
- DLOG(ERROR) << "Response from Google wallet missing google transaction id"; |
- return scoped_ptr<WalletItems>(); |
- } |
- |
- std::string default_instrument_id; |
- if (!dictionary.GetString("default_instrument_id", &default_instrument_id)) |
- DVLOG(1) << "Response from Google wallet missing default instrument id"; |
- |
- std::string default_address_id; |
- if (!dictionary.GetString("default_address_id", &default_address_id)) |
- DVLOG(1) << "Response from Google wallet missing default_address_id"; |
- |
- // obfuscated_gaia_id is deprecated. |
- |
- bool amex_disallowed = true; |
- if (!dictionary.GetBoolean("amex_disallowed", &amex_disallowed)) |
- DVLOG(1) << "Response from Google wallet missing the amex_disallowed field"; |
- AmexPermission amex_permission = |
- amex_disallowed ? AMEX_DISALLOWED : AMEX_ALLOWED; |
- |
- scoped_ptr<WalletItems> wallet_items(new WalletItems(required_action, |
- google_transaction_id, |
- default_instrument_id, |
- default_address_id, |
- amex_permission)); |
- std::vector<std::string> gaia_accounts; |
- const base::ListValue* gaia_profiles; |
- if (dictionary.GetList("gaia_profile", &gaia_profiles)) { |
- for (size_t i = 0; i < gaia_profiles->GetSize(); ++i) { |
- const base::DictionaryValue* account_dict; |
- std::string email; |
- if (!gaia_profiles->GetDictionary(i, &account_dict)) |
- continue; |
- |
- scoped_ptr<GaiaAccount> gaia_account( |
- GaiaAccount::Create(*account_dict)); |
- if (gaia_account) |
- wallet_items->AddAccount(gaia_account.Pass()); |
- } |
- } else { |
- DVLOG(1) << "Response from Google wallet missing GAIA accounts"; |
- } |
- |
- const base::ListValue* legal_docs; |
- if (dictionary.GetList("required_legal_document", &legal_docs)) { |
- for (size_t i = 0; i < legal_docs->GetSize(); ++i) { |
- const base::DictionaryValue* legal_doc_dict; |
- if (legal_docs->GetDictionary(i, &legal_doc_dict)) { |
- scoped_ptr<LegalDocument> legal_doc( |
- LegalDocument::CreateLegalDocument(*legal_doc_dict)); |
- if (legal_doc) |
- wallet_items->AddLegalDocument(legal_doc.Pass()); |
- else |
- return scoped_ptr<WalletItems>(); |
- } |
- } |
- |
- if (!legal_docs->empty()) { |
- // Always append the privacy policy link as well. |
- wallet_items->AddLegalDocument( |
- LegalDocument::CreatePrivacyPolicyDocument()); |
- } |
- } else { |
- DVLOG(1) << "Response from Google wallet missing legal docs"; |
- } |
- |
- const base::ListValue* instruments; |
- if (dictionary.GetList("instrument", &instruments)) { |
- for (size_t i = 0; i < instruments->GetSize(); ++i) { |
- const base::DictionaryValue* instrument_dict; |
- if (instruments->GetDictionary(i, &instrument_dict)) { |
- scoped_ptr<MaskedInstrument> instrument( |
- MaskedInstrument::CreateMaskedInstrument(*instrument_dict)); |
- if (instrument) |
- wallet_items->AddInstrument(instrument.Pass()); |
- } |
- } |
- } else { |
- DVLOG(1) << "Response from Google wallet missing instruments"; |
- } |
- |
- const base::ListValue* addresses; |
- if (dictionary.GetList("address", &addresses)) { |
- for (size_t i = 0; i < addresses->GetSize(); ++i) { |
- const base::DictionaryValue* address_dict; |
- if (addresses->GetDictionary(i, &address_dict)) { |
- scoped_ptr<Address> address( |
- Address::CreateAddressWithID(*address_dict)); |
- if (address) |
- wallet_items->AddAddress(address.Pass()); |
- } |
- } |
- } else { |
- DVLOG(1) << "Response from Google wallet missing addresses"; |
- } |
- |
- const base::ListValue* allowed_shipping_countries; |
- if (dictionary.GetList("allowed_shipping_spec_by_country", |
- &allowed_shipping_countries)) { |
- for (size_t i = 0; i < allowed_shipping_countries->GetSize(); ++i) { |
- const base::DictionaryValue* country_spec; |
- std::string country_code; |
- if (allowed_shipping_countries->GetDictionary(i, &country_spec) && |
- country_spec->GetString("country_code", &country_code)) { |
- wallet_items->AddAllowedShippingCountry(country_code); |
- } |
- } |
- } else { |
- DVLOG(1) << "Response from Google wallet missing allowed shipping" |
- " countries"; |
- } |
- |
- return wallet_items.Pass(); |
-} |
- |
-void WalletItems::AddAccount(scoped_ptr<GaiaAccount> account) { |
- if (account->index() != gaia_accounts_.size()) { |
- DVLOG(1) << "Tried to add account out of order"; |
- return; |
- } |
- |
- if (account->is_active()) |
- active_account_index_ = account->index(); |
- |
- gaia_accounts_.push_back(account.release()); |
-} |
- |
-bool WalletItems::operator==(const WalletItems& other) const { |
- return google_transaction_id_ == other.google_transaction_id_ && |
- default_instrument_id_ == other.default_instrument_id_ && |
- default_address_id_ == other.default_address_id_ && |
- required_actions_ == other.required_actions_ && |
- // This check is technically redundant, but is useful for tests. |
- ObfuscatedGaiaId() == other.ObfuscatedGaiaId() && |
- active_account_index() == other.active_account_index() && |
- VectorsAreEqual<GaiaAccount>(gaia_accounts(), |
- other.gaia_accounts()) && |
- VectorsAreEqual<MaskedInstrument>(instruments(), |
- other.instruments()) && |
- VectorsAreEqual<Address>(addresses(), other.addresses()) && |
- VectorsAreEqual<LegalDocument>(legal_documents(), |
- other.legal_documents()) && |
- allowed_shipping_countries() == other.allowed_shipping_countries(); |
-} |
- |
-bool WalletItems::operator!=(const WalletItems& other) const { |
- return !(*this == other); |
-} |
- |
-} // namespace wallet |
-} // namespace autofill |