Index: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
index 328686f33227531bc4c87d57cf3281174fa68391..88e17b922b582781f72fd6913c074d2b0e800294 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager; |
import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; |
import org.chromium.chrome.browser.favicon.FaviconHelper; |
import org.chromium.chrome.browser.pageinfo.CertificateChainHelper; |
+import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentManifestParser; |
import org.chromium.chrome.browser.payments.ui.Completable; |
import org.chromium.chrome.browser.payments.ui.ContactDetailsSection; |
import org.chromium.chrome.browser.payments.ui.LineItem; |
@@ -57,6 +58,7 @@ import org.chromium.payments.mojom.PaymentMethodData; |
import org.chromium.payments.mojom.PaymentOptions; |
import org.chromium.payments.mojom.PaymentRequest; |
import org.chromium.payments.mojom.PaymentRequestClient; |
+import org.chromium.payments.mojom.PaymentRequestClient.ParsePaymentManifestResponse; |
import org.chromium.payments.mojom.PaymentResponse; |
import org.chromium.payments.mojom.PaymentShippingOption; |
import org.chromium.payments.mojom.PaymentShippingType; |
@@ -78,11 +80,12 @@ import javax.annotation.Nullable; |
* Android implementation of the PaymentRequest service defined in |
* components/payments/payment_request.mojom. |
*/ |
-public class PaymentRequestImpl |
- implements PaymentRequest, PaymentRequestUI.Client, PaymentApp.InstrumentsCallback, |
- PaymentInstrument.InstrumentDetailsCallback, |
- PaymentAppFactory.PaymentAppCreatedCallback, |
- PaymentResponseHelper.PaymentResponseRequesterDelegate, FocusChangedObserver { |
+public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Client, |
+ PaymentApp.InstrumentsCallback, |
+ PaymentInstrument.InstrumentDetailsCallback, |
+ PaymentAppFactory.PaymentAppCreatedCallback, |
+ PaymentResponseHelper.PaymentResponseRequesterDelegate, |
+ FocusChangedObserver, PaymentManifestParser { |
/** |
* A test-only observer for the PaymentRequest service implementation. |
*/ |
@@ -383,8 +386,9 @@ public class PaymentRequestImpl |
if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return; |
- PaymentAppFactory.getInstance().create( |
- mWebContents, Collections.unmodifiableSet(mMethodData.keySet()), this); |
+ PaymentAppFactory.getInstance().create(mWebContents, |
+ Collections.unmodifiableSet(mMethodData.keySet()), this /* parser */, |
+ this /* callback */); |
mRequestShipping = options != null && options.requestShipping; |
mRequestPayerName = options != null && options.requestPayerName; |
@@ -611,6 +615,13 @@ public class PaymentRequestImpl |
} |
} |
+ if (queryApps.isEmpty()) { |
+ CanMakePaymentQuery query = sCanMakePaymentQueries.get(mOrigin); |
+ if (query != null) query.setResponse(false); |
+ } |
+ |
+ if (disconnectIfNoPaymentMethodsSupported()) return; |
+ |
// Query instruments after mMerchantSupportsAutofillPaymentInstruments has been initialized, |
// so a fast response from a non-autofill payment app at the front of the app list does not |
// cause NOT_SUPPORTED payment rejection. |
@@ -1254,6 +1265,7 @@ public class PaymentRequestImpl |
} |
private void respondCanMakePaymentQuery(boolean response) { |
+ if (mClient == null) return; |
mClient.onCanMakePayment(response ? CanMakePaymentQueryResult.CAN_MAKE_PAYMENT |
: CanMakePaymentQueryResult.CANNOT_MAKE_PAYMENT); |
mJourneyLogger.setCanMakePaymentValue(mCanMakePayment); |
@@ -1396,15 +1408,14 @@ public class PaymentRequestImpl |
* @return True if no payment methods are supported |
*/ |
private boolean disconnectIfNoPaymentMethodsSupported() { |
- if (!isFinishedQueryingPaymentApps()) return false; |
+ if (!isFinishedQueryingPaymentApps() || !mIsCurrentPaymentRequestShowing) return false; |
boolean foundPaymentMethods = mPaymentMethodsSection != null |
&& !mPaymentMethodsSection.isEmpty(); |
boolean userCanAddCreditCard = mMerchantSupportsAutofillPaymentInstruments |
&& !ChromeFeatureList.isEnabled(ChromeFeatureList.NO_CREDIT_CARD_ABORT); |
- if (!mArePaymentMethodsSupported || (mIsCurrentPaymentRequestShowing && !foundPaymentMethods |
- && !userCanAddCreditCard)) { |
+ if (!mArePaymentMethodsSupported || (!foundPaymentMethods && !userCanAddCreditCard)) { |
// All payment apps have responded, but none of them have instruments. It's possible to |
// add credit cards, but the merchant does not support them either. The payment request |
// must be rejected. |
@@ -1482,6 +1493,16 @@ public class PaymentRequestImpl |
} |
@Override |
+ public void parsePaymentManifest(String content, ParsePaymentManifestResponse callback) { |
+ if (mClient == null) { |
+ callback.call(null); |
+ return; |
+ } |
+ |
+ mClient.parsePaymentManifest(content, callback); |
+ } |
+ |
+ @Override |
public void onFocusChanged(@PaymentRequestUI.DataType int dataType, boolean willFocus) { |
assert dataType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES; |