Title: [223163] trunk
Revision
223163
Author
aes...@apple.com
Date
2017-10-10 19:57:12 -0700 (Tue, 10 Oct 2017)

Log Message

[Payment Request] Validate that all PaymentCurrencyAmounts use the same currency code when using Apple Pay
https://bugs.webkit.org/show_bug.cgi?id=178150

Reviewed by Tim Horton.

Source/WebCore:

Apple Pay requires a single currency code, but the Payment Request API allows the client to
specify a currency code for each PaymentCurrencyAmount.

Instead of having a required currencyCode property on ApplePayRequest and ignoring the
currency property on PaymentCurrencyAmount, validate that all PaymentCurrencyAmounts use the
same currency code and use that as ApplePaySessionPaymentRequest's currencyCode.

Added test cases to http/tests/ssl/applepay/PaymentRequest.https.html.

* Modules/applepay/ApplePayPaymentRequest.h:
* Modules/applepay/ApplePayPaymentRequest.idl:
* Modules/applepay/ApplePayRequestBase.cpp:
(WebCore::convertAndValidate):
* Modules/applepay/ApplePayRequestBase.h:
* Modules/applepay/ApplePayRequestBase.idl:
* Modules/applepay/ApplePaySession.cpp:
(WebCore::convertAndValidate):
* Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
(WebCore::validate):
(WebCore::convertAndValidate):
(WebCore::ApplePayPaymentHandler::show):
* Modules/applepay/paymentrequest/ApplePayRequest.idl:

LayoutTests:

* http/tests/paymentrequest/payment-request-abort-method.https.html:
* http/tests/paymentrequest/payment-request-canmakepayment-method.https.html:
* http/tests/paymentrequest/payment-request-show-method.https.html:
* http/tests/ssl/applepay/PaymentRequest.https-expected.txt:
* http/tests/ssl/applepay/PaymentRequest.https.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (223162 => 223163)


--- trunk/LayoutTests/ChangeLog	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/LayoutTests/ChangeLog	2017-10-11 02:57:12 UTC (rev 223163)
@@ -1,5 +1,18 @@
 2017-10-10  Andy Estes  <aes...@apple.com>
 
+        [Payment Request] Validate that all PaymentCurrencyAmounts use the same currency code when using Apple Pay
+        https://bugs.webkit.org/show_bug.cgi?id=178150
+
+        Reviewed by Tim Horton.
+
+        * http/tests/paymentrequest/payment-request-abort-method.https.html:
+        * http/tests/paymentrequest/payment-request-canmakepayment-method.https.html:
+        * http/tests/paymentrequest/payment-request-show-method.https.html:
+        * http/tests/ssl/applepay/PaymentRequest.https-expected.txt:
+        * http/tests/ssl/applepay/PaymentRequest.https.html:
+
+2017-10-10  Andy Estes  <aes...@apple.com>
+
         [Payment Request] Implement PaymentRequest.canMakePayment()
         https://bugs.webkit.org/show_bug.cgi?id=178048
 

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-abort-method.https.html (223162 => 223163)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-abort-method.https.html	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-abort-method.https.html	2017-10-11 02:57:12 UTC (rev 223163)
@@ -22,7 +22,6 @@
         merchantCapabilities: ['supports3DS'],
         supportedNetworks: ['visa', 'masterCard'],
         countryCode: 'US',
-        currencyCode: 'USD',
     },
 });
 const defaultMethods = Object.freeze([applePay]);

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-canmakepayment-method.https.html (223162 => 223163)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-canmakepayment-method.https.html	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-canmakepayment-method.https.html	2017-10-11 02:57:12 UTC (rev 223163)
@@ -16,7 +16,6 @@
         merchantCapabilities: ["supports3DS"],
         supportedNetworks: ["visa", "masterCard"],
         countryCode: "US",
-        currencyCode: "USD",
     }
 });
 const defaultMethods = Object.freeze([applePay]);

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html (223162 => 223163)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html	2017-10-11 02:57:12 UTC (rev 223163)
@@ -17,7 +17,6 @@
         merchantCapabilities: ['supports3DS'],
         supportedNetworks: ['visa', 'masterCard'],
         countryCode: 'US',
-        currencyCode: 'USD',
     },
 });
 const defaultMethods = Object.freeze([applePay]);

Modified: trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https-expected.txt (223162 => 223163)


--- trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https-expected.txt	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https-expected.txt	2017-10-11 02:57:12 UTC (rev 223163)
@@ -28,26 +28,6 @@
 SETUP: paymentMethod = validPaymentMethod(); paymentMethod.data.countryCode = 7;
 PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: "7" is not a valid country code..
 
-Testing ApplePayRequest.currencyCode
-
-SETUP: paymentMethod = validPaymentMethod(); delete paymentMethod.data.currencyCode;
-PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: Member ApplePayRequest.currencyCode is required and must be an instance of DOMString.
-
-SETUP: paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = 'invalid';
-PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: "invalid" is not a valid currency code..
-
-SETUP: paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = '';
-PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: "" is not a valid currency code..
-
-SETUP: paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = null;
-PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: "null" is not a valid currency code..
-
-SETUP: paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = undefined;
-PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: Member ApplePayRequest.currencyCode is required and must be an instance of DOMString.
-
-SETUP: paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = 7;
-PASS request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show() rejected promise  with TypeError: "7" is not a valid currency code..
-
 Testing ApplePayRequest.supportedNetworks
 
 SETUP: paymentMethod = validPaymentMethod(); delete paymentMethod.data.supportedNetworks;
@@ -218,6 +198,8 @@
 SETUP: paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '10.00', type: 'invalid' }];
 PASS request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show() threw exception TypeError: Type error.
 
+SETUP: paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: { currency: 'EUR', value: '10.00' } }];
+PASS request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show() rejected promise  with TypeError: "EUR" does not match the expected currency of "USD". Apple Pay requires all PaymentCurrencyAmounts to use the same currency code..
 Testing PaymentDetails.shippingOptions
 
 SETUP: paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = '';
@@ -253,6 +235,8 @@
 SETUP: paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '-1', detail: '', identifier: '', label: '' }];
 PASS request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show() threw exception TypeError: Type error.
 
+SETUP: paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: { currency: 'EUR', value: '10.00' }, id: '', label: '' }];
+PASS request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show() rejected promise  with TypeError: "EUR" does not match the expected currency of "USD". Apple Pay requires all PaymentCurrencyAmounts to use the same currency code..
 Testing PaymentOptions
 
 SETUP: paymentOptions = {}; paymentOptions.shippingType = '';

Modified: trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https.html (223162 => 223163)


--- trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https.html	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https.html	2017-10-11 02:57:12 UTC (rev 223163)
@@ -18,7 +18,6 @@
             version: 2,
             merchantIdentifier: '',
             countryCode: 'US',
-            currencyCode: 'USD',
             supportedNetworks: ['visa', 'masterCard'],
             merchantCapabilities: ['supports3DS'],
         },
@@ -73,21 +72,6 @@
     await logAndShouldReject("paymentMethod = validPaymentMethod(); paymentMethod.data.countryCode = 7;", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
     debug("")
 
-    debug("Testing ApplePayRequest.currencyCode")
-    debug("")
-    await logAndShouldReject("paymentMethod = validPaymentMethod(); delete paymentMethod.data.currencyCode;", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
-    debug("")
-    await logAndShouldReject("paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = 'invalid';", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
-    debug("")
-    await logAndShouldReject("paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = '';", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
-    debug("")
-    await logAndShouldReject("paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = null;", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
-    debug("")
-    await logAndShouldReject("paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = undefined;", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
-    debug("")
-    await logAndShouldReject("paymentMethod = validPaymentMethod(); paymentMethod.data.currencyCode = 7;", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
-    debug("")
-
     debug("Testing ApplePayRequest.supportedNetworks")
     debug("")
     await logAndShouldReject("paymentMethod = validPaymentMethod(); delete paymentMethod.data.supportedNetworks;", "request = new PaymentRequest([paymentMethod], validPaymentDetails()); request.show()")
@@ -190,7 +174,8 @@
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '10.00', type: 'invalid' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    
+    await logAndShouldReject("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: { currency: 'EUR', value: '10.00' } }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+
     debug("Testing PaymentDetails.shippingOptions")
     debug("");
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
@@ -204,6 +189,7 @@
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '', identifier: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '', identifier: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '-1', detail: '', identifier: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldReject("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: { currency: 'EUR', value: '10.00' }, id: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
 
     debug("Testing PaymentOptions")
     debug("");

Modified: trunk/Source/WebCore/ChangeLog (223162 => 223163)


--- trunk/Source/WebCore/ChangeLog	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/ChangeLog	2017-10-11 02:57:12 UTC (rev 223163)
@@ -1,5 +1,35 @@
 2017-10-10  Andy Estes  <aes...@apple.com>
 
+        [Payment Request] Validate that all PaymentCurrencyAmounts use the same currency code when using Apple Pay
+        https://bugs.webkit.org/show_bug.cgi?id=178150
+
+        Reviewed by Tim Horton.
+
+        Apple Pay requires a single currency code, but the Payment Request API allows the client to
+        specify a currency code for each PaymentCurrencyAmount.
+
+        Instead of having a required currencyCode property on ApplePayRequest and ignoring the
+        currency property on PaymentCurrencyAmount, validate that all PaymentCurrencyAmounts use the
+        same currency code and use that as ApplePaySessionPaymentRequest's currencyCode.
+
+        Added test cases to http/tests/ssl/applepay/PaymentRequest.https.html.
+
+        * Modules/applepay/ApplePayPaymentRequest.h:
+        * Modules/applepay/ApplePayPaymentRequest.idl:
+        * Modules/applepay/ApplePayRequestBase.cpp:
+        (WebCore::convertAndValidate):
+        * Modules/applepay/ApplePayRequestBase.h:
+        * Modules/applepay/ApplePayRequestBase.idl:
+        * Modules/applepay/ApplePaySession.cpp:
+        (WebCore::convertAndValidate):
+        * Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
+        (WebCore::validate):
+        (WebCore::convertAndValidate):
+        (WebCore::ApplePayPaymentHandler::show):
+        * Modules/applepay/paymentrequest/ApplePayRequest.idl:
+
+2017-10-10  Andy Estes  <aes...@apple.com>
+
         [Payment Request] Implement PaymentRequest.canMakePayment()
         https://bugs.webkit.org/show_bug.cgi?id=178048
 

Modified: trunk/Source/WebCore/Modules/applepay/ApplePayPaymentRequest.h (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/ApplePayPaymentRequest.h	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayPaymentRequest.h	2017-10-11 02:57:12 UTC (rev 223163)
@@ -29,15 +29,17 @@
 
 #include "ApplePayLineItem.h"
 #include "ApplePayPaymentContact.h"
-#include "ApplePayRequest.h"
+#include "ApplePayRequestBase.h"
 #include "ApplePaySessionPaymentRequest.h"
 #include "ApplePayShippingMethod.h"
 
 namespace WebCore {
 
-struct ApplePayPaymentRequest : ApplePayRequest {
+struct ApplePayPaymentRequest : ApplePayRequestBase {
     using ShippingType = ApplePaySessionPaymentRequest::ShippingType;
 
+    String currencyCode;
+
     std::optional<Vector<ApplePayContactField>> requiredShippingContactFields;
     std::optional<ApplePayPaymentContact> shippingContact;
 

Modified: trunk/Source/WebCore/Modules/applepay/ApplePayPaymentRequest.idl (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/ApplePayPaymentRequest.idl	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayPaymentRequest.idl	2017-10-11 02:57:12 UTC (rev 223163)
@@ -38,6 +38,8 @@
     required ApplePayLineItem total;
     sequence<ApplePayLineItem> lineItems;
 
+    required DOMString currencyCode;
+
     sequence<ApplePayContactField> requiredShippingContactFields;
     ApplePayPaymentContact shippingContact;
 

Modified: trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.cpp (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.cpp	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.cpp	2017-10-11 02:57:12 UTC (rev 223163)
@@ -46,9 +46,7 @@
 ExceptionOr<ApplePaySessionPaymentRequest> convertAndValidate(unsigned version, ApplePayRequestBase& request)
 {
     ApplePaySessionPaymentRequest result;
-
     result.setCountryCode(request.countryCode);
-    result.setCurrencyCode(request.currencyCode);
 
     auto merchantCapabilities = convertAndValidate(request.merchantCapabilities);
     if (merchantCapabilities.hasException())

Modified: trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.h (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.h	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.h	2017-10-11 02:57:12 UTC (rev 223163)
@@ -37,7 +37,6 @@
     Vector<ApplePayMerchantCapability> merchantCapabilities;
     Vector<String> supportedNetworks;
     String countryCode;
-    String currencyCode;
 
     std::optional<Vector<ApplePayContactField>> requiredBillingContactFields;
     std::optional<ApplePayPaymentContact> billingContact;

Modified: trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.idl (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.idl	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayRequestBase.idl	2017-10-11 02:57:12 UTC (rev 223163)
@@ -29,7 +29,6 @@
     required sequence<ApplePayMerchantCapability> merchantCapabilities;
     required sequence<DOMString> supportedNetworks; // FIXME: Should this be an sequence of enums?
     required DOMString countryCode;
-    required DOMString currencyCode;
 
     sequence<ApplePayContactField> requiredBillingContactFields;
     ApplePayPaymentContact billingContact;

Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp	2017-10-11 02:57:12 UTC (rev 223163)
@@ -213,6 +213,7 @@
         return convertedRequest.releaseException();
 
     auto result = convertedRequest.releaseReturnValue();
+    result.setCurrencyCode(paymentRequest.currencyCode);
 
     auto total = convertAndValidateTotal(WTFMove(paymentRequest.total));
     if (total.hasException())

Modified: trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp	2017-10-11 02:57:12 UTC (rev 223163)
@@ -67,8 +67,19 @@
 {
 }
 
-static ApplePaySessionPaymentRequest::LineItem convert(const PaymentItem& item)
+static ExceptionOr<void> validate(const PaymentCurrencyAmount& amount, const String& expectedCurrency)
 {
+    if (amount.currency != expectedCurrency)
+        return Exception { TypeError, makeString("\"", amount.currency, "\" does not match the expected currency of \"", expectedCurrency, "\". Apple Pay requires all PaymentCurrencyAmounts to use the same currency code.") };
+    return { };
+}
+
+static ExceptionOr<ApplePaySessionPaymentRequest::LineItem> convertAndValidate(const PaymentItem& item, const String& expectedCurrency)
+{
+    auto exception = validate(item.amount, expectedCurrency);
+    if (exception.hasException())
+        return exception.releaseException();
+
     ApplePaySessionPaymentRequest::LineItem lineItem;
     lineItem.amount = item.amount.value;
     lineItem.type = item.pending ? ApplePaySessionPaymentRequest::LineItem::Type::Pending : ApplePaySessionPaymentRequest::LineItem::Type::Final;
@@ -76,12 +87,16 @@
     return lineItem;
 }
 
-static Vector<ApplePaySessionPaymentRequest::LineItem> convert(const Vector<PaymentItem>& lineItems)
+static ExceptionOr<Vector<ApplePaySessionPaymentRequest::LineItem>> convertAndValidate(const Vector<PaymentItem>& lineItems, const String& expectedCurrency)
 {
     Vector<ApplePaySessionPaymentRequest::LineItem> result;
     result.reserveInitialCapacity(lineItems.size());
-    for (auto& lineItem : lineItems)
-        result.uncheckedAppend(convert(lineItem));
+    for (auto& lineItem : lineItems) {
+        auto convertedLineItem = convertAndValidate(lineItem, expectedCurrency);
+        if (convertedLineItem.hasException())
+            return convertedLineItem.releaseException();
+        result.uncheckedAppend(convertedLineItem.releaseReturnValue());
+    }
     return result;
 }
 
@@ -110,8 +125,12 @@
     return ApplePaySessionPaymentRequest::ShippingType::Shipping;
 }
 
-static ApplePaySessionPaymentRequest::ShippingMethod convert(const PaymentShippingOption& shippingOption)
+static ExceptionOr<ApplePaySessionPaymentRequest::ShippingMethod> convertAndValidate(const PaymentShippingOption& shippingOption, const String& expectedCurrency)
 {
+    auto exception = validate(shippingOption.amount, expectedCurrency);
+    if (exception.hasException())
+        return exception.releaseException();
+
     ApplePaySessionPaymentRequest::ShippingMethod result;
     result.amount = shippingOption.amount.value;
     result.label = shippingOption.label;
@@ -137,13 +156,29 @@
         return validatedRequest.releaseException();
 
     ApplePaySessionPaymentRequest request = validatedRequest.releaseReturnValue();
-    request.setTotal(convert(m_paymentRequest->paymentDetails().total));
 
-    auto lineItems = convert(m_paymentRequest->paymentDetails().displayItems);
+    String expectedCurrency = m_paymentRequest->paymentDetails().total.amount.currency;
+    request.setCurrencyCode(expectedCurrency);
+
+    auto total = convertAndValidate(m_paymentRequest->paymentDetails().total, expectedCurrency);
+    ASSERT(!total.hasException());
+    request.setTotal(total.releaseReturnValue());
+
+    auto convertedLineItems = convertAndValidate(m_paymentRequest->paymentDetails().displayItems, expectedCurrency);
+    if (convertedLineItems.hasException())
+        return convertedLineItems.releaseException();
+
+    auto lineItems = convertedLineItems.releaseReturnValue();
     for (auto& modifier : m_paymentRequest->paymentDetails().modifiers) {
         auto convertedIdentifier = convertAndValidatePaymentMethodIdentifier(modifier.supportedMethods);
-        if (convertedIdentifier && handlesIdentifier(*convertedIdentifier))
-            lineItems.appendVector(convert(modifier.additionalDisplayItems));
+        if (!convertedIdentifier || !handlesIdentifier(*convertedIdentifier))
+            continue;
+
+        auto additionalDisplayItems = convertAndValidate(modifier.additionalDisplayItems, expectedCurrency);
+        if (additionalDisplayItems.hasException())
+            return additionalDisplayItems.releaseException();
+
+        lineItems.appendVector(additionalDisplayItems.releaseReturnValue());
     }
     request.setLineItems(lineItems);
 
@@ -153,8 +188,12 @@
 
     Vector<ApplePaySessionPaymentRequest::ShippingMethod> shippingMethods;
     shippingMethods.reserveInitialCapacity(m_paymentRequest->paymentDetails().shippingOptions.size());
-    for (auto& shippingOption : m_paymentRequest->paymentDetails().shippingOptions)
-        shippingMethods.uncheckedAppend(convert(shippingOption));
+    for (auto& shippingOption : m_paymentRequest->paymentDetails().shippingOptions) {
+        auto convertedShippingOption = convertAndValidate(shippingOption, expectedCurrency);
+        if (convertedShippingOption.hasException())
+            return convertedShippingOption.releaseException();
+        shippingMethods.uncheckedAppend(convertedShippingOption.releaseReturnValue());
+    }
     request.setShippingMethods(shippingMethods);
 
     auto exception = PaymentRequestValidator::validate(request);

Modified: trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayRequest.idl (223162 => 223163)


--- trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayRequest.idl	2017-10-11 01:01:53 UTC (rev 223162)
+++ trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayRequest.idl	2017-10-11 02:57:12 UTC (rev 223163)
@@ -29,3 +29,4 @@
     required unsigned long version;
     required DOMString merchantIdentifier;
 };
+
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to