Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3698)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java

Issue 2020883002: PaymentRequest: Introduce PaymentMethodData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/test/data/android/payments/dynamic_shipping.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4e55ca2236ca7355cf2699a18eb05d050e86b6ae..03844ff40be627b934d2e1e87e3385971a484abd 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
@@ -31,6 +31,7 @@ import org.chromium.content_public.browser.WebContents;
import org.chromium.mojo.system.MojoException;
import org.chromium.mojom.payments.PaymentDetails;
import org.chromium.mojom.payments.PaymentItem;
+import org.chromium.mojom.payments.PaymentMethodData;
import org.chromium.mojom.payments.PaymentOptions;
import org.chromium.mojom.payments.PaymentRequest;
import org.chromium.mojom.payments.PaymentRequestClient;
@@ -43,8 +44,7 @@ import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Set;
@@ -72,7 +72,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
private Bitmap mFavicon;
private List<PaymentApp> mApps;
private PaymentRequestClient mClient;
- private Set<String> mSupportedMethods;
/**
* The raw total amount being charged, as it was received from the website. This data is passed
@@ -105,7 +104,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
*/
private SectionInformation mUiShippingOptions;
- private JSONObject mData;
+ private HashMap<String, JSONObject> mMethodData;
private SectionInformation mShippingAddressesSection;
private List<PaymentApp> mPendingApps;
private List<PaymentInstrument> mPendingInstruments;
@@ -177,18 +176,18 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
* Called by the merchant website to show the payment request to the user.
*/
@Override
- public void show(String[] supportedMethods, PaymentDetails details, PaymentOptions options,
- String stringifiedData) {
+ public void show(PaymentMethodData[] methodData, PaymentDetails details,
+ PaymentOptions options) {
if (mClient == null) return;
- if (mSupportedMethods != null) {
+ if (mMethodData != null) {
disconnectFromClientWithDebugMessage("PaymentRequest.show() called more than once.");
return;
}
- mSupportedMethods = getValidatedSupportedMethods(supportedMethods);
- if (mSupportedMethods == null) {
- disconnectFromClientWithDebugMessage("Invalid payment methods");
+ mMethodData = getValidatedMethodData(methodData);
+ if (mMethodData == null) {
+ disconnectFromClientWithDebugMessage("Invalid payment methods or data");
return;
}
@@ -200,12 +199,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
mMerchantNeedsShippingAddress =
requestShipping && mUiShippingOptions.getSelectedItem() == null;
- mData = getValidatedData(mSupportedMethods, stringifiedData);
- if (mData == null) {
- disconnectFromClientWithDebugMessage("Invalid payment method specific data");
- return;
- }
-
List<AutofillAddress> addresses = new ArrayList<>();
List<AutofillProfile> profiles = PersonalDataManager.getInstance().getProfilesToSuggest();
for (int i = 0; i < profiles.size(); i++) {
@@ -235,7 +228,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
for (int i = 0; i < mApps.size(); i++) {
PaymentApp app = mApps.get(i);
Set<String> appMethods = app.getSupportedMethodNames();
- appMethods.retainAll(mSupportedMethods);
+ appMethods.retainAll(mMethodData.keySet());
if (appMethods.isEmpty()) {
mPendingApps.remove(app);
} else {
@@ -253,17 +246,37 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
mFavicon = null;
}
- private HashSet<String> getValidatedSupportedMethods(String[] methods) {
- // Payment methods are required.
- if (methods == null || methods.length == 0) return null;
+ private HashMap<String, JSONObject> getValidatedMethodData(PaymentMethodData[] methodData) {
+ // Payment methodData are required.
+ if (methodData == null || methodData.length == 0) return null;
+ HashMap<String, JSONObject> result = new HashMap<>();
+ for (int i = 0; i < methodData.length; i++) {
+ JSONObject data = null;
+ if (!TextUtils.isEmpty(methodData[i].stringifiedData)) {
+ try {
+ data = new JSONObject(JsonSanitizer.sanitize(methodData[i].stringifiedData));
+ } catch (JSONException | IOException | IllegalStateException e) {
+ // Payment method specific data should be a JSON object.
+ // According to the payment request spec[1], for each method data,
+ // if the data field is supplied but is not a JSON-serializable object,
+ // then should throw a TypeError. So, we should return null here even if
+ // only one is bad.
+ // [1] https://w3c.github.io/browser-payment-api/specs/paymentrequest.html
+ return null;
+ }
+ }
- HashSet<String> result = new HashSet<>();
- for (int i = 0; i < methods.length; i++) {
- // Payment methods should be non-empty.
- if (TextUtils.isEmpty(methods[i])) return null;
- result.add(methods[i]);
- }
+ String[] methods = methodData[i].supportedMethods;
+
+ // Payment methods are required.
+ if (methods == null || methods.length == 0) return null;
+ for (int j = 0; j < methods.length; j++) {
+ // Payment methods should be non-empty.
+ if (TextUtils.isEmpty(methods[j])) return null;
+ result.put(methods[j], data);
+ }
+ }
return result;
}
@@ -444,29 +457,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
result);
}
- private JSONObject getValidatedData(Set<String> supportedMethods, String stringifiedData) {
- if (TextUtils.isEmpty(stringifiedData)) return new JSONObject();
-
- JSONObject result;
- try {
- result = new JSONObject(JsonSanitizer.sanitize(stringifiedData));
- } catch (JSONException | IOException | IllegalStateException e) {
- // Payment method specific data should be a valid JSON object.
- return null;
- }
-
- Iterator<String> it = result.keys();
- while (it.hasNext()) {
- String name = it.next();
- // Each key should be one of the supported payment methods.
- if (!supportedMethods.contains(name)) return null;
- // Each value should be a JSON object.
- if (result.optJSONObject(name) == null) return null;
- }
-
- return result;
- }
-
/**
* Called to retrieve the data to show in the initial PaymentRequest UI.
*/
@@ -557,7 +547,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
assert selectedPaymentMethod instanceof PaymentInstrument;
PaymentInstrument instrument = (PaymentInstrument) selectedPaymentMethod;
instrument.getDetails(mMerchantName, mOrigin, mRawTotal, mRawLineItems,
- mData.optJSONObject(instrument.getMethodName()), this);
+ mMethodData.get(instrument.getMethodName()), this);
}
@Override
@@ -616,7 +606,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
if (instruments != null) {
for (int i = 0; i < instruments.size(); i++) {
PaymentInstrument instrument = instruments.get(i);
- if (mSupportedMethods.contains(instrument.getMethodName())) {
+ if (mMethodData.containsKey(instrument.getMethodName())) {
mPendingInstruments.add(instrument);
} else {
instrument.dismiss();
« no previous file with comments | « no previous file | chrome/test/data/android/payments/dynamic_shipping.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698