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 56234fefa0a7c6a2a693bbed3a22236f52c7d1c4..48ba691709abe107b03ef6ef48878f3231766b5c 100644 |
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc |
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc |
@@ -10,6 +10,7 @@ |
#include "base/android/jni_string.h" |
#include "base/command_line.h" |
#include "base/format_macros.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/android/resource_mapper.h" |
@@ -18,19 +19,24 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/pref_names.h" |
+#include "components/autofill/content/browser/content_autofill_driver.h" |
+#include "components/autofill/content/browser/content_autofill_driver_factory.h" |
#include "components/autofill/core/browser/autofill_country.h" |
#include "components/autofill/core/browser/autofill_type.h" |
#include "components/autofill/core/browser/country_names.h" |
#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/common/autofill_pref_names.h" |
#include "components/autofill/core/common/autofill_switches.h" |
#include "components/prefs/pref_service.h" |
+#include "content/public/browser/web_contents.h" |
#include "jni/PersonalDataManager_jni.h" |
using base::android::ConvertJavaStringToUTF8; |
using base::android::ConvertUTF16ToJavaString; |
using base::android::ConvertUTF8ToJavaString; |
+using base::android::ScopedJavaGlobalRef; |
using base::android::ScopedJavaLocalRef; |
namespace autofill { |
@@ -192,6 +198,74 @@ void PopulateNativeCreditCardFromJava( |
ConvertJavaStringToUTF16(Java_CreditCard_getYear(env, jcard))); |
} |
+// Self-deleting requester of full card details, including full PAN and the CVC |
+// number. |
+class FullCardRequester : public payments::FullCardRequest::Delegate, |
+ public base::SupportsWeakPtr<FullCardRequester> { |
+ public: |
+ FullCardRequester() {} |
+ |
+ void GetFullCard(JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& jweb_contents, |
+ const base::android::JavaParamRef<jobject>& jdelegate, |
+ CreditCard* card) { |
+ jdelegate_.Reset(env, jdelegate); |
+ |
+ if (!card) { |
+ OnFullCardError(); |
+ return; |
+ } |
+ |
+ content::WebContents* contents = |
+ content::WebContents::FromJavaWebContents(jweb_contents); |
+ if (!contents) { |
+ OnFullCardError(); |
+ return; |
+ } |
+ |
+ ContentAutofillDriverFactory* factory = |
+ ContentAutofillDriverFactory::FromWebContents(contents); |
+ if (!factory) { |
+ OnFullCardError(); |
+ return; |
+ } |
+ |
+ ContentAutofillDriver* driver = |
+ factory->DriverForFrame(contents->GetMainFrame()); |
+ if (!driver) { |
+ OnFullCardError(); |
+ return; |
+ } |
+ |
+ driver->autofill_manager()->GetOrCreateFullCardRequest()->GetFullCard( |
+ *card, AutofillClient::UNMASK_FOR_PAYMENT_REQUEST, AsWeakPtr()); |
+ } |
+ |
+ private: |
+ virtual ~FullCardRequester() {} |
+ |
+ // payments::FullCardRequest::Delegate: |
+ void OnFullCardDetails(const CreditCard& card, |
+ const base::string16& cvc) override { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ Java_FullCardRequestDelegate_onFullCardDetails( |
+ env, jdelegate_.obj(), CreateJavaCreditCardFromNative(env, card).obj(), |
+ base::android::ConvertUTF16ToJavaString(env, cvc).obj()); |
+ delete this; |
+ } |
+ |
+ // payments::FullCardRequest::Delegate: |
+ void OnFullCardError() override { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_.obj()); |
+ delete this; |
+ } |
+ |
+ ScopedJavaGlobalRef<jobject> jdelegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FullCardRequester); |
+}; |
+ |
} // namespace |
PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, |
@@ -331,6 +405,19 @@ void PersonalDataManagerAndroid::ClearUnmaskedCache( |
ConvertJavaStringToUTF8(env, guid)); |
} |
+void PersonalDataManagerAndroid::GetFullCardForPaymentRequest( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& unused_obj, |
+ const JavaParamRef<jobject>& jweb_contents, |
+ const JavaParamRef<jstring>& jguid, |
+ const JavaParamRef<jobject>& jdelegate) { |
+ // Self-deleting object. |
+ (new FullCardRequester()) |
+ ->GetFullCard(env, jweb_contents, jdelegate, |
+ personal_data_manager_->GetCreditCardByGUID( |
+ ConvertJavaStringToUTF8(env, jguid))); |
+} |
+ |
void PersonalDataManagerAndroid::OnPersonalDataChanged() { |
JNIEnv* env = base::android::AttachCurrentThread(); |
if (weak_java_obj_.get(env).is_null()) |