| 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 97a39cd707fbb42c314d10026490e71acfc4c444..181a5408fb2488be5dbb619a9edef8f8f4c5c658 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
 | 
| @@ -55,6 +55,7 @@ import java.util.ArrayList;
 | 
|  import java.util.Arrays;
 | 
|  import java.util.Collections;
 | 
|  import java.util.Comparator;
 | 
| +import java.util.HashMap;
 | 
|  import java.util.HashSet;
 | 
|  import java.util.List;
 | 
|  import java.util.Locale;
 | 
| @@ -907,7 +908,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
 | 
|      }
 | 
|  
 | 
|      @Override
 | 
| -    public void loadingInstrumentDetails() {
 | 
| +    public void onInstrumentDetailsLoadingWithoutUI() {
 | 
|          if (mClient == null || mUI == null || mPaymentResponseHelper == null) return;
 | 
|  
 | 
|          mUI.showProcessingMessage();
 | 
| @@ -926,8 +927,19 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
 | 
|          mPaymentResponseHelper = new PaymentResponseHelper(
 | 
|                  selectedShippingAddress, selectedShippingOption, selectedContact, this);
 | 
|  
 | 
| -        instrument.getInstrumentDetails(mMerchantName, mOrigin, mRawTotal, mRawLineItems,
 | 
| -                mMethodData.get(instrument.getInstrumentMethodName()), this);
 | 
| +        // Create a map that is the subset of mMethodData that contains the
 | 
| +        // payment methods supported by the selected payment instrument. If this
 | 
| +        // intersection contains more than one payment method, the payment app is
 | 
| +        // at liberty to choose (or have the user choose) one of the methods.
 | 
| +        Map<String, PaymentMethodData> methodData = new HashMap<>();
 | 
| +        for (String instrumentMethodName : instrument.getInstrumentMethodNames()) {
 | 
| +            if (mMethodData.containsKey(instrumentMethodName)) {
 | 
| +                methodData.put(instrumentMethodName, mMethodData.get(instrumentMethodName));
 | 
| +            }
 | 
| +        }
 | 
| +
 | 
| +        instrument.invokePaymentApp(mMerchantName, mOrigin, mRawTotal, mRawLineItems,
 | 
| +                Collections.unmodifiableMap(methodData), this);
 | 
|          recordSuccessFunnelHistograms("PayClicked");
 | 
|          return !(instrument instanceof AutofillPaymentInstrument);
 | 
|      }
 | 
| @@ -1059,7 +1071,9 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
 | 
|          if (instruments != null) {
 | 
|              for (int i = 0; i < instruments.size(); i++) {
 | 
|                  PaymentInstrument instrument = instruments.get(i);
 | 
| -                if (mMethodData.containsKey(instrument.getInstrumentMethodName())) {
 | 
| +                Set<String> instrumentMethodNames = instrument.getInstrumentMethodNames();
 | 
| +                instrumentMethodNames.retainAll(mMethodData.keySet());
 | 
| +                if (!instrumentMethodNames.isEmpty()) {
 | 
|                      addPendingInstrument(instrument);
 | 
|                  } else {
 | 
|                      instrument.dismissInstrument();
 | 
| 
 |