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 58d95b38c5a4961275e5f471aff7aaa9393b32c1..81dfcbfaff1d1835a2293b113991bc178b54ad8b 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 |
@@ -397,8 +397,8 @@ 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 /* callback */); |
mRequestShipping = options != null && options.requestShipping; |
mRequestPayerName = options != null && options.requestPayerName; |
@@ -625,6 +625,15 @@ public class PaymentRequestImpl |
} |
} |
+ if (queryApps.isEmpty()) { |
+ CanMakePaymentQuery query = sCanMakePaymentQueries.get(mSchemelessOriginForPaymentApp); |
+ if (query != null && query.matchesPaymentMethods(mMethodData)) { |
+ query.notifyObserversOfResponse(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. |
@@ -1376,7 +1385,9 @@ public class PaymentRequestImpl |
} |
CanMakePaymentQuery query = sCanMakePaymentQueries.get(mSchemelessOriginForPaymentApp); |
- if (query != null) query.notifyObserversOfResponse(mCanMakePayment); |
+ if (query != null && query.matchesPaymentMethods(mMethodData)) { |
+ query.notifyObserversOfResponse(mCanMakePayment); |
+ } |
// The list of payment instruments is ready to display. |
List<PaymentInstrument> sortedInstruments = new ArrayList<>(); |
@@ -1402,15 +1413,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. |