Index: chrome/browser/autofill/android/personal_data_manager_android.cc |
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc |
index 03e9be0c33efe120a6e8ac66e4819050459f635c..3cdc3b513b7a1e0a05921ec107845e693be2ba35 100644 |
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc |
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc |
@@ -31,6 +31,7 @@ |
#include "components/autofill/core/browser/field_types.h" |
#include "components/autofill/core/browser/payments/full_card_request.h" |
#include "components/autofill/core/browser/personal_data_manager.h" |
+#include "components/autofill/core/browser/validation.h" |
#include "components/autofill/core/common/autofill_constants.h" |
#include "components/autofill/core/common/autofill_pref_names.h" |
#include "components/autofill/core/common/autofill_switches.h" |
@@ -137,19 +138,21 @@ void PopulateNativeProfileFromJava( |
// Mapping from Chrome card types to PaymentRequest basic card payment spec and |
// icons. Note that "generic" is not in the spec. |
-// https://w3c.github.io/browser-payment-api/specs/basic-card-payment.html#method-id |
+// https://w3c.github.io/webpayments-methods-card/#method-id |
const struct PaymentRequestData { |
const char* card_type; |
const char* basic_card_payment_type; |
const int icon_resource_id; |
} kPaymentRequestData[] { |
{"genericCC", "generic", IDR_AUTOFILL_PR_GENERIC}, |
+ |
{"americanExpressCC", "amex", IDR_AUTOFILL_PR_AMEX}, |
- {"dinersCC", "diners", IDR_AUTOFILL_PR_GENERIC}, |
+ {"dinersCC", "diners", IDR_AUTOFILL_PR_DINERS}, |
{"discoverCC", "discover", IDR_AUTOFILL_PR_DISCOVER}, |
- {"jcbCC", "jcb", IDR_AUTOFILL_PR_GENERIC}, |
+ {"jcbCC", "jcb", IDR_AUTOFILL_PR_JCB}, |
{"masterCardCC", "mastercard", IDR_AUTOFILL_PR_MASTERCARD}, |
- {"visaCC", "visa", IDR_AUTOFILL_PR_VISA} |
+ {"unionPayCC", "unionpay", IDR_AUTOFILL_PR_UNIONPAY}, |
+ {"visaCC", "visa", IDR_AUTOFILL_PR_VISA}, |
}; |
// Converts the card type into PaymentRequest type according to the basic card |
@@ -217,10 +220,20 @@ class FullCardRequester : public payments::FullCardRequest::Delegate, |
public: |
FullCardRequester() {} |
+ // Takes ownership of |card|. |
+ void GetFullCard(JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& jweb_contents, |
+ const base::android::JavaParamRef<jobject>& jdelegate, |
+ std::unique_ptr<CreditCard> card) { |
+ card_ = std::move(card); |
+ GetFullCard(env, jweb_contents, jdelegate, card_.get()); |
+ } |
+ |
+ // Does not take ownership of |card|. |
void GetFullCard(JNIEnv* env, |
const base::android::JavaParamRef<jobject>& jweb_contents, |
const base::android::JavaParamRef<jobject>& jdelegate, |
- CreditCard* card) { |
+ const CreditCard* card) { |
jdelegate_.Reset(env, jdelegate); |
if (!card) { |
@@ -273,6 +286,7 @@ class FullCardRequester : public payments::FullCardRequest::Delegate, |
delete this; |
} |
+ std::unique_ptr<CreditCard> card_; |
ScopedJavaGlobalRef<jobject> jdelegate_; |
DISALLOW_COPY_AND_ASSIGN(FullCardRequester); |
@@ -407,6 +421,16 @@ ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardByGUID( |
return CreateJavaCreditCardFromNative(env, *card); |
} |
+ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetCreditCardForNumber( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& unused_obj, |
+ const JavaParamRef<jstring>& jcard_number) { |
+ // A local card with empty GUID. |
+ CreditCard card("", ""); |
+ card.SetNumber(ConvertJavaStringToUTF16(env, jcard_number)); |
+ return CreateJavaCreditCardFromNative(env, card); |
+} |
+ |
ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetCreditCard( |
JNIEnv* env, |
const JavaParamRef<jobject>& unused_obj, |
@@ -440,6 +464,20 @@ void PersonalDataManagerAndroid::UpdateServerCardBillingAddress( |
personal_data_manager_->UpdateServerCardBillingAddress(card); |
} |
+ScopedJavaLocalRef<jstring> |
+PersonalDataManagerAndroid::GetBasicCardPaymentTypeIfValid( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& unused_obj, |
+ const JavaParamRef<jstring>& jcard_number) { |
+ base::string16 card_number = ConvertJavaStringToUTF16(env, jcard_number); |
+ return ConvertUTF8ToJavaString( |
+ env, |
+ IsValidCreditCardNumber(card_number) |
+ ? GetPaymentRequestData(CreditCard::GetCreditCardType(card_number)) |
+ .basic_card_payment_type |
+ : ""); |
+} |
+ |
void PersonalDataManagerAndroid::AddServerCreditCardForTest( |
JNIEnv* env, |
const base::android::JavaParamRef<jobject>& unused_obj, |
@@ -471,13 +509,41 @@ void PersonalDataManagerAndroid::GetFullCardForPaymentRequest( |
const JavaParamRef<jobject>& jweb_contents, |
const JavaParamRef<jstring>& jguid, |
const JavaParamRef<jobject>& jdelegate) { |
- // Self-deleting object. |
+ // Self-deleting object that does not take ownership of the CreditCard from |
+ // the PersonalDataManager. The PersonalDataManager owns that CreditCard. |
(new FullCardRequester()) |
->GetFullCard(env, jweb_contents, jdelegate, |
personal_data_manager_->GetCreditCardByGUID( |
ConvertJavaStringToUTF8(env, jguid))); |
} |
+void PersonalDataManagerAndroid::GetFullTemporaryCardForPaymentRequest( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& unused_obj, |
+ const JavaParamRef<jobject>& jweb_contents, |
+ const JavaParamRef<jstring>& jcard_number, |
+ const JavaParamRef<jstring>& jname_on_card, |
+ const JavaParamRef<jstring>& jexpiration_month, |
+ const JavaParamRef<jstring>& jexpiration_year, |
+ const JavaParamRef<jobject>& jdelegate) { |
+ // FullCardRequest will not attempt to save a card with an empty GUID. |
+ std::unique_ptr<CreditCard> card(new CreditCard("", "")); |
+ card->SetNumber(ConvertJavaStringToUTF16(env, jcard_number)); |
+ card->SetRawInfo( |
+ CREDIT_CARD_NAME_FULL, |
+ ConvertJavaStringToUTF16(env, jname_on_card)); |
+ card->SetRawInfo( |
+ CREDIT_CARD_EXP_MONTH, |
+ ConvertJavaStringToUTF16(env, jexpiration_month)); |
+ card->SetRawInfo( |
+ CREDIT_CARD_EXP_4_DIGIT_YEAR, |
+ ConvertJavaStringToUTF16(env, jexpiration_year)); |
+ |
+ // Self-deleting object that takes ownership of the CreditCard. |
+ (new FullCardRequester()) |
+ ->GetFullCard(env, jweb_contents, jdelegate, std::move(card)); |
+} |
+ |
void PersonalDataManagerAndroid::OnPersonalDataChanged() { |
JNIEnv* env = base::android::AttachCurrentThread(); |
if (weak_java_obj_.get(env).is_null()) |