Title: [273159] trunk/Source
Revision
273159
Author
drou...@apple.com
Date
2021-02-19 12:47:53 -0800 (Fri, 19 Feb 2021)

Log Message

[Payment Request] add support for Apple Pay payment method mode
https://bugs.webkit.org/show_bug.cgi?id=222128
<rdar://problem/72320278>

Reviewed by Wenson Hsieh.

Source/WebCore:

* Modules/applepay/ApplePayPaymentMethodModeUpdate.idl: Added.
* Modules/applepay/ApplePayPaymentMethodModeUpdate.h: Added.
(WebCore::ApplePayPaymentMethodModeUpdate::encode const):
(WebCore::ApplePayPaymentMethodModeUpdate::decode):
Allow all aspects of the current payment request to be updated.

* Modules/applepay/ApplePaySession.h:
* Modules/applepay/ApplePaySession.cpp:
(WebCore::convertAndValidate):
(WebCore::ApplePaySession::didChangePaymentMethodMode): Added.
(WebCore::ApplePaySession::canSuspendWithoutCanceling const):
(WebCore::ApplePaySession::canBegin const):
(WebCore::ApplePaySession::canAbort const):
(WebCore::ApplePaySession::canCancel const):
(WebCore::ApplePaySession::canCompleteShippingMethodSelection const):
(WebCore::ApplePaySession::canCompleteShippingContactSelection const):
(WebCore::ApplePaySession::canCompletePaymentMethodSelection const):
(WebCore::ApplePaySession::canCompletePaymentMethodModeChange const): Added.
(WebCore::ApplePaySession::canCompletePayment const):
(WebCore::ApplePaySession::isFinalState const):
Dispatch a new event for when the payment method mode changes and add a new method to be
called inside that event handler.

* Modules/applepay/paymentrequest/ApplePayPaymentHandler.h:
* Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
(WebCore::ApplePayPaymentHandler::computeErrors const): Added.
(WebCore::ApplePayPaymentHandler::detailsUpdated):
(WebCore::ApplePayPaymentHandler::shippingAddressUpdated):
(WebCore::ApplePayPaymentHandler::shippingOptionUpdated):
(WebCore::ApplePayPaymentHandler::paymentMethodUpdated):
(WebCore::ApplePayPaymentHandler::didAuthorizePayment):
(WebCore::ApplePayPaymentHandler::didSelectShippingMethod):
(WebCore::ApplePayPaymentHandler::didSelectShippingContact):
(WebCore::ApplePayPaymentHandler::didSelectPaymentMethod):
(WebCore::ApplePayPaymentHandler::didChangePaymentMethodMode): Added.
Use the existing `PaymentMethodChangeEvent` by providing the new mode in `methodDetails`.

* Modules/applepay/PaymentCoordinator.h:
* Modules/applepay/PaymentCoordinator.cpp:
(WebCore::PaymentCoordinator::completePaymentMethodModeChange): Added.
(WebCore::PaymentCoordinator::didChangePaymentMethodMode): Added.
* Modules/applepay/PaymentCoordinatorClient.h:
* Modules/applepay/PaymentSession.h:
Piping from/to the WebProcess for payment method mode changes.

* dom/EventNames.h:
* Modules/applepay/ApplePayErrorCode.h:
* Modules/applepay/ApplePayErrorCode.idl:
New enum values for payment method mode errors.

* Modules/applepay/PaymentHeaders.h:
* loader/EmptyClients.cpp:
* testing/MockPaymentCoordinator.h:
* testing/MockPaymentCoordinator.cpp:
(WebCore::MockPaymentCoordinator::completePaymentMethodModeChange): Added.

* PlatformMac.cmake:
* SourcesCocoa.txt:
* WebCore.xcodeproj/project.pbxproj:
* DerivedSources-input.xcfilelist:
* DerivedSources-output.xcfilelist:
* DerivedSources.make:

Source/WebKit:

Handle the delegate call from `PaymentAuthorization(View)Controller` by passing it along to
the WebProcess to be handled by WebCore. Handle the response sent by the WebProcess by
invoking the callback that was provided by the delegate call (which is saved to an ivar).

* WebProcess/ApplePay/WebPaymentCoordinator.messages.in:
* WebProcess/ApplePay/WebPaymentCoordinator.h:
* WebProcess/ApplePay/WebPaymentCoordinator.cpp:
(WebKit::WebPaymentCoordinator::completePaymentMethodModeChange): Added.
(WebKit::WebPaymentCoordinator::didChangePaymentMethodMode): Added.

* Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in:
* Shared/ApplePay/WebPaymentCoordinatorProxy.h:
* Shared/ApplePay/WebPaymentCoordinatorProxy.cpp:
(WebKit::WebPaymentCoordinatorProxy::completePaymentMethodModeChange): Added.
(WebKit::WebPaymentCoordinatorProxy::presenterDidChangePaymentMethodMode): Added.
(WebKit::WebPaymentCoordinatorProxy::canBegin const):
(WebKit::WebPaymentCoordinatorProxy::canCancel const):
(WebKit::WebPaymentCoordinatorProxy::canCompletePayment const):
(WebKit::WebPaymentCoordinatorProxy::canAbort const):

* Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm:
(WebKit::WebPaymentCoordinatorProxy::platformCompletePaymentMethodModeChange): Added.
* Platform/cocoa/PaymentAuthorizationPresenter.h:
* Platform/cocoa/PaymentAuthorizationPresenter.mm:
(WebKit::toPKPaymentErrorCode):
(WebKit::PaymentAuthorizationPresenter::completePaymentMethodModeChange): Added.

* Platform/cocoa/PaymentAuthorizationViewController.mm:
* Platform/cocoa/WKPaymentAuthorizationDelegate.h:
* Platform/cocoa/WKPaymentAuthorizationDelegate.mm:
* Platform/ios/PaymentAuthorizationController.mm:

Source/WebKitLegacy/mac:

* WebCoreSupport/WebPaymentCoordinatorClient.h:
* WebCoreSupport/WebPaymentCoordinatorClient.mm:
(WebPaymentCoordinatorClient::completePaymentMethodModeChange):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (273158 => 273159)


--- trunk/Source/WebCore/ChangeLog	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/ChangeLog	2021-02-19 20:47:53 UTC (rev 273159)
@@ -1,3 +1,74 @@
+2021-02-19  Devin Rousso  <drou...@apple.com>
+
+        [Payment Request] add support for Apple Pay payment method mode
+        https://bugs.webkit.org/show_bug.cgi?id=222128
+        <rdar://problem/72320278>
+
+        Reviewed by Wenson Hsieh.
+
+        * Modules/applepay/ApplePayPaymentMethodModeUpdate.idl: Added.
+        * Modules/applepay/ApplePayPaymentMethodModeUpdate.h: Added.
+        (WebCore::ApplePayPaymentMethodModeUpdate::encode const):
+        (WebCore::ApplePayPaymentMethodModeUpdate::decode):
+        Allow all aspects of the current payment request to be updated.
+
+        * Modules/applepay/ApplePaySession.h:
+        * Modules/applepay/ApplePaySession.cpp:
+        (WebCore::convertAndValidate):
+        (WebCore::ApplePaySession::didChangePaymentMethodMode): Added.
+        (WebCore::ApplePaySession::canSuspendWithoutCanceling const):
+        (WebCore::ApplePaySession::canBegin const):
+        (WebCore::ApplePaySession::canAbort const):
+        (WebCore::ApplePaySession::canCancel const):
+        (WebCore::ApplePaySession::canCompleteShippingMethodSelection const):
+        (WebCore::ApplePaySession::canCompleteShippingContactSelection const):
+        (WebCore::ApplePaySession::canCompletePaymentMethodSelection const):
+        (WebCore::ApplePaySession::canCompletePaymentMethodModeChange const): Added.
+        (WebCore::ApplePaySession::canCompletePayment const):
+        (WebCore::ApplePaySession::isFinalState const):
+        Dispatch a new event for when the payment method mode changes and add a new method to be
+        called inside that event handler.
+
+        * Modules/applepay/paymentrequest/ApplePayPaymentHandler.h:
+        * Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
+        (WebCore::ApplePayPaymentHandler::computeErrors const): Added.
+        (WebCore::ApplePayPaymentHandler::detailsUpdated):
+        (WebCore::ApplePayPaymentHandler::shippingAddressUpdated):
+        (WebCore::ApplePayPaymentHandler::shippingOptionUpdated):
+        (WebCore::ApplePayPaymentHandler::paymentMethodUpdated):
+        (WebCore::ApplePayPaymentHandler::didAuthorizePayment):
+        (WebCore::ApplePayPaymentHandler::didSelectShippingMethod):
+        (WebCore::ApplePayPaymentHandler::didSelectShippingContact):
+        (WebCore::ApplePayPaymentHandler::didSelectPaymentMethod):
+        (WebCore::ApplePayPaymentHandler::didChangePaymentMethodMode): Added.
+        Use the existing `PaymentMethodChangeEvent` by providing the new mode in `methodDetails`.
+
+        * Modules/applepay/PaymentCoordinator.h:
+        * Modules/applepay/PaymentCoordinator.cpp:
+        (WebCore::PaymentCoordinator::completePaymentMethodModeChange): Added.
+        (WebCore::PaymentCoordinator::didChangePaymentMethodMode): Added.
+        * Modules/applepay/PaymentCoordinatorClient.h:
+        * Modules/applepay/PaymentSession.h:
+        Piping from/to the WebProcess for payment method mode changes.
+
+        * dom/EventNames.h:
+        * Modules/applepay/ApplePayErrorCode.h:
+        * Modules/applepay/ApplePayErrorCode.idl:
+        New enum values for payment method mode errors.
+
+        * Modules/applepay/PaymentHeaders.h:
+        * loader/EmptyClients.cpp:
+        * testing/MockPaymentCoordinator.h:
+        * testing/MockPaymentCoordinator.cpp:
+        (WebCore::MockPaymentCoordinator::completePaymentMethodModeChange): Added.
+
+        * PlatformMac.cmake:
+        * SourcesCocoa.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * DerivedSources-input.xcfilelist:
+        * DerivedSources-output.xcfilelist:
+        * DerivedSources.make:
+
 2021-02-19  Youenn Fablet  <you...@apple.com>
 
         Allow to use BigInt as key identifier

Modified: trunk/Source/WebCore/DerivedSources-input.xcfilelist (273158 => 273159)


--- trunk/Source/WebCore/DerivedSources-input.xcfilelist	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/DerivedSources-input.xcfilelist	2021-02-19 20:47:53 UTC (rev 273159)
@@ -41,6 +41,7 @@
 $(PROJECT_DIR)/Modules/applepay/ApplePayPaymentAuthorizedEvent.idl
 $(PROJECT_DIR)/Modules/applepay/ApplePayPaymentContact.idl
 $(PROJECT_DIR)/Modules/applepay/ApplePayPaymentMethod.idl
+$(PROJECT_DIR)/Modules/applepay/ApplePayPaymentMethodModeUpdate.idl
 $(PROJECT_DIR)/Modules/applepay/ApplePayPaymentMethodSelectedEvent.idl
 $(PROJECT_DIR)/Modules/applepay/ApplePayPaymentMethodType.idl
 $(PROJECT_DIR)/Modules/applepay/ApplePayPaymentMethodUpdate.idl

Modified: trunk/Source/WebCore/DerivedSources-output.xcfilelist (273158 => 273159)


--- trunk/Source/WebCore/DerivedSources-output.xcfilelist	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/DerivedSources-output.xcfilelist	2021-02-19 20:47:53 UTC (rev 273159)
@@ -122,6 +122,8 @@
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentContact.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethod.cpp
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethod.h
+$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethodModeUpdate.cpp
+$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethodModeUpdate.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethodSelectedEvent.cpp
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethodSelectedEvent.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentMethodType.cpp

Modified: trunk/Source/WebCore/DerivedSources.make (273158 => 273159)


--- trunk/Source/WebCore/DerivedSources.make	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/DerivedSources.make	2021-02-19 20:47:53 UTC (rev 273159)
@@ -70,6 +70,7 @@
     $(WebCore)/Modules/applepay/ApplePayPaymentAuthorizedEvent.idl \
     $(WebCore)/Modules/applepay/ApplePayPaymentContact.idl \
     $(WebCore)/Modules/applepay/ApplePayPaymentMethod.idl \
+    $(WebCore)/Modules/applepay/ApplePayPaymentMethodModeUpdate.idl \
     $(WebCore)/Modules/applepay/ApplePayPaymentMethodSelectedEvent.idl \
     $(WebCore)/Modules/applepay/ApplePayPaymentMethodType.idl \
     $(WebCore)/Modules/applepay/ApplePayPaymentMethodUpdate.idl \

Modified: trunk/Source/WebCore/Modules/applepay/ApplePayErrorCode.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/ApplePayErrorCode.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayErrorCode.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -29,6 +29,10 @@
 
 #include <wtf/Forward.h>
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/ApplePayErrorCodeAdditions.h>
+#endif
+
 namespace WebCore {
 
 enum class ApplePayErrorCode {
@@ -36,6 +40,9 @@
     ShippingContactInvalid,
     BillingContactInvalid,
     AddressUnserviceable,
+#if defined(ApplePayErrorCodeAdditions_values)
+    ApplePayErrorCodeAdditions_values
+#endif
 };
 
 } // namespace WebCore
@@ -49,6 +56,9 @@
         WebCore::ApplePayErrorCode::ShippingContactInvalid,
         WebCore::ApplePayErrorCode::BillingContactInvalid,
         WebCore::ApplePayErrorCode::AddressUnserviceable
+#if defined(ApplePayErrorCodeAdditions_EnumTraits)
+        ApplePayErrorCodeAdditions_EnumTraits
+#endif
     >;
 };
 

Added: trunk/Source/WebCore/Modules/applepay/ApplePayPaymentMethodModeUpdate.h (0 => 273159)


--- trunk/Source/WebCore/Modules/applepay/ApplePayPaymentMethodModeUpdate.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayPaymentMethodModeUpdate.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+#include "ApplePayDetailsUpdateBase.h"
+#include "ApplePayError.h"
+#include "ApplePayShippingMethod.h"
+#include <wtf/Optional.h>
+#include <wtf/RefPtr.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+
+struct ApplePayPaymentMethodModeUpdate final : public ApplePayDetailsUpdateBase {
+    Vector<RefPtr<ApplePayError>> errors;
+
+    Vector<ApplePayShippingMethod> newShippingMethods;
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static Optional<ApplePayPaymentMethodModeUpdate> decode(Decoder&);
+};
+
+template<class Encoder>
+void ApplePayPaymentMethodModeUpdate::encode(Encoder& encoder) const
+{
+    ApplePayDetailsUpdateBase::encode(encoder);
+    encoder << errors;
+    encoder << newShippingMethods;
+}
+
+template<class Decoder>
+Optional<ApplePayPaymentMethodModeUpdate> ApplePayPaymentMethodModeUpdate::decode(Decoder& decoder)
+{
+    ApplePayPaymentMethodModeUpdate result;
+
+    if (!result.decodeBase(decoder))
+        return WTF::nullopt;
+
+    Optional<Vector<RefPtr<ApplePayError>>> errors;
+    decoder >> errors;
+    if (!errors)
+        return WTF::nullopt;
+    result.errors = WTFMove(*errors);
+
+    Optional<Vector<ApplePayShippingMethod>> newShippingMethods;
+    decoder >> newShippingMethods;
+    if (!newShippingMethods)
+        return WTF::nullopt;
+    result.newShippingMethods = WTFMove(*newShippingMethods);
+
+    return result;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)

Copied: trunk/Source/WebCore/Modules/applepay/ApplePayPaymentMethodModeUpdate.idl (from rev 273158, trunk/Source/WebCore/Modules/applepay/PaymentHeaders.h) (0 => 273159)


--- trunk/Source/WebCore/Modules/applepay/ApplePayPaymentMethodModeUpdate.idl	                        (rev 0)
+++ trunk/Source/WebCore/Modules/applepay/ApplePayPaymentMethodModeUpdate.idl	2021-02-19 20:47:53 UTC (rev 273159)
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+[
+    Conditional=APPLE_PAY_PAYMENT_METHOD_MODE,
+] dictionary ApplePayPaymentMethodModeUpdate : ApplePayDetailsUpdateBase {
+    sequence<ApplePayError> errors;
+
+    sequence<ApplePayShippingMethod> newShippingMethods;
+};

Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -34,6 +34,7 @@
 #include "ApplePayLineItem.h"
 #include "ApplePayPaymentAuthorizationResult.h"
 #include "ApplePayPaymentAuthorizedEvent.h"
+#include "ApplePayPaymentMethodModeUpdate.h"
 #include "ApplePayPaymentMethodSelectedEvent.h"
 #include "ApplePayPaymentMethodUpdate.h"
 #include "ApplePayPaymentRequest.h"
@@ -350,6 +351,30 @@
     return WTFMove(update);
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+static ExceptionOr<ApplePayPaymentMethodModeUpdate> convertAndValidate(ApplePayPaymentMethodModeUpdate&& update)
+{
+    auto convertedNewShippingMethods = convertAndValidate(WTFMove(update.newShippingMethods));
+    if (convertedNewShippingMethods.hasException())
+        return convertedNewShippingMethods.releaseException();
+    update.newShippingMethods = convertedNewShippingMethods.releaseReturnValue();
+
+    auto convertedNewTotal = convertAndValidateTotal(WTFMove(update.newTotal));
+    if (convertedNewTotal.hasException())
+        return convertedNewTotal.releaseException();
+    update.newTotal = convertedNewTotal.releaseReturnValue();
+
+    auto convertedNewLineItems = convertAndValidate(WTFMove(update.newLineItems));
+    if (convertedNewLineItems.hasException())
+        return convertedNewLineItems.releaseException();
+    update.newLineItems = convertedNewLineItems.releaseReturnValue();
+
+    return WTFMove(update);
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 ExceptionOr<Ref<ApplePaySession>> ApplePaySession::create(Document& document, unsigned version, ApplePayPaymentRequest&& paymentRequest)
 {
     auto canCall = canCreateSession(document);
@@ -771,6 +796,19 @@
     dispatchEvent(event.get());
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void ApplePaySession::didChangePaymentMethodMode(String&& paymentMethodMode)
+{
+    ASSERT(m_state == State::Active);
+
+#if defined(ApplePaySessionAdditions_didChangePaymentMethodMode)
+    ApplePaySessionAdditions_didChangePaymentMethodMode
+#endif
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void ApplePaySession::didCancelPaymentSession(PaymentSessionError&& error)
 {
     ASSERT(canCancel());
@@ -802,6 +840,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return false;
     }
@@ -852,6 +893,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return false;
     }
@@ -871,6 +915,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return true;
     }
@@ -890,6 +937,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return true;
     }
@@ -917,6 +967,9 @@
     case State::Authorized:
     case State::PaymentMethodSelected:
     case State::ShippingContactSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return false;
 
@@ -936,6 +989,9 @@
     case State::Authorized:
     case State::PaymentMethodSelected:
     case State::ShippingMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return false;
 
@@ -955,6 +1011,9 @@
     case State::Authorized:
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return false;
 
@@ -963,6 +1022,30 @@
     }
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+bool ApplePaySession::canCompletePaymentMethodModeChange() const
+{
+    switch (m_state) {
+    case State::Idle:
+    case State::Aborted:
+    case State::Active:
+    case State::Completed:
+    case State::Canceled:
+    case State::Authorized:
+    case State::ShippingMethodSelected:
+    case State::ShippingContactSelected:
+    case State::CancelRequested:
+    case State::PaymentMethodSelected:
+        return false;
+
+    case State::PaymentMethodModeChanged:
+        return true;
+    }
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 bool ApplePaySession::canCompletePayment() const
 {
     switch (m_state) {
@@ -974,6 +1057,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::CancelRequested:
         return false;
 
@@ -990,6 +1076,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     case State::Authorized:
     case State::CancelRequested:
         return false;
@@ -1007,6 +1096,10 @@
     unsetPendingActivity(*this);
 }
 
+#if defined(ApplePaySessionAdditions_definitions)
+ApplePaySessionAdditions_definitions
+#endif
+
 }
 
 #endif

Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -35,6 +35,10 @@
 #include <wtf/Ref.h>
 #include <wtf/RefCounted.h>
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/ApplePaySessionAdditions.h>
+#endif
+
 namespace JSC {
 class CallFrame;
 class JSGlobalObject;
@@ -54,6 +58,9 @@
 struct ApplePayPaymentRequest;
 struct ApplePayShippingMethod;
 struct ApplePayPaymentAuthorizationResult;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+struct ApplePayPaymentMethodModeUpdate;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
 struct ApplePayPaymentMethodUpdate;
 struct ApplePayShippingContactUpdate;
 struct ApplePayShippingMethodUpdate;
@@ -118,6 +125,9 @@
     void didSelectShippingMethod(const ApplePayShippingMethod&) override;
     void didSelectShippingContact(const PaymentContact&) override;
     void didSelectPaymentMethod(const PaymentMethod&) override;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void didChangePaymentMethodMode(String&& paymentMethodMode) override;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void didCancelPaymentSession(PaymentSessionError&&) override;
 
     PaymentCoordinator& paymentCoordinator() const;
@@ -129,6 +139,9 @@
     bool canCompleteShippingMethodSelection() const;
     bool canCompleteShippingContactSelection() const;
     bool canCompletePaymentMethodSelection() const;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    bool canCompletePaymentMethodModeChange() const;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     bool canCompletePayment() const;
     bool canSuspendWithoutCanceling() const;
 
@@ -142,6 +155,9 @@
         ShippingMethodSelected,
         ShippingContactSelected,
         PaymentMethodSelected,
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+        PaymentMethodModeChanged,
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
         CancelRequested,
         Authorized,
         Completed,
@@ -158,6 +174,10 @@
 
     const ApplePaySessionPaymentRequest m_paymentRequest;
     unsigned m_version;
+
+#if defined(ApplePaySessionAdditions_declarations)
+    ApplePaySessionAdditions_declarations
+#endif
 };
 
 }

Modified: trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.cpp (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -28,6 +28,7 @@
 
 #if ENABLE(APPLE_PAY)
 
+#include "ApplePayPaymentMethodModeUpdate.h"
 #include "ApplePayPaymentMethodUpdate.h"
 #include "ApplePayShippingContactUpdate.h"
 #include "ApplePayShippingMethod.h"
@@ -153,6 +154,17 @@
     m_client.completePaymentMethodSelection(WTFMove(update));
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void PaymentCoordinator::completePaymentMethodModeChange(Optional<ApplePayPaymentMethodModeUpdate>&& update)
+{
+    ASSERT(m_activeSession);
+    RELEASE_LOG_IF_ALLOWED("completePaymentMethodModeChange()");
+    m_client.completePaymentMethodModeChange(WTFMove(update));
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void PaymentCoordinator::completePaymentSession(Optional<PaymentAuthorizationResult>&& result)
 {
     ASSERT(m_activeSession);
@@ -237,6 +249,21 @@
     m_activeSession->didSelectShippingContact(shippingContact);
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void PaymentCoordinator::didChangePaymentMethodMode(String&& paymentMethodMode)
+{
+    if (!m_activeSession) {
+        // It's possible that the payment has been aborted already.
+        return;
+    }
+
+    RELEASE_LOG_IF_ALLOWED("didChangePaymentMethodMode()");
+    m_activeSession->didChangePaymentMethodMode(WTFMove(paymentMethodMode));
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void PaymentCoordinator::didCancelPaymentSession(PaymentSessionError&& error)
 {
     if (!m_activeSession) {

Modified: trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -45,6 +45,9 @@
 class PaymentSession;
 class PaymentSessionError;
 enum class PaymentAuthorizationStatus;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+struct ApplePayPaymentMethodModeUpdate;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
 struct ApplePayPaymentMethodUpdate;
 struct ApplePaySetupConfiguration;
 struct ApplePayShippingContactUpdate;
@@ -73,6 +76,9 @@
     void completeShippingMethodSelection(Optional<ApplePayShippingMethodUpdate>&&);
     void completeShippingContactSelection(Optional<ApplePayShippingContactUpdate>&&);
     void completePaymentMethodSelection(Optional<ApplePayPaymentMethodUpdate>&&);
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<ApplePayPaymentMethodModeUpdate>&&);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void completePaymentSession(Optional<PaymentAuthorizationResult>&&);
     void abortPaymentSession();
     void cancelPaymentSession();
@@ -82,6 +88,9 @@
     WEBCORE_EXPORT void didSelectPaymentMethod(const PaymentMethod&);
     WEBCORE_EXPORT void didSelectShippingMethod(const ApplePayShippingMethod&);
     WEBCORE_EXPORT void didSelectShippingContact(const PaymentContact&);
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    WEBCORE_EXPORT void didChangePaymentMethodMode(String&& paymentMethodMode);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     WEBCORE_EXPORT void didCancelPaymentSession(PaymentSessionError&&);
 
     Optional<String> validatedPaymentNetwork(Document&, unsigned version, const String&) const;

Modified: trunk/Source/WebCore/Modules/applepay/PaymentCoordinatorClient.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/PaymentCoordinatorClient.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/PaymentCoordinatorClient.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -38,6 +38,9 @@
 
 class Document;
 class PaymentMerchantSession;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+struct ApplePayPaymentMethodModeUpdate;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
 struct ApplePayPaymentMethodUpdate;
 struct ApplePaySetupConfiguration;
 struct ApplePayShippingContactUpdate;
@@ -58,6 +61,9 @@
     virtual void completeShippingMethodSelection(Optional<ApplePayShippingMethodUpdate>&&) = 0;
     virtual void completeShippingContactSelection(Optional<ApplePayShippingContactUpdate>&&) = 0;
     virtual void completePaymentMethodSelection(Optional<ApplePayPaymentMethodUpdate>&&) = 0;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    virtual void completePaymentMethodModeChange(Optional<ApplePayPaymentMethodModeUpdate>&&) = 0;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     virtual void completePaymentSession(Optional<PaymentAuthorizationResult>&&) = 0;
     virtual void abortPaymentSession() = 0;
     virtual void cancelPaymentSession() = 0;

Modified: trunk/Source/WebCore/Modules/applepay/PaymentHeaders.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/PaymentHeaders.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/PaymentHeaders.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "ApplePayPaymentMethodModeUpdate.h"
 #include "ApplePayPaymentMethodUpdate.h"
 #include "ApplePaySessionPaymentRequest.h"
 #include "ApplePayShippingContactUpdate.h"

Modified: trunk/Source/WebCore/Modules/applepay/PaymentSession.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/PaymentSession.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/PaymentSession.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -51,6 +51,9 @@
     virtual void didSelectShippingMethod(const ApplePayShippingMethod&) = 0;
     virtual void didSelectShippingContact(const PaymentContact&) = 0;
     virtual void didSelectPaymentMethod(const PaymentMethod&) = 0;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    virtual void didChangePaymentMethodMode(String&& paymentMethodMode) = 0;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     virtual void didCancelPaymentSession(PaymentSessionError&&) = 0;
 };
 

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


--- trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -38,6 +38,7 @@
 #include "ApplePayMerchantCapability.h"
 #include "ApplePayModifier.h"
 #include "ApplePayPayment.h"
+#include "ApplePayPaymentMethodModeUpdate.h"
 #include "ApplePayPaymentMethodUpdate.h"
 #include "ApplePaySessionPaymentRequest.h"
 #include "ApplePayShippingContactUpdate.h"
@@ -452,6 +453,20 @@
     return errors;
 }
 
+Vector<RefPtr<ApplePayError>> ApplePayPaymentHandler::computeErrors(JSC::JSObject* paymentMethodErrors) const
+{
+    Vector<RefPtr<ApplePayError>> errors;
+
+    auto scope = DECLARE_CATCH_SCOPE(scriptExecutionContext()->vm());
+    auto exception = computePaymentMethodErrors(paymentMethodErrors, errors);
+    if (exception.hasException()) {
+        ASSERT(scope.exception());
+        scope.clearException();
+    }
+
+    return errors;
+}
+
 void ApplePayPaymentHandler::computeAddressErrors(String&& error, AddressErrors&& addressErrors, Vector<RefPtr<ApplePayError>>& errors) const
 {
     if (!m_paymentRequest->paymentOptions().requestShipping)
@@ -512,7 +527,7 @@
     case Reason::ShippingOptionChanged:
         return shippingOptionUpdated();
     case Reason::PaymentMethodChanged:
-        return paymentMethodUpdated();
+        return paymentMethodUpdated(computeErrors(paymentMethodErrors));
     }
 
     ASSERT_NOT_REACHED();
@@ -542,8 +557,8 @@
 
 ExceptionOr<void> ApplePayPaymentHandler::shippingAddressUpdated(Vector<RefPtr<ApplePayError>>&& errors)
 {
-    ASSERT(m_isUpdating);
-    m_isUpdating = false;
+    ASSERT(m_updateState == UpdateState::ShippingAddress);
+    m_updateState = UpdateState::None;
 
     ApplePayShippingContactUpdate update;
     update.errors = WTFMove(errors);
@@ -569,8 +584,8 @@
 
 ExceptionOr<void> ApplePayPaymentHandler::shippingOptionUpdated()
 {
-    ASSERT(m_isUpdating);
-    m_isUpdating = false;
+    ASSERT(m_updateState == UpdateState::ShippingOption);
+    m_updateState = UpdateState::None;
 
     ApplePayShippingMethodUpdate update;
 
@@ -588,11 +603,40 @@
     return { };
 }
 
-ExceptionOr<void> ApplePayPaymentHandler::paymentMethodUpdated()
+ExceptionOr<void> ApplePayPaymentHandler::paymentMethodUpdated(Vector<RefPtr<ApplePayError>>&& errors)
 {
-    ASSERT(m_isUpdating);
-    m_isUpdating = false;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    if (m_updateState == UpdateState::PaymentMethodMode) {
+        m_updateState = UpdateState::None;
 
+        ApplePayPaymentMethodModeUpdate update;
+        update.errors = WTFMove(errors);
+
+        auto newShippingMethods = computeShippingMethods();
+        if (newShippingMethods.hasException())
+            return newShippingMethods.releaseException();
+        update.newShippingMethods = newShippingMethods.releaseReturnValue();
+
+        auto newTotalAndLineItems = computeTotalAndLineItems();
+        if (newTotalAndLineItems.hasException())
+            return newTotalAndLineItems.releaseException();
+        std::tie(update.newTotal, update.newLineItems) = newTotalAndLineItems.releaseReturnValue();
+
+        auto applePayDetailsUpdateData = convertAndValidate(*scriptExecutionContext(), m_paymentRequest->paymentDetails());
+        if (applePayDetailsUpdateData.hasException())
+            return applePayDetailsUpdateData.releaseException();
+        merge(update, applePayDetailsUpdateData.releaseReturnValue());
+
+        paymentCoordinator().completePaymentMethodModeChange(WTFMove(update));
+        return { };
+    }
+#else
+    UNUSED_PARAM(errors);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+    ASSERT(m_updateState == UpdateState::PaymentMethod);
+    m_updateState = UpdateState::None;
+
     ApplePayPaymentMethodUpdate update;
 
     auto newTotalAndLineItems = computeTotalAndLineItems();
@@ -678,7 +722,7 @@
 
 void ApplePayPaymentHandler::didAuthorizePayment(const Payment& payment)
 {
-    ASSERT(!m_isUpdating);
+    ASSERT(m_updateState == UpdateState::None);
 
     auto applePayPayment = payment.toApplePayPayment(version());
     auto shippingContact = applePayPayment.shippingContact.valueOr(ApplePayPaymentContact());
@@ -691,8 +735,8 @@
 
 void ApplePayPaymentHandler::didSelectShippingMethod(const ApplePayShippingMethod& shippingMethod)
 {
-    ASSERT(!m_isUpdating);
-    m_isUpdating = true;
+    ASSERT(m_updateState == UpdateState::None);
+    m_updateState = UpdateState::ShippingOption;
 
     m_paymentRequest->shippingOptionChanged(shippingMethod.identifier);
 }
@@ -699,8 +743,8 @@
 
 void ApplePayPaymentHandler::didSelectShippingContact(const PaymentContact& shippingContact)
 {
-    ASSERT(!m_isUpdating);
-    m_isUpdating = true;
+    ASSERT(m_updateState == UpdateState::None);
+    m_updateState = UpdateState::ShippingAddress;
 
     m_paymentRequest->shippingAddressChanged(convert(shippingContact.toApplePayPaymentContact(version())));
 }
@@ -707,8 +751,8 @@
 
 void ApplePayPaymentHandler::didSelectPaymentMethod(const PaymentMethod& paymentMethod)
 {
-    ASSERT(!m_isUpdating);
-    m_isUpdating = true;
+    ASSERT(m_updateState == UpdateState::None);
+    m_updateState = UpdateState::PaymentMethod;
 
     auto applePayPaymentMethod = paymentMethod.toApplePayPaymentMethod();
     m_selectedPaymentMethodType = applePayPaymentMethod.type;
@@ -717,6 +761,28 @@
     });
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void ApplePayPaymentHandler::didChangePaymentMethodMode(String&& paymentMethodMode)
+{
+    ASSERT(m_updateState == UpdateState::None);
+    m_updateState = UpdateState::PaymentMethodMode;
+
+    m_paymentRequest->paymentMethodChanged(WTF::get<URL>(m_identifier).string(), [paymentMethodMode = WTFMove(paymentMethodMode)] (JSC::JSGlobalObject& lexicalGlobalObject) -> JSC::Strong<JSC::JSObject> {
+        auto& vm = lexicalGlobalObject.vm();
+
+        JSC::JSLockHolder lock(vm);
+
+        auto* object = JSC::constructEmptyObject(&lexicalGlobalObject);
+#if defined(ApplePayPaymentHandlerAdditions_didChangePaymentMethodMode)
+        ApplePayPaymentHandlerAdditions_didChangePaymentMethodMode
+#endif
+        return { vm, object };
+    });
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void ApplePayPaymentHandler::didCancelPaymentSession(PaymentSessionError&&)
 {
     m_paymentRequest->cancel();

Modified: trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.h (273158 => 273159)


--- trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -57,6 +57,7 @@
     ExceptionOr<Vector<ApplePayShippingMethod>> computeShippingMethods();
     ExceptionOr<std::tuple<ApplePayLineItem, Vector<ApplePayLineItem>>> computeTotalAndLineItems() const;
     Vector<RefPtr<ApplePayError>> computeErrors(String&& error, AddressErrors&&, PayerErrorFields&&, JSC::JSObject* paymentMethodErrors) const;
+    Vector<RefPtr<ApplePayError>> computeErrors(JSC::JSObject* paymentMethodErrors) const;
     void computeAddressErrors(String&& error, AddressErrors&&, Vector<RefPtr<ApplePayError>>&) const;
     void computePayerErrors(PayerErrorFields&&, Vector<RefPtr<ApplePayError>>&) const;
     ExceptionOr<void> computePaymentMethodErrors(JSC::JSObject* paymentMethodErrors, Vector<RefPtr<ApplePayError>>&) const;
@@ -63,7 +64,7 @@
 
     ExceptionOr<void> shippingAddressUpdated(Vector<RefPtr<ApplePayError>>&& errors);
     ExceptionOr<void> shippingOptionUpdated();
-    ExceptionOr<void> paymentMethodUpdated();
+    ExceptionOr<void> paymentMethodUpdated(Vector<RefPtr<ApplePayError>>&& errors);
 
     // PaymentHandler
     ExceptionOr<void> convertData(JSC::JSValue) final;
@@ -82,6 +83,9 @@
     void didSelectShippingMethod(const ApplePayShippingMethod&) final;
     void didSelectShippingContact(const PaymentContact&) final;
     void didSelectPaymentMethod(const PaymentMethod&) final;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void didChangePaymentMethodMode(String&& paymentMethodMode) final;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void didCancelPaymentSession(PaymentSessionError&&) final;
 
     PaymentRequest::MethodIdentifier m_identifier;
@@ -88,7 +92,16 @@
     Ref<PaymentRequest> m_paymentRequest;
     Optional<ApplePayRequest> m_applePayRequest;
     Optional<ApplePayPaymentMethodType> m_selectedPaymentMethodType;
-    bool m_isUpdating { false };
+
+    enum class UpdateState : uint8_t {
+        None,
+        ShippingAddress,
+        ShippingOption,
+        PaymentMethod,
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+        PaymentMethodMode,
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    } m_updateState { UpdateState::None };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/PlatformMac.cmake (273158 => 273159)


--- trunk/Source/WebCore/PlatformMac.cmake	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/PlatformMac.cmake	2021-02-19 20:47:53 UTC (rev 273159)
@@ -632,6 +632,7 @@
     Modules/applepay/ApplePayPaymentAuthorizedEvent.idl
     Modules/applepay/ApplePayPaymentContact.idl
     Modules/applepay/ApplePayPaymentMethod.idl
+    Modules/applepay/ApplePayPaymentMethodModeUpdate.idl
     Modules/applepay/ApplePayPaymentMethodSelectedEvent.idl
     Modules/applepay/ApplePayPaymentMethodType.idl
     Modules/applepay/ApplePayPaymentMethodUpdate.idl

Modified: trunk/Source/WebCore/SourcesCocoa.txt (273158 => 273159)


--- trunk/Source/WebCore/SourcesCocoa.txt	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/SourcesCocoa.txt	2021-02-19 20:47:53 UTC (rev 273159)
@@ -41,6 +41,7 @@
 JSApplePayPaymentAuthorizedEvent.cpp
 JSApplePayPaymentContact.cpp
 JSApplePayPaymentMethod.cpp
+JSApplePayPaymentMethodModeUpdate.cpp
 JSApplePayPaymentMethodSelectedEvent.cpp
 JSApplePayPaymentMethodType.cpp
 JSApplePayPaymentMethodUpdate.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (273158 => 273159)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-02-19 20:47:53 UTC (rev 273159)
@@ -2945,6 +2945,8 @@
 		953BCEB225D6283D00A4A2A1 /* JSApplePayDetailsUpdateBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 953BCEAF25D6283C00A4A2A1 /* JSApplePayDetailsUpdateBase.h */; };
 		956FC4BB25D49C7B00F7B3A2 /* ApplePayLineItemData.h in Headers */ = {isa = PBXBuildFile; fileRef = 956FC4B825D49C7A00F7B3A2 /* ApplePayLineItemData.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		956FC4BB25D49C7B00F7B3A3 /* JSApplePayLineItemData.h in Headers */ = {isa = PBXBuildFile; fileRef = 956FC4BA25D49C7D00F7B3A2 /* JSApplePayLineItemData.h */; };
+		9596B93325DEEEA000ED2CFA /* ApplePayPaymentMethodModeUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9596B93025DEEE9F00ED2CFA /* ApplePayPaymentMethodModeUpdate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		9596B93825DEEF0300ED2CFA /* JSApplePayPaymentMethodModeUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9596B93625DEEF0200ED2CFA /* JSApplePayPaymentMethodModeUpdate.h */; };
 		95A1E2E925CC75A900268C8E /* MediaControlsContextMenuItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 95A1E2E725CC75A800268C8E /* MediaControlsContextMenuItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		95DF9D25252BEDB2000D7F46 /* PointerCharacteristics.h in Headers */ = {isa = PBXBuildFile; fileRef = 95DF9D23252BED99000D7F46 /* PointerCharacteristics.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		9705997A107D975200A50A7C /* PolicyChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 97059976107D975200A50A7C /* PolicyChecker.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -11791,6 +11793,10 @@
 		956FC4B825D49C7C00F7B3A2 /* JSApplePayLineItemData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSApplePayLineItemData.cpp; sourceTree = "<group>"; };
 		956FC4BA25D49C7B00F7B3A2 /* ApplePayLineItemData.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ApplePayLineItemData.idl; sourceTree = "<group>"; };
 		956FC4BA25D49C7D00F7B3A2 /* JSApplePayLineItemData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSApplePayLineItemData.h; sourceTree = "<group>"; };
+		9596B93025DEEE9F00ED2CFA /* ApplePayPaymentMethodModeUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplePayPaymentMethodModeUpdate.h; sourceTree = "<group>"; };
+		9596B93225DEEE9F00ED2CFA /* ApplePayPaymentMethodModeUpdate.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ApplePayPaymentMethodModeUpdate.idl; sourceTree = "<group>"; };
+		9596B93525DEEF0000ED2CFA /* JSApplePayPaymentMethodModeUpdate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSApplePayPaymentMethodModeUpdate.cpp; sourceTree = "<group>"; };
+		9596B93625DEEF0200ED2CFA /* JSApplePayPaymentMethodModeUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSApplePayPaymentMethodModeUpdate.h; sourceTree = "<group>"; };
 		95A1E2E725CC75A800268C8E /* MediaControlsContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaControlsContextMenuItem.h; sourceTree = "<group>"; };
 		95DF9D23252BED99000D7F46 /* PointerCharacteristics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PointerCharacteristics.h; sourceTree = "<group>"; };
 		97059975107D975200A50A7C /* PolicyChecker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolicyChecker.cpp; sourceTree = "<group>"; };
@@ -18382,6 +18388,8 @@
 				7C6522F91E00C90900677F22 /* ApplePayPaymentContact.idl */,
 				7C6522EC1E00A4C700677F22 /* ApplePayPaymentMethod.h */,
 				7C6522ED1E00A4C700677F22 /* ApplePayPaymentMethod.idl */,
+				9596B93025DEEE9F00ED2CFA /* ApplePayPaymentMethodModeUpdate.h */,
+				9596B93225DEEE9F00ED2CFA /* ApplePayPaymentMethodModeUpdate.idl */,
 				1A8A64401D19FCFB00D0E00F /* ApplePayPaymentMethodSelectedEvent.cpp */,
 				1A8A64421D19FCFB00D0E00F /* ApplePayPaymentMethodSelectedEvent.h */,
 				1A8A64431D19FCFB00D0E00F /* ApplePayPaymentMethodSelectedEvent.idl */,
@@ -18596,6 +18604,8 @@
 				7C65230C1E00DBB400677F22 /* JSApplePayPaymentContact.h */,
 				7C65230D1E00DBB400677F22 /* JSApplePayPaymentMethod.cpp */,
 				7C65230E1E00DBB400677F22 /* JSApplePayPaymentMethod.h */,
+				9596B93525DEEF0000ED2CFA /* JSApplePayPaymentMethodModeUpdate.cpp */,
+				9596B93625DEEF0200ED2CFA /* JSApplePayPaymentMethodModeUpdate.h */,
 				1AE96A7C1D1A0A8000B86768 /* JSApplePayPaymentMethodSelectedEvent.cpp */,
 				1AE96A7D1D1A0A8000B86768 /* JSApplePayPaymentMethodSelectedEvent.h */,
 				A1F6D00D1FE099640018078C /* JSApplePayPaymentMethodType.cpp */,
@@ -31216,6 +31226,7 @@
 				7C6522FB1E00C90900677F22 /* ApplePayPaymentContact.h in Headers */,
 				A1DF5AA21F7EE1130058A477 /* ApplePayPaymentHandler.h in Headers */,
 				7C6522EF1E00A4C700677F22 /* ApplePayPaymentMethod.h in Headers */,
+				9596B93325DEEEA000ED2CFA /* ApplePayPaymentMethodModeUpdate.h in Headers */,
 				1A8A64561D19FCFC00D0E00F /* ApplePayPaymentMethodSelectedEvent.h in Headers */,
 				A1F6D0061FE096F60018078C /* ApplePayPaymentMethodType.h in Headers */,
 				A12C59F12035FCBF0012236B /* ApplePayPaymentMethodUpdate.h in Headers */,
@@ -32784,6 +32795,7 @@
 				1AE96A8B1D1A0DDD00B86768 /* JSApplePayPaymentAuthorizedEvent.h in Headers */,
 				7C6523161E00DBB500677F22 /* JSApplePayPaymentContact.h in Headers */,
 				7C6523181E00DBB500677F22 /* JSApplePayPaymentMethod.h in Headers */,
+				9596B93825DEEF0300ED2CFA /* JSApplePayPaymentMethodModeUpdate.h in Headers */,
 				1AE96A8D1D1A0DDD00B86768 /* JSApplePayPaymentMethodSelectedEvent.h in Headers */,
 				A1F6D00F1FE099940018078C /* JSApplePayPaymentMethodType.h in Headers */,
 				A12C59FC20360B270012236B /* JSApplePayPaymentMethodUpdate.h in Headers */,

Modified: trunk/Source/WebCore/dom/EventNames.h (273158 => 273159)


--- trunk/Source/WebCore/dom/EventNames.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/dom/EventNames.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -32,6 +32,10 @@
 #include "RuntimeEnabledFeatures.h"
 #endif
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/EventNamesAdditions.h>
+#endif
+
 namespace WebCore {
 
 #if !defined(ADDITIONAL_DOM_EVENT_NAMES_FOR_EACH)

Modified: trunk/Source/WebCore/loader/EmptyClients.cpp (273158 => 273159)


--- trunk/Source/WebCore/loader/EmptyClients.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/loader/EmptyClients.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -367,6 +367,9 @@
     void completeShippingMethodSelection(Optional<ApplePayShippingMethodUpdate>&&) final { }
     void completeShippingContactSelection(Optional<ApplePayShippingContactUpdate>&&) final { }
     void completePaymentMethodSelection(Optional<ApplePayPaymentMethodUpdate>&&) final { }
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<ApplePayPaymentMethodModeUpdate>&&) final { }
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void completePaymentSession(Optional<PaymentAuthorizationResult>&&) final { }
     void cancelPaymentSession() final { }
     void abortPaymentSession() final { }

Modified: trunk/Source/WebCore/testing/MockPaymentCoordinator.cpp (273158 => 273159)


--- trunk/Source/WebCore/testing/MockPaymentCoordinator.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/testing/MockPaymentCoordinator.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -28,6 +28,7 @@
 
 #if ENABLE(APPLE_PAY)
 
+#include "ApplePayPaymentMethodModeUpdate.h"
 #include "ApplePayPaymentMethodUpdate.h"
 #include "ApplePaySessionPaymentRequest.h"
 #include "ApplePayShippingContactUpdate.h"
@@ -163,6 +164,21 @@
     m_lineItems = WTFMove(paymentMethodUpdate->newLineItems);
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void MockPaymentCoordinator::completePaymentMethodModeChange(Optional<ApplePayPaymentMethodModeUpdate>&& paymentMethodModeUpdate)
+{
+    if (!paymentMethodModeUpdate)
+        return;
+
+    m_total = WTFMove(paymentMethodModeUpdate->newTotal);
+    m_lineItems = WTFMove(paymentMethodModeUpdate->newLineItems);
+    m_errors = convert(WTFMove(paymentMethodModeUpdate->errors));
+    m_shippingMethods = WTFMove(paymentMethodModeUpdate->newShippingMethods);
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void MockPaymentCoordinator::changeShippingOption(String&& shippingOption)
 {
     dispatchIfShowing([page = &m_page, shippingOption = WTFMove(shippingOption)]() mutable {

Modified: trunk/Source/WebCore/testing/MockPaymentCoordinator.h (273158 => 273159)


--- trunk/Source/WebCore/testing/MockPaymentCoordinator.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebCore/testing/MockPaymentCoordinator.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -85,6 +85,9 @@
     void completeShippingMethodSelection(Optional<ApplePayShippingMethodUpdate>&&) final;
     void completeShippingContactSelection(Optional<ApplePayShippingContactUpdate>&&) final;
     void completePaymentMethodSelection(Optional<ApplePayPaymentMethodUpdate>&&) final;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<ApplePayPaymentMethodModeUpdate>&&) final;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void completePaymentSession(Optional<PaymentAuthorizationResult>&&) final;
     void abortPaymentSession() final;
     void cancelPaymentSession() final;

Modified: trunk/Source/WebKit/ChangeLog (273158 => 273159)


--- trunk/Source/WebKit/ChangeLog	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/ChangeLog	2021-02-19 20:47:53 UTC (rev 273159)
@@ -1,3 +1,43 @@
+2021-02-19  Devin Rousso  <drou...@apple.com>
+
+        [Payment Request] add support for Apple Pay payment method mode
+        https://bugs.webkit.org/show_bug.cgi?id=222128
+        <rdar://problem/72320278>
+
+        Reviewed by Wenson Hsieh.
+
+        Handle the delegate call from `PaymentAuthorization(View)Controller` by passing it along to
+        the WebProcess to be handled by WebCore. Handle the response sent by the WebProcess by
+        invoking the callback that was provided by the delegate call (which is saved to an ivar).
+
+        * WebProcess/ApplePay/WebPaymentCoordinator.messages.in:
+        * WebProcess/ApplePay/WebPaymentCoordinator.h:
+        * WebProcess/ApplePay/WebPaymentCoordinator.cpp:
+        (WebKit::WebPaymentCoordinator::completePaymentMethodModeChange): Added.
+        (WebKit::WebPaymentCoordinator::didChangePaymentMethodMode): Added.
+
+        * Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in:
+        * Shared/ApplePay/WebPaymentCoordinatorProxy.h:
+        * Shared/ApplePay/WebPaymentCoordinatorProxy.cpp:
+        (WebKit::WebPaymentCoordinatorProxy::completePaymentMethodModeChange): Added.
+        (WebKit::WebPaymentCoordinatorProxy::presenterDidChangePaymentMethodMode): Added.
+        (WebKit::WebPaymentCoordinatorProxy::canBegin const):
+        (WebKit::WebPaymentCoordinatorProxy::canCancel const):
+        (WebKit::WebPaymentCoordinatorProxy::canCompletePayment const):
+        (WebKit::WebPaymentCoordinatorProxy::canAbort const):
+
+        * Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm:
+        (WebKit::WebPaymentCoordinatorProxy::platformCompletePaymentMethodModeChange): Added.
+        * Platform/cocoa/PaymentAuthorizationPresenter.h:
+        * Platform/cocoa/PaymentAuthorizationPresenter.mm:
+        (WebKit::toPKPaymentErrorCode):
+        (WebKit::PaymentAuthorizationPresenter::completePaymentMethodModeChange): Added.
+
+        * Platform/cocoa/PaymentAuthorizationViewController.mm:
+        * Platform/cocoa/WKPaymentAuthorizationDelegate.h:
+        * Platform/cocoa/WKPaymentAuthorizationDelegate.mm:
+        * Platform/ios/PaymentAuthorizationController.mm:
+
 2021-02-19  Per Arne Vollan  <pvol...@apple.com>
 
         [macOS] Add IOKit filtering also when the GPU process is enabled

Modified: trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.h (273158 => 273159)


--- trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -42,6 +42,9 @@
 class PaymentMerchantSession;
 class PaymentMethod;
 class PaymentSessionError;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+struct ApplePayPaymentMethodModeUpdate;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
 struct ApplePayPaymentMethodUpdate;
 struct ApplePayShippingContactUpdate;
 struct ApplePayShippingMethod;
@@ -62,6 +65,9 @@
         virtual void presenterDidSelectPaymentMethod(PaymentAuthorizationPresenter&, const WebCore::PaymentMethod&) = 0;
         virtual void presenterDidSelectShippingContact(PaymentAuthorizationPresenter&, const WebCore::PaymentContact&) = 0;
         virtual void presenterDidSelectShippingMethod(PaymentAuthorizationPresenter&, const WebCore::ApplePayShippingMethod&) = 0;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+        virtual void presenterDidChangePaymentMethodMode(PaymentAuthorizationPresenter&, const String& paymentMethodMode) = 0;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
         virtual void presenterWillValidateMerchant(PaymentAuthorizationPresenter&, const URL&) = 0;
     };
 
@@ -74,6 +80,9 @@
     void completePaymentSession(const Optional<WebCore::PaymentAuthorizationResult>&);
     void completeShippingContactSelection(Optional<WebCore::ApplePayShippingContactUpdate>&&);
     void completeShippingMethodSelection(Optional<WebCore::ApplePayShippingMethodUpdate>&&);
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&&);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
 
     virtual void dismiss() = 0;
 #if PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.mm (273158 => 273159)


--- trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.mm	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.mm	2021-02-19 20:47:53 UTC (rev 273159)
@@ -34,6 +34,7 @@
 #import <WebCore/ApplePayError.h>
 #import <WebCore/ApplePayErrorCode.h>
 #import <WebCore/ApplePayErrorContactField.h>
+#import <WebCore/ApplePayPaymentMethodModeUpdate.h>
 #import <WebCore/ApplePayPaymentMethodUpdate.h>
 #import <WebCore/ApplePayShippingContactUpdate.h>
 #import <WebCore/ApplePayShippingMethodUpdate.h>
@@ -92,6 +93,9 @@
         return PKPaymentBillingContactInvalidError;
     case WebCore::ApplePayErrorCode::AddressUnserviceable:
         return PKPaymentShippingAddressUnserviceableError;
+#if defined(PaymentAuthorizationPresenterAdditions_toPKPaymentErrorCode)
+    PaymentAuthorizationPresenterAdditions_toPKPaymentErrorCode
+#endif
     }
 }
 
@@ -255,6 +259,24 @@
     [platformDelegate() completeShippingMethodSelection:shippingMethodUpdate.get()];
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void PaymentAuthorizationPresenter::completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&& update)
+{
+    ASSERT(platformDelegate());
+    if (!update) {
+        [platformDelegate() completePaymentMethodModeChange:nil];
+        return;
+    }
+
+#if defined(PaymentAuthorizationPresenterAdditions_completePaymentMethodModeChange)
+    PaymentAuthorizationPresenterAdditions_completePaymentMethodModeChange
+#endif
+    [platformDelegate() completePaymentMethodModeChange:paymentMethodModeUpdate.get()];
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 } // namespace WebKit
 
 #endif // USE(PASSKIT) && ENABLE(APPLE_PAY)

Modified: trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationViewController.mm (273158 => 273159)


--- trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationViewController.mm	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationViewController.mm	2021-02-19 20:47:53 UTC (rev 273159)
@@ -31,6 +31,10 @@
 #import "WKPaymentAuthorizationDelegate.h"
 #import <pal/cocoa/PassKitSoftLink.h>
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/PaymentAuthorizationViewControllerAdditions.mm>
+#endif
+
 @interface WKPaymentAuthorizationViewControllerDelegate : WKPaymentAuthorizationDelegate <PKPaymentAuthorizationViewControllerDelegate, PKPaymentAuthorizationViewControllerPrivateDelegate>
 
 - (instancetype)initWithRequest:(PKPaymentRequest *)request presenter:(WebKit::PaymentAuthorizationPresenter&)presenter;
@@ -79,6 +83,10 @@
     [self _didSelectPaymentMethod:paymentMethod completion:completion];
 }
 
+#if defined(PaymentAuthorizationViewControllerAdditions_PKPaymentAuthorizationViewControllerDelegate)
+PaymentAuthorizationViewControllerAdditions_PKPaymentAuthorizationViewControllerDelegate
+#endif
+
 #pragma mark PKPaymentAuthorizationViewControllerDelegatePrivate
 
 - (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller willFinishWithError:(NSError *)error

Modified: trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.h (273158 => 273159)


--- trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -33,6 +33,10 @@
 OBJC_CLASS NSError;
 OBJC_CLASS UIViewController;
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/WKPaymentAuthorizationDelegateAdditions.h>
+#endif
+
 namespace WebKit {
 
 class PaymentAuthorizationPresenter;
@@ -57,6 +61,9 @@
 - (void)completePaymentSession:(PKPaymentAuthorizationStatus)status errors:(NSArray<NSError *> *)errors;
 - (void)completeShippingContactSelection:(PKPaymentRequestShippingContactUpdate *)shippingContactUpdate;
 - (void)completeShippingMethodSelection:(PKPaymentRequestShippingMethodUpdate *)shippingMethodUpdate;
+#if defined(WKPaymentAuthorizationDelegateAdditions_interface_public)
+WKPaymentAuthorizationDelegateAdditions_interface_public
+#endif
 - (void)invalidate;
 
 @end
@@ -72,6 +79,9 @@
 - (void)_didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(WebKit::DidSelectPaymentMethodCompletion::BlockType)completion;
 - (void)_didSelectShippingContact:(PKContact *)contact completion:(WebKit::DidSelectShippingContactCompletion::BlockType)completion;
 - (void)_didSelectShippingMethod:(PKShippingMethod *)shippingMethod completion:(WebKit::DidSelectShippingMethodCompletion::BlockType)completion;
+#if defined(WKPaymentAuthorizationDelegateAdditions_interface_protected)
+WKPaymentAuthorizationDelegateAdditions_interface_protected
+#endif
 - (void)_getPaymentServicesMerchantURL:(void(^)(NSURL *, NSError *))completion;
 - (void)_willFinishWithError:(NSError *)error;
 

Modified: trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.mm (273158 => 273159)


--- trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.mm	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.mm	2021-02-19 20:47:53 UTC (rev 273159)
@@ -32,6 +32,10 @@
 #import <WebCore/PaymentMethod.h>
 #import <WebCore/PaymentSessionError.h>
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/WKPaymentAuthorizationDelegateAdditions.mm>
+#endif
+
 @implementation WKPaymentAuthorizationDelegate {
     RetainPtr<NSArray<PKPaymentSummaryItem *>> _summaryItems;
     RetainPtr<NSArray<PKShippingMethod *>> _shippingMethods;
@@ -42,6 +46,9 @@
     WebKit::DidSelectPaymentMethodCompletion _didSelectPaymentMethodCompletion;
     WebKit::DidSelectShippingContactCompletion _didSelectShippingContactCompletion;
     WebKit::DidSelectShippingMethodCompletion _didSelectShippingMethodCompletion;
+#if defined(WKPaymentAuthorizationDelegateAdditions_implementation_members)
+    WKPaymentAuthorizationDelegateAdditions_implementation_members
+#endif
 }
 
 - (NSArray<PKPaymentSummaryItem *> *)summaryItems
@@ -86,6 +93,10 @@
     std::exchange(_didSelectShippingMethodCompletion, nil)(update);
 }
 
+#if defined(WKPaymentAuthorizationDelegateAdditions_implementation_public)
+    WKPaymentAuthorizationDelegateAdditions_implementation_public
+#endif
+
 - (void)invalidate
 {
     if (_didAuthorizePaymentCompletion)
@@ -197,6 +208,10 @@
     presenter->client().presenterDidSelectShippingMethod(*presenter, toShippingMethod(shippingMethod));
 }
 
+#if defined(WKPaymentAuthorizationDelegateAdditions_implementation_protected)
+    WKPaymentAuthorizationDelegateAdditions_implementation_protected
+#endif
+
 - (void) NO_RETURN_DUE_TO_ASSERT _getPaymentServicesMerchantURL:(void(^)(NSURL *, NSError *))completion
 {
     ASSERT_NOT_REACHED();

Modified: trunk/Source/WebKit/Platform/ios/PaymentAuthorizationController.mm (273158 => 273159)


--- trunk/Source/WebKit/Platform/ios/PaymentAuthorizationController.mm	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Platform/ios/PaymentAuthorizationController.mm	2021-02-19 20:47:53 UTC (rev 273159)
@@ -32,6 +32,10 @@
 #import <pal/cocoa/PassKitSoftLink.h>
 #import <wtf/CompletionHandler.h>
 
+#if USE(APPLE_INTERNAL_SDK)
+#include <WebKitAdditions/PaymentAuthorizationControllerAdditions.mm>
+#endif
+
 @interface WKPaymentAuthorizationControllerDelegate : WKPaymentAuthorizationDelegate <PKPaymentAuthorizationControllerDelegate, PKPaymentAuthorizationControllerPrivateDelegate>
 
 - (instancetype)initWithRequest:(PKPaymentRequest *)request presenter:(WebKit::PaymentAuthorizationPresenter&)presenter;
@@ -84,6 +88,10 @@
     [self _didSelectPaymentMethod:paymentMethod completion:completion];
 }
 
+#if defined(PaymentAuthorizationControllerAdditions_PKPaymentAuthorizationControllerDelegate)
+PaymentAuthorizationControllerAdditions_PKPaymentAuthorizationControllerDelegate
+#endif
+
 #pragma mark PKPaymentAuthorizationControllerPrivateDelegate
 
 - (void)paymentAuthorizationController:(PKPaymentAuthorizationController *)controller willFinishWithError:(NSError *)error

Modified: trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.cpp (273158 => 273159)


--- trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -33,6 +33,7 @@
 #include "WebPaymentCoordinatorMessages.h"
 #include "WebPaymentCoordinatorProxyMessages.h"
 #include "WebProcessProxy.h"
+#include <WebCore/ApplePayPaymentMethodModeUpdate.h>
 #include <WebCore/ApplePayPaymentMethodUpdate.h>
 #include <WebCore/ApplePayShippingContactUpdate.h>
 #include <WebCore/ApplePayShippingMethodUpdate.h>
@@ -167,6 +168,22 @@
     m_state = State::Active;
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void WebPaymentCoordinatorProxy::completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&& update)
+{
+    // It's possible that the payment has been canceled already.
+    if (m_state == State::Idle)
+        return;
+
+    MESSAGE_CHECK(m_state == State::PaymentMethodModeChanged);
+
+    platformCompletePaymentMethodModeChange(WTFMove(update));
+    m_state = State::Active;
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void WebPaymentCoordinatorProxy::completePaymentSession(const Optional<WebCore::PaymentAuthorizationResult>& result)
 {
     // It's possible that the payment has been canceled already.
@@ -229,6 +246,18 @@
     send(Messages::WebPaymentCoordinator::DidSelectShippingMethod(shippingMethod));
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void WebPaymentCoordinatorProxy::presenterDidChangePaymentMethodMode(PaymentAuthorizationPresenter&, const String& paymentMethodMode)
+{
+    ASSERT(m_state == State::Active);
+
+    m_state = State::PaymentMethodModeChanged;
+    send(Messages::WebPaymentCoordinator::DidChangePaymentMethodMode(paymentMethodMode));
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void WebPaymentCoordinatorProxy::presenterDidSelectShippingContact(PaymentAuthorizationPresenter&, const WebCore::PaymentContact& shippingContact)
 {
     ASSERT(m_state == State::Active);
@@ -258,6 +287,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
         return false;
     }
 }
@@ -271,6 +303,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
         return true;
 
     case State::Completing:
@@ -292,6 +327,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
         return false;
     }
 }
@@ -305,6 +343,9 @@
     case State::ShippingMethodSelected:
     case State::ShippingContactSelected:
     case State::PaymentMethodSelected:
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    case State::PaymentMethodModeChanged:
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
         return true;
 
     case State::Completing:

Modified: trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.h (273158 => 273159)


--- trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -51,6 +51,9 @@
 class PaymentContact;
 class PaymentMerchantSession;
 class PaymentMethod;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+struct ApplePayPaymentMethodModeUpdate;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
 struct ApplePayPaymentMethodUpdate;
 struct ApplePayShippingContactUpdate;
 struct ApplePayShippingMethod;
@@ -118,6 +121,9 @@
     void presenterDidSelectPaymentMethod(PaymentAuthorizationPresenter&, const WebCore::PaymentMethod&) final;
     void presenterDidSelectShippingContact(PaymentAuthorizationPresenter&, const WebCore::PaymentContact&) final;
     void presenterDidSelectShippingMethod(PaymentAuthorizationPresenter&, const WebCore::ApplePayShippingMethod&) final;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void presenterDidChangePaymentMethodMode(PaymentAuthorizationPresenter&, const String& paymentMethodMode) final;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void presenterWillValidateMerchant(PaymentAuthorizationPresenter&, const URL&) final;
 
     // Message handlers
@@ -129,6 +135,9 @@
     void completeShippingMethodSelection(Optional<WebCore::ApplePayShippingMethodUpdate>&&);
     void completeShippingContactSelection(Optional<WebCore::ApplePayShippingContactUpdate>&&);
     void completePaymentMethodSelection(Optional<WebCore::ApplePayPaymentMethodUpdate>&&);
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&&);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void completePaymentSession(const Optional<WebCore::PaymentAuthorizationResult>&);
     void abortPaymentSession();
     void cancelPaymentSession();
@@ -154,6 +163,9 @@
     void platformCompleteShippingMethodSelection(Optional<WebCore::ApplePayShippingMethodUpdate>&&);
     void platformCompleteShippingContactSelection(Optional<WebCore::ApplePayShippingContactUpdate>&&);
     void platformCompletePaymentMethodSelection(Optional<WebCore::ApplePayPaymentMethodUpdate>&&);
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void platformCompletePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&&);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void platformCompletePaymentSession(const Optional<WebCore::PaymentAuthorizationResult>&);
     void platformHidePaymentUI();
 #if PLATFORM(COCOA)
@@ -185,6 +197,11 @@
         // PaymentMethodSelected - Dispatching the paymentmethodselected event and waiting for a reply.
         PaymentMethodSelected,
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+        // PaymentMethodSelected - Dispatching the paymentmethodmodechanged event and waiting for a reply.
+        PaymentMethodModeChanged,
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
         // Completing - Completing the payment and waiting for presenterDidFinish to be called.
         Completing,
     } m_state { State::Idle };

Modified: trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in (273158 => 273159)


--- trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in	2021-02-19 20:47:53 UTC (rev 273159)
@@ -35,6 +35,9 @@
     CompleteShippingMethodSelection(Optional<WebCore::ApplePayShippingMethodUpdate> update)
     CompleteShippingContactSelection(Optional<WebCore::ApplePayShippingContactUpdate> update)
     CompletePaymentMethodSelection(Optional<WebCore::ApplePayPaymentMethodUpdate> update)
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    CompletePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate> update)
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     CompletePaymentSession(Optional<WebCore::PaymentAuthorizationResult> result)
     AbortPaymentSession()
     CancelPaymentSession()

Modified: trunk/Source/WebKit/Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm (273158 => 273159)


--- trunk/Source/WebKit/Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm	2021-02-19 20:47:53 UTC (rev 273159)
@@ -36,6 +36,7 @@
 #import "WebPaymentCoordinatorProxy.h"
 #import "WebPaymentCoordinatorProxyMessages.h"
 #import "WebProcessProxy.h"
+#import <WebCore/ApplePayPaymentMethodModeUpdate.h>
 #import <WebCore/ApplePayPaymentMethodUpdate.h>
 #import <WebCore/ApplePayShippingContactUpdate.h>
 #import <WebCore/ApplePayShippingMethod.h>
@@ -293,6 +294,15 @@
     m_authorizationPresenter->completePaymentMethodSelection(WTFMove(update));
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void WebPaymentCoordinatorProxy::platformCompletePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&& update)
+{
+    m_authorizationPresenter->completePaymentMethodModeChange(WTFMove(update));
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void WebPaymentCoordinatorProxy::getSetupFeatures(const PaymentSetupConfiguration& configuration, Messages::WebPaymentCoordinatorProxy::GetSetupFeatures::AsyncReply&& reply)
 {
 #if PLATFORM(MAC)

Modified: trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.cpp (273158 => 273159)


--- trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.cpp	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.cpp	2021-02-19 20:47:53 UTC (rev 273159)
@@ -36,6 +36,7 @@
 #include "WebPaymentCoordinatorMessages.h"
 #include "WebPaymentCoordinatorProxyMessages.h"
 #include "WebProcess.h"
+#include <WebCore/ApplePayPaymentMethodModeUpdate.h>
 #include <WebCore/ApplePayPaymentMethodUpdate.h>
 #include <WebCore/ApplePayShippingContactUpdate.h>
 #include <WebCore/ApplePayShippingMethodUpdate.h>
@@ -127,6 +128,15 @@
     send(Messages::WebPaymentCoordinatorProxy::CompletePaymentMethodSelection(WTFMove(update)));
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void WebPaymentCoordinator::completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&& update)
+{
+    send(Messages::WebPaymentCoordinatorProxy::CompletePaymentMethodModeChange(WTFMove(update)));
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void WebPaymentCoordinator::completePaymentSession(Optional<WebCore::PaymentAuthorizationResult>&& result)
 {
     send(Messages::WebPaymentCoordinatorProxy::CompletePaymentSession(result));
@@ -206,6 +216,15 @@
     paymentCoordinator().didSelectPaymentMethod(paymentMethod);
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void WebPaymentCoordinator::didChangePaymentMethodMode(String&& paymentMethodMode)
+{
+    paymentCoordinator().didChangePaymentMethodMode(WTFMove(paymentMethodMode));
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void WebPaymentCoordinator::didCancelPaymentSession(WebCore::PaymentSessionError&& sessionError)
 {
     paymentCoordinator().didCancelPaymentSession(WTFMove(sessionError));

Modified: trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.h (273158 => 273159)


--- trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -68,6 +68,9 @@
     void completeShippingMethodSelection(Optional<WebCore::ApplePayShippingMethodUpdate>&&) override;
     void completeShippingContactSelection(Optional<WebCore::ApplePayShippingContactUpdate>&&) override;
     void completePaymentMethodSelection(Optional<WebCore::ApplePayPaymentMethodUpdate>&&) override;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&&) override;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void completePaymentSession(Optional<WebCore::PaymentAuthorizationResult>&&) override;
 
     void abortPaymentSession() override;
@@ -99,6 +102,9 @@
     void didSelectShippingMethod(const WebCore::ApplePayShippingMethod&);
     void didSelectShippingContact(const WebCore::PaymentContact&);
     void didSelectPaymentMethod(const WebCore::PaymentMethod&);
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void didChangePaymentMethodMode(String&& paymentMethodMode);
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void didCancelPaymentSession(WebCore::PaymentSessionError&&);
 
     WebCore::PaymentCoordinator& paymentCoordinator();

Modified: trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.messages.in (273158 => 273159)


--- trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.messages.in	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.messages.in	2021-02-19 20:47:53 UTC (rev 273159)
@@ -31,6 +31,9 @@
     DidSelectShippingMethod(struct WebCore::ApplePayShippingMethod shippingMethod)
     DidSelectShippingContact(WebCore::PaymentContact shippingContact)
     DidSelectPaymentMethod(WebCore::PaymentMethod paymentMethod)
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    DidChangePaymentMethodMode(String paymentMethodMode)
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     DidCancelPaymentSession(WebCore::PaymentSessionError sessionError)
 }
 

Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (273158 => 273159)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2021-02-19 20:47:53 UTC (rev 273159)
@@ -1,5 +1,17 @@
 2021-02-19  Devin Rousso  <drou...@apple.com>
 
+        [Payment Request] add support for Apple Pay payment method mode
+        https://bugs.webkit.org/show_bug.cgi?id=222128
+        <rdar://problem/72320278>
+
+        Reviewed by Wenson Hsieh.
+
+        * WebCoreSupport/WebPaymentCoordinatorClient.h:
+        * WebCoreSupport/WebPaymentCoordinatorClient.mm:
+        (WebPaymentCoordinatorClient::completePaymentMethodModeChange):
+
+2021-02-19  Devin Rousso  <drou...@apple.com>
+
         [Payment Request] add an `object data` to `PaymentDetailsBase` so that data specific to Apple Pay can be provided
         https://bugs.webkit.org/show_bug.cgi?id=222002
         <rdar://problem/72319946>

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.h (273158 => 273159)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.h	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.h	2021-02-19 20:47:53 UTC (rev 273159)
@@ -45,6 +45,9 @@
     void completeShippingMethodSelection(Optional<WebCore::ApplePayShippingMethodUpdate>&&) override;
     void completeShippingContactSelection(Optional<WebCore::ApplePayShippingContactUpdate>&&) override;
     void completePaymentMethodSelection(Optional<WebCore::ApplePayPaymentMethodUpdate>&&) override;
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+    void completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&&) override;
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
     void completePaymentSession(Optional<WebCore::PaymentAuthorizationResult>&&) override;
     void abortPaymentSession() override;
     void cancelPaymentSession() override;

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.mm (273158 => 273159)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.mm	2021-02-19 20:39:40 UTC (rev 273158)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.mm	2021-02-19 20:47:53 UTC (rev 273159)
@@ -84,6 +84,14 @@
 {
 }
 
+#if ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
+void WebPaymentCoordinatorClient::completePaymentMethodModeChange(Optional<WebCore::ApplePayPaymentMethodModeUpdate>&&)
+{
+}
+
+#endif // ENABLE(APPLE_PAY_PAYMENT_METHOD_MODE)
+
 void WebPaymentCoordinatorClient::completePaymentSession(Optional<WebCore::PaymentAuthorizationResult>&&)
 {
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to