Changeset 288698 in webkit


Ignore:
Timestamp:
Jan 27, 2022 1:06:58 PM (6 months ago)
Author:
Devin Rousso
Message:

[Payment Request] allow additional payment method specific data to be passed to complete()
https://bugs.webkit.org/show_bug.cgi?id=235415
<rdar://problem/82970451>

Reviewed by Darin Adler.

Source/WebCore:

This allows for developers/merchants to give additional details to Apple Pay on completion.

Issue: <https://github.com/w3c/payment-request/issues/981>
Spec PR: <https://github.com/w3c/payment-request/pull/982>

Test: http/tests/paymentrequest/ApplePayPaymentCompleteDetails.https.html

  • Modules/paymentrequest/PaymentCompleteDetails.h: Added.
  • Modules/paymentrequest/PaymentCompleteDetails.idl: Added.
  • Modules/paymentrequest/PaymentResponse.h:
  • Modules/paymentrequest/PaymentResponse.idl:
  • Modules/paymentrequest/PaymentResponse.cpp:

(WebCore::PaymentResponse::complete):

  • Modules/paymentrequest/PaymentRequest.h:
  • Modules/paymentrequest/PaymentRequest.cpp:

(WebCore::PaymentRequest::complete):

  • Modules/paymentrequest/PaymentHandler.h:

Add new dictionary PaymentCompleteDetails that's allowed as an optional second argument to
PaymentResponse.prototype.complete. If provided, JSON stringify it and pass the serialized
string data along to the relevant PaymentHandler for JSON (re)parsing if the associated
payment method requires it.

  • Modules/applepay/paymentrequest/ApplePayPaymentHandler.h:
  • Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:

(WebCore::convertAndValidate):
(WebCore::merge):
(WebCore::ApplePayPaymentHandler::complete):
(WebCore::ApplePayPaymentHandler::retry):

  • Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.idl: Added.
  • Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.h: Added.

(WebCore::ApplePayPaymentCompleteDetails::encode const):
(WebCore::ApplePayPaymentCompleteDetails::decode):
Convert the JSON (re)parsed object into a ApplePayPaymentCompleteDetails, merging it into
the ApplePayPaymentAuthorizationResult passed to the PaymentCoordinator (see below).

  • Modules/applepay/ApplePayPaymentAuthorizationResult.h:
  • Modules/applepay/ApplePayPaymentAuthorizationResult.cpp: Added.

(WebCore::ApplePayPaymentAuthorizationResult::isFinalState const):
(WebCore::ApplePayPaymentAuthorizationResult::encode const):
(WebCore::ApplePayPaymentAuthorizationResult::decode):

  • Modules/applepay/ApplePaySessionPaymentRequest.h:
  • Modules/applepay/ApplePaySessionPaymentRequest.cpp:

(WebCore::isFinalStateResult): Deleted.

  • Modules/applepay/ApplePaySession.h:
  • Modules/applepay/ApplePaySession.cpp:

(WebCore::convertAndValidate):
(WebCore::ApplePaySession::completePayment):

  • Modules/applepay/PaymentCoordinator.h:
  • Modules/applepay/PaymentCoordinator.cpp:

(WebCore::PaymentCoordinator::completePaymentSession):

  • Modules/applepay/PaymentCoordinatorClient.h:
  • loader/EmptyClients.cpp:
  • testing/MockPaymentCoordinator.h:
  • testing/MockPaymentCoordinator.cpp:

(WebCore::MockPaymentCoordinator::completePaymentSession):
Replace PaymentAuthorizationResult with ApplePayPaymentAuthorizationResult so that data
doesn't need to be moved between identically shaped structs for sending to the UIProcess.

  • Modules/applepay/cocoa/PaymentAPIVersionCocoa.mm:

(WebCore::PaymentAPIVersion::current):
Increment the current version.

  • Modules/applepay-ams-ui/ApplePayAMSUIPaymentHandler.h:
  • Modules/applepay-ams-ui/ApplePayAMSUIPaymentHandler.cpp:

(WebCore::ApplePayAMSUIPaymentHandler::complete):
AMS UI does not allow/require any data to be provided on completion.

  • CMakeLists.txt:
  • DerivedSources-input.xcfilelist:
  • DerivedSources-output.xcfilelist:
  • DerivedSources.make:
  • Headers.cmake:
  • PlatformMac.cmake:
  • Sources.txt:
  • SourcesCocoa.txt:
  • WebCore.xcodeproj/project.pbxproj:

Source/WebKit:

This allows for developers/merchants to give additional details to Apple Pay on completion.

Issue: <https://github.com/w3c/payment-request/issues/981>
Spec PR: <https://github.com/w3c/payment-request/pull/982>

  • WebProcess/ApplePay/WebPaymentCoordinator.h:
  • WebProcess/ApplePay/WebPaymentCoordinator.cpp:

(WebKit::WebPaymentCoordinator::completePaymentSession):

  • Scripts/webkit/messages.py:

(headers_for_type):

  • Shared/WebCoreArgumentCoders.h:
  • Shared/Cocoa/WebCoreArgumentCodersCocoa.mm:

(IPC::ArgumentCoder<WebCore::PaymentAuthorizationResult>::encode): Deleted.
(IPC::ArgumentCoder<WebCore::PaymentAuthorizationResult>::decode): Deleted.

  • Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in:
  • Shared/ApplePay/WebPaymentCoordinatorProxy.h:
  • Shared/ApplePay/WebPaymentCoordinatorProxy.cpp:

(WebKit::WebPaymentCoordinatorProxy::completePaymentSession):

  • Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm:

(WebKit::WebPaymentCoordinatorProxy::platformCompletePaymentSession):

  • Shared/ApplePay/ios/WebPaymentCoordinatorProxyIOS.mm:
  • Platform/cocoa/PaymentAuthorizationPresenter.h:
  • Platform/cocoa/PaymentAuthorizationPresenter.mm:

(WebKit::toPKPaymentAuthorizationStatus):
(WebKit::PaymentAuthorizationPresenter::completePaymentSession):
Replace PaymentAuthorizationResult with ApplePayPaymentAuthorizationResult so that data
doesn't need to be moved between identically shaped structs for sending to the UIProcess.

  • Platform/cocoa/WKPaymentAuthorizationDelegate.h:
  • Platform/cocoa/WKPaymentAuthorizationDelegate.mm:

Add some WKA hooks.

Source/WebKitLegacy/mac:

  • WebCoreSupport/WebPaymentCoordinatorClient.h:
  • WebCoreSupport/WebPaymentCoordinatorClient.mm:

(WebPaymentCoordinatorClient::completePaymentSession):

LayoutTests:

  • http/tests/paymentrequest/ApplePayPaymentCompleteDetails.https.html: Added.
  • http/tests/paymentrequest/ApplePayPaymentCompleteDetails.https-expected.txt: Added.
Location:
trunk
Files:
3 added
51 edited
3 copied
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r288697 r288698  
     12022-01-27  Devin Rousso  <drousso@apple.com>
     2
     3        [Payment Request] allow additional payment method specific data to be passed to `complete()`
     4        https://bugs.webkit.org/show_bug.cgi?id=235415
     5        <rdar://problem/82970451>
     6
     7        Reviewed by Darin Adler.
     8
     9        * http/tests/paymentrequest/ApplePayPaymentCompleteDetails.https.html: Added.
     10        * http/tests/paymentrequest/ApplePayPaymentCompleteDetails.https-expected.txt: Added.
     11
    1122022-01-26  Jon Lee  <jonlee@apple.com>
    213
  • trunk/Source/WebCore/CMakeLists.txt

    r288442 r288698  
    485485    Modules/paymentrequest/PaymentAddress.idl
    486486    Modules/paymentrequest/PaymentComplete.idl
     487    Modules/paymentrequest/PaymentCompleteDetails.idl
    487488    Modules/paymentrequest/PaymentCurrencyAmount.idl
    488489    Modules/paymentrequest/PaymentDetailsBase.idl
  • trunk/Source/WebCore/ChangeLog

    r288696 r288698  
     12022-01-27  Devin Rousso  <drousso@apple.com>
     2
     3        [Payment Request] allow additional payment method specific data to be passed to `complete()`
     4        https://bugs.webkit.org/show_bug.cgi?id=235415
     5        <rdar://problem/82970451>
     6
     7        Reviewed by Darin Adler.
     8
     9        This allows for developers/merchants to give additional details to Apple Pay on completion.
     10
     11        Issue: <https://github.com/w3c/payment-request/issues/981>
     12        Spec PR: <https://github.com/w3c/payment-request/pull/982>
     13
     14        Test: http/tests/paymentrequest/ApplePayPaymentCompleteDetails.https.html
     15
     16        * Modules/paymentrequest/PaymentCompleteDetails.h: Added.
     17        * Modules/paymentrequest/PaymentCompleteDetails.idl: Added.
     18        * Modules/paymentrequest/PaymentResponse.h:
     19        * Modules/paymentrequest/PaymentResponse.idl:
     20        * Modules/paymentrequest/PaymentResponse.cpp:
     21        (WebCore::PaymentResponse::complete):
     22        * Modules/paymentrequest/PaymentRequest.h:
     23        * Modules/paymentrequest/PaymentRequest.cpp:
     24        (WebCore::PaymentRequest::complete):
     25        * Modules/paymentrequest/PaymentHandler.h:
     26        Add new `dictionary PaymentCompleteDetails` that's allowed as an optional second argument to
     27        `PaymentResponse.prototype.complete`. If provided, JSON stringify it and pass the serialized
     28        string data along to the relevant `PaymentHandler` for JSON (re)parsing if the associated
     29        payment method requires it.
     30
     31        * Modules/applepay/paymentrequest/ApplePayPaymentHandler.h:
     32        * Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
     33        (WebCore::convertAndValidate):
     34        (WebCore::merge):
     35        (WebCore::ApplePayPaymentHandler::complete):
     36        (WebCore::ApplePayPaymentHandler::retry):
     37        * Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.idl: Added.
     38        * Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.h: Added.
     39        (WebCore::ApplePayPaymentCompleteDetails::encode const):
     40        (WebCore::ApplePayPaymentCompleteDetails::decode):
     41        Convert the JSON (re)parsed object into a `ApplePayPaymentCompleteDetails`, merging it into
     42        the `ApplePayPaymentAuthorizationResult` passed to the `PaymentCoordinator` (see below).
     43
     44        * Modules/applepay/ApplePayPaymentAuthorizationResult.h:
     45        * Modules/applepay/ApplePayPaymentAuthorizationResult.cpp: Added.
     46        (WebCore::ApplePayPaymentAuthorizationResult::isFinalState const):
     47        (WebCore::ApplePayPaymentAuthorizationResult::encode const):
     48        (WebCore::ApplePayPaymentAuthorizationResult::decode):
     49        * Modules/applepay/ApplePaySessionPaymentRequest.h:
     50        * Modules/applepay/ApplePaySessionPaymentRequest.cpp:
     51        (WebCore::isFinalStateResult): Deleted.
     52        * Modules/applepay/ApplePaySession.h:
     53        * Modules/applepay/ApplePaySession.cpp:
     54        (WebCore::convertAndValidate):
     55        (WebCore::ApplePaySession::completePayment):
     56        * Modules/applepay/PaymentCoordinator.h:
     57        * Modules/applepay/PaymentCoordinator.cpp:
     58        (WebCore::PaymentCoordinator::completePaymentSession):
     59        * Modules/applepay/PaymentCoordinatorClient.h:
     60        * loader/EmptyClients.cpp:
     61        * testing/MockPaymentCoordinator.h:
     62        * testing/MockPaymentCoordinator.cpp:
     63        (WebCore::MockPaymentCoordinator::completePaymentSession):
     64        Replace `PaymentAuthorizationResult` with `ApplePayPaymentAuthorizationResult` so that data
     65        doesn't need to be moved between identically shaped structs for sending to the UIProcess.
     66
     67        * Modules/applepay/cocoa/PaymentAPIVersionCocoa.mm:
     68        (WebCore::PaymentAPIVersion::current):
     69        Increment the current version.
     70
     71        * Modules/applepay-ams-ui/ApplePayAMSUIPaymentHandler.h:
     72        * Modules/applepay-ams-ui/ApplePayAMSUIPaymentHandler.cpp:
     73        (WebCore::ApplePayAMSUIPaymentHandler::complete):
     74        AMS UI does not allow/require any data to be provided on completion.
     75
     76        * CMakeLists.txt:
     77        * DerivedSources-input.xcfilelist:
     78        * DerivedSources-output.xcfilelist:
     79        * DerivedSources.make:
     80        * Headers.cmake:
     81        * PlatformMac.cmake:
     82        * Sources.txt:
     83        * SourcesCocoa.txt:
     84        * WebCore.xcodeproj/project.pbxproj:
     85
    1862022-01-27  Elliott Williams  <emw@apple.com>
    287
  • trunk/Source/WebCore/DerivedSources-input.xcfilelist

    r288442 r288698  
    219219$(PROJECT_DIR)/Modules/applepay/ApplePayValidateMerchantEvent.idl
    220220$(PROJECT_DIR)/Modules/applepay/paymentrequest/ApplePayModifier.idl
     221$(PROJECT_DIR)/Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.idl
    221222$(PROJECT_DIR)/Modules/applepay/paymentrequest/ApplePayRequest.idl
    222223$(PROJECT_DIR)/Modules/async-clipboard/Clipboard.idl
     
    552553$(PROJECT_DIR)/Modules/paymentrequest/PaymentAddress.idl
    553554$(PROJECT_DIR)/Modules/paymentrequest/PaymentComplete.idl
     555$(PROJECT_DIR)/Modules/paymentrequest/PaymentCompleteDetails.idl
    554556$(PROJECT_DIR)/Modules/paymentrequest/PaymentCurrencyAmount.idl
    555557$(PROJECT_DIR)/Modules/paymentrequest/PaymentDetailsBase.idl
  • trunk/Source/WebCore/DerivedSources-output.xcfilelist

    r288453 r288698  
    125125$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentAuthorizedEvent.cpp
    126126$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentAuthorizedEvent.h
     127$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentCompleteDetails.cpp
     128$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentCompleteDetails.h
    127129$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentContact.cpp
    128130$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSApplePayPaymentContact.h
     
    17941796$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSPaymentComplete.cpp
    17951797$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSPaymentComplete.h
     1798$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSPaymentCompleteDetails.cpp
     1799$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSPaymentCompleteDetails.h
    17961800$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSPaymentCurrencyAmount.cpp
    17971801$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSPaymentCurrencyAmount.h
  • trunk/Source/WebCore/DerivedSources.make

    r288442 r288698  
    240240    $(WebCore)/Modules/applepay/ApplePayValidateMerchantEvent.idl \
    241241    $(WebCore)/Modules/applepay/paymentrequest/ApplePayModifier.idl \
     242    $(WebCore)/Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.idl \
    242243    $(WebCore)/Modules/applepay/paymentrequest/ApplePayRequest.idl \
    243244    $(WebCore)/Modules/applepay-ams-ui/ApplePayAMSUIRequest.idl \
     
    472473    $(WebCore)/Modules/paymentrequest/PaymentAddress.idl \
    473474    $(WebCore)/Modules/paymentrequest/PaymentComplete.idl \
     475    $(WebCore)/Modules/paymentrequest/PaymentCompleteDetails.idl \
    474476    $(WebCore)/Modules/paymentrequest/PaymentCurrencyAmount.idl \
    475477    $(WebCore)/Modules/paymentrequest/PaymentDetailsBase.idl \
  • trunk/Source/WebCore/Headers.cmake

    r288640 r288698  
    134134    Modules/applepay/ApplePaySessionPaymentRequest.h
    135135    Modules/applepay/Payment.h
    136     Modules/applepay/PaymentAuthorizationStatus.h
    137136    Modules/applepay/PaymentContact.h
    138137    Modules/applepay/PaymentCoordinator.h
  • trunk/Source/WebCore/Modules/applepay-ams-ui/ApplePayAMSUIPaymentHandler.cpp

    r286452 r288698  
    162162}
    163163
    164 void ApplePayAMSUIPaymentHandler::complete(std::optional<PaymentComplete>&&)
     164ExceptionOr<void> ApplePayAMSUIPaymentHandler::complete(Document&, std::optional<PaymentComplete>&&, String&&)
    165165{
    166166    hide();
     167    return { };
    167168}
    168169
  • trunk/Source/WebCore/Modules/applepay-ams-ui/ApplePayAMSUIPaymentHandler.h

    r286452 r288698  
    7676    ExceptionOr<void> detailsUpdated(PaymentRequest::UpdateReason, String&& error, AddressErrors&&, PayerErrorFields&&, JSC::JSObject* paymentMethodErrors) final;
    7777    ExceptionOr<void> merchantValidationCompleted(JSC::JSValue&&) final;
    78     void complete(std::optional<PaymentComplete>&&) final;
     78    ExceptionOr<void> complete(Document&, std::optional<PaymentComplete>&&, String&& serializedData) final;
    7979    ExceptionOr<void> retry(PaymentValidationErrors&&) final;
    8080
  • trunk/Source/WebCore/Modules/applepay/ApplePayPaymentAuthorizationResult.cpp

    r288697 r288698  
    11/*
    2  * Copyright (C) 2016 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #pragma once
     26#include "config.h"
     27#include "ApplePayPaymentAuthorizationResult.h"
    2728
    2829#if ENABLE(APPLE_PAY)
    2930
    30 #include <wtf/Forward.h>
    31 
    3231namespace WebCore {
    3332
    34 enum class PaymentAuthorizationStatus {
    35     Success,
    36     Failure,
    37     PINRequired,
    38     PINIncorrect,
    39     PINLockout,
    40 };
     33bool ApplePayPaymentAuthorizationResult::isFinalState() const
     34{
     35    switch (status) {
     36    case ApplePayPaymentAuthorizationResult::Success:
     37    case ApplePayPaymentAuthorizationResult::Failure:
     38        return errors.isEmpty();
    4139
     40    case ApplePayPaymentAuthorizationResult::PINRequired:
     41    case ApplePayPaymentAuthorizationResult::PINIncorrect:
     42    case ApplePayPaymentAuthorizationResult::PINLockout:
     43        return false;
     44
     45    default:
     46        ASSERT_NOT_REACHED();
     47        return false;
     48    }
    4249}
    4350
    44 namespace WTF {
    45 template<> struct EnumTraits<WebCore::PaymentAuthorizationStatus> {
    46     using values = EnumValues<
    47         WebCore::PaymentAuthorizationStatus,
    48         WebCore::PaymentAuthorizationStatus::Success,
    49         WebCore::PaymentAuthorizationStatus::Failure,
    50         WebCore::PaymentAuthorizationStatus::PINRequired,
    51         WebCore::PaymentAuthorizationStatus::PINIncorrect,
    52         WebCore::PaymentAuthorizationStatus::PINLockout
    53     >;
    54 };
    55 }
     51} // namespace WebCore
    5652
    57 #endif
     53#endif // ENABLE(APPLE_PAY)
  • trunk/Source/WebCore/Modules/applepay/ApplePayPaymentAuthorizationResult.h

    r273143 r288698  
    2929
    3030#include "ApplePayError.h"
     31#include <optional>
    3132#include <wtf/RefPtr.h>
    3233#include <wtf/Vector.h>
     34
     35#if USE(APPLE_INTERNAL_SDK)
     36#include <WebKitAdditions/ApplePayPaymentAuthorizationResultAdditions.h>
     37#endif
    3338
    3439namespace WebCore {
    3540
    3641struct ApplePayPaymentAuthorizationResult {
    37     unsigned short status;
     42    using Status = unsigned short;
     43    static constexpr Status Success = 0;
     44    static constexpr Status Failure = 1;
     45    static constexpr Status InvalidBillingPostalAddress = 2;
     46    static constexpr Status InvalidShippingPostalAddress = 3;
     47    static constexpr Status InvalidShippingContact = 4;
     48    static constexpr Status PINRequired = 5;
     49    static constexpr Status PINIncorrect = 6;
     50    static constexpr Status PINLockout = 7;
     51
     52    Status status; // required
    3853    Vector<RefPtr<ApplePayError>> errors;
     54
     55#if defined(ApplePayPaymentAuthorizationResultAdditions_members)
     56    ApplePayPaymentAuthorizationResultAdditions_members
     57#endif
     58
     59    WEBCORE_EXPORT bool isFinalState() const;
     60
     61    template<class Encoder> void encode(Encoder&) const;
     62    template<class Decoder> static std::optional<ApplePayPaymentAuthorizationResult> decode(Decoder&);
    3963};
     64
     65template<class Encoder>
     66void ApplePayPaymentAuthorizationResult::encode(Encoder& encoder) const
     67{
     68    encoder << status;
     69    encoder << errors;
     70#if defined(ApplePayPaymentAuthorizationResultAdditions_encode)
     71    ApplePayPaymentAuthorizationResultAdditions_encode
     72#endif
     73}
     74
     75template<class Decoder>
     76std::optional<ApplePayPaymentAuthorizationResult> ApplePayPaymentAuthorizationResult::decode(Decoder& decoder)
     77{
     78#define DECODE(name, type) \
     79    std::optional<type> name; \
     80    decoder >> name; \
     81    if (!name) \
     82        return std::nullopt; \
     83
     84    DECODE(status, Status)
     85    DECODE(errors, Vector<RefPtr<ApplePayError>>)
     86#if defined(ApplePayPaymentAuthorizationResultAdditions_decode_members)
     87    ApplePayPaymentAuthorizationResultAdditions_decode_members
     88#endif
     89
     90#undef DECODE
     91
     92    return { {
     93        WTFMove(*status),
     94        WTFMove(*errors),
     95#if defined(ApplePayPaymentAuthorizationResultAdditions_decode_return)
     96    ApplePayPaymentAuthorizationResultAdditions_decode_return
     97#endif
     98    } };
     99}
    40100
    41101}
  • trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp

    r287066 r288698  
    5656#include "Page.h"
    5757#include "PageConsoleClient.h"
    58 #include "PaymentAuthorizationStatus.h"
    5958#include "PaymentContact.h"
    6059#include "PaymentCoordinator.h"
     
    195194}
    196195
    197 static ExceptionOr<PaymentAuthorizationResult> convertAndValidate(ApplePayPaymentAuthorizationResult&& result)
    198 {
    199     PaymentAuthorizationResult convertedResult;
    200 
     196static ExceptionOr<ApplePayPaymentAuthorizationResult> convertAndValidate(ApplePayPaymentAuthorizationResult&& result)
     197{
    201198    switch (result.status) {
    202     case ApplePaySession::STATUS_SUCCESS:
    203         convertedResult.status = PaymentAuthorizationStatus::Success;
     199    case ApplePayPaymentAuthorizationResult::Success:
     200    case ApplePayPaymentAuthorizationResult::Failure:
     201    case ApplePayPaymentAuthorizationResult::PINRequired:
     202    case ApplePayPaymentAuthorizationResult::PINIncorrect:
     203    case ApplePayPaymentAuthorizationResult::PINLockout:
    204204        break;
    205205
    206     case ApplePaySession::STATUS_FAILURE:
    207         convertedResult.status = PaymentAuthorizationStatus::Failure;
     206    case ApplePayPaymentAuthorizationResult::InvalidBillingPostalAddress:
     207        result.status = ApplePayPaymentAuthorizationResult::Failure;
     208        result.errors.insert(0, ApplePayError::create(ApplePayErrorCode::BillingContactInvalid, std::nullopt, nullString()));
    208209        break;
    209210
    210     case ApplePaySession::STATUS_INVALID_BILLING_POSTAL_ADDRESS:
    211         convertedResult.status = PaymentAuthorizationStatus::Failure;
    212         convertedResult.errors.append(ApplePayError::create(ApplePayErrorCode::BillingContactInvalid, std::nullopt, nullString()));
     211    case ApplePayPaymentAuthorizationResult::InvalidShippingPostalAddress:
     212        result.status = ApplePayPaymentAuthorizationResult::Failure;
     213        result.errors.insert(0, ApplePayError::create(ApplePayErrorCode::ShippingContactInvalid, ApplePayErrorContactField::PostalAddress, nullString()));
    213214        break;
    214215
    215     case ApplePaySession::STATUS_INVALID_SHIPPING_POSTAL_ADDRESS:
    216         convertedResult.status = PaymentAuthorizationStatus::Failure;
    217         convertedResult.errors.append(ApplePayError::create(ApplePayErrorCode::ShippingContactInvalid, ApplePayErrorContactField::PostalAddress, nullString()));
     216    case ApplePayPaymentAuthorizationResult::InvalidShippingContact:
     217        result.status = ApplePayPaymentAuthorizationResult::Failure;
     218        result.errors.insert(0, ApplePayError::create(ApplePayErrorCode::ShippingContactInvalid, std::nullopt, nullString()));
    218219        break;
    219220
    220     case ApplePaySession::STATUS_INVALID_SHIPPING_CONTACT:
    221         convertedResult.status = PaymentAuthorizationStatus::Failure;
    222         convertedResult.errors.append(ApplePayError::create(ApplePayErrorCode::ShippingContactInvalid, std::nullopt, nullString()));
    223         break;
    224 
    225     case ApplePaySession::STATUS_PIN_REQUIRED:
    226         convertedResult.status = PaymentAuthorizationStatus::PINRequired;
    227         break;
    228 
    229     case ApplePaySession::STATUS_PIN_INCORRECT:
    230         convertedResult.status = PaymentAuthorizationStatus::PINIncorrect;
    231         break;
    232 
    233     case ApplePaySession::STATUS_PIN_LOCKOUT:
    234         convertedResult.status = PaymentAuthorizationStatus::PINLockout;
    235         break;
    236 
    237221    default:
    238222        return Exception { InvalidAccessError };
    239223    }
    240224
    241     convertedResult.errors.appendVector(WTFMove(result.errors));
    242 
    243     return WTFMove(convertedResult);
     225#if defined(ApplePaySessionAdditions_convertAndValidate_ApplePayPaymentAuthorizationResult)
     226    ApplePaySessionAdditions_convertAndValidate_ApplePayPaymentAuthorizationResult
     227#endif
     228
     229    return WTFMove(result);
    244230}
    245231
     
    568554
    569555    auto&& convertedResult = convertedResultOrException.releaseReturnValue();
    570     bool isFinalState = isFinalStateResult(convertedResult);
     556    bool isFinalState = convertedResult.isFinalState();
    571557
    572558    paymentCoordinator().completePaymentSession(WTFMove(convertedResult));
  • trunk/Source/WebCore/Modules/applepay/ApplePaySession.h

    r278640 r288698  
    2929
    3030#include "ActiveDOMObject.h"
     31#include "ApplePayPaymentAuthorizationResult.h"
    3132#include "ApplePayPaymentRequest.h"
    3233#include "EventTarget.h"
     
    5051class PaymentCoordinator;
    5152class PaymentMethod;
    52 enum class PaymentAuthorizationStatus;
    5353struct ApplePayCouponCodeUpdate;
    5454struct ApplePayLineItem;
    5555struct ApplePayPaymentRequest;
    5656struct ApplePayShippingMethod;
    57 struct ApplePayPaymentAuthorizationResult;
    5857struct ApplePayPaymentMethodUpdate;
    5958struct ApplePayShippingContactUpdate;
     
    6665    virtual ~ApplePaySession();
    6766
    68     static const unsigned short STATUS_SUCCESS = 0;
    69     static const unsigned short STATUS_FAILURE = 1;
    70     static const unsigned short STATUS_INVALID_BILLING_POSTAL_ADDRESS = 2;
    71     static const unsigned short STATUS_INVALID_SHIPPING_POSTAL_ADDRESS = 3;
    72     static const unsigned short STATUS_INVALID_SHIPPING_CONTACT = 4;
    73     static const unsigned short STATUS_PIN_REQUIRED = 5;
    74     static const unsigned short STATUS_PIN_INCORRECT = 6;
    75     static const unsigned short STATUS_PIN_LOCKOUT = 7;
     67    static constexpr auto STATUS_SUCCESS = ApplePayPaymentAuthorizationResult::Success;
     68    static constexpr auto STATUS_FAILURE = ApplePayPaymentAuthorizationResult::Failure;
     69    static constexpr auto STATUS_INVALID_BILLING_POSTAL_ADDRESS = ApplePayPaymentAuthorizationResult::InvalidBillingPostalAddress;
     70    static constexpr auto STATUS_INVALID_SHIPPING_POSTAL_ADDRESS = ApplePayPaymentAuthorizationResult::InvalidShippingPostalAddress;
     71    static constexpr auto STATUS_INVALID_SHIPPING_CONTACT = ApplePayPaymentAuthorizationResult::InvalidShippingContact;
     72    static constexpr auto STATUS_PIN_REQUIRED = ApplePayPaymentAuthorizationResult::PINRequired;
     73    static constexpr auto STATUS_PIN_INCORRECT = ApplePayPaymentAuthorizationResult::PINIncorrect;
     74    static constexpr auto STATUS_PIN_LOCKOUT = ApplePayPaymentAuthorizationResult::PINLockout;
    7675
    7776    static ExceptionOr<bool> supportsVersion(Document&, unsigned version);
  • trunk/Source/WebCore/Modules/applepay/ApplePaySessionPaymentRequest.cpp

    r278253 r288698  
    2929#if ENABLE(APPLE_PAY)
    3030
    31 #include "PaymentAuthorizationStatus.h"
    3231#include <wtf/SoftLinking.h>
    3332
     
    3837ApplePaySessionPaymentRequest::~ApplePaySessionPaymentRequest() = default;
    3938
    40 bool isFinalStateResult(const std::optional<PaymentAuthorizationResult>& result)
    41 {
    42     if (!result)
    43         return true;
    44 
    45     switch (result->status) {
    46     case PaymentAuthorizationStatus::Success:
    47     case PaymentAuthorizationStatus::Failure:
    48         return result->errors.isEmpty();
    49 
    50     case PaymentAuthorizationStatus::PINRequired:
    51     case PaymentAuthorizationStatus::PINIncorrect:
    52     case PaymentAuthorizationStatus::PINLockout:
    53         return false;
    54     }
    55 }
    56 
    5739}
    5840
  • trunk/Source/WebCore/Modules/applepay/ApplePaySessionPaymentRequest.h

    r278630 r288698  
    4545namespace WebCore {
    4646
    47 enum class PaymentAuthorizationStatus;
    48 
    4947class ApplePaySessionPaymentRequest {
    5048public:
     
    187185#endif
    188186};
    189 
    190 struct PaymentAuthorizationResult {
    191     PaymentAuthorizationStatus status;
    192     Vector<RefPtr<ApplePayError>> errors;
    193 };
    194 
    195 WEBCORE_EXPORT bool isFinalStateResult(const std::optional<PaymentAuthorizationResult>&);
    196187
    197188} // namespace WebCore
  • trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.cpp

    r285376 r288698  
    3939#include "Logging.h"
    4040#include "Page.h"
    41 #include "PaymentAuthorizationStatus.h"
    4241#include "PaymentCoordinatorClient.h"
    4342#include "PaymentSession.h"
     
    165164#endif // ENABLE(APPLE_PAY_COUPON_CODE)
    166165
    167 void PaymentCoordinator::completePaymentSession(std::optional<PaymentAuthorizationResult>&& result)
    168 {
    169     ASSERT(m_activeSession);
    170 
    171     bool isFinalState = isFinalStateResult(result);
     166void PaymentCoordinator::completePaymentSession(ApplePayPaymentAuthorizationResult&& result)
     167{
     168    ASSERT(m_activeSession);
     169
     170    bool isFinalState = result.isFinalState();
    172171    PAYMENT_COORDINATOR_RELEASE_LOG("completePaymentSession() (isFinalState: %d)", isFinalState);
    173172    m_client.completePaymentSession(WTFMove(result));
  • trunk/Source/WebCore/Modules/applepay/PaymentCoordinator.h

    r284857 r288698  
    4444class PaymentSession;
    4545class PaymentSessionError;
    46 enum class PaymentAuthorizationStatus;
    4746struct ApplePayCouponCodeUpdate;
     47struct ApplePayPaymentAuthorizationResult;
    4848struct ApplePayPaymentMethodUpdate;
    4949struct ApplePaySetupConfiguration;
     
    5252struct ApplePayShippingMethodUpdate;
    5353struct ExceptionDetails;
    54 struct PaymentAuthorizationResult;
    5554
    5655class PaymentCoordinator : public CanMakeWeakPtr<PaymentCoordinator> {
     
    7776    void completeCouponCodeChange(std::optional<ApplePayCouponCodeUpdate>&&);
    7877#endif
    79     void completePaymentSession(std::optional<PaymentAuthorizationResult>&&);
     78    void completePaymentSession(ApplePayPaymentAuthorizationResult&&);
    8079    void abortPaymentSession();
    8180    void cancelPaymentSession();
  • trunk/Source/WebCore/Modules/applepay/PaymentCoordinatorClient.h

    r278712 r288698  
    3939class PaymentMerchantSession;
    4040struct ApplePayCouponCodeUpdate;
     41struct ApplePayPaymentAuthorizationResult;
    4142struct ApplePayPaymentMethodUpdate;
    4243struct ApplePaySetupConfiguration;
    4344struct ApplePayShippingContactUpdate;
    4445struct ApplePayShippingMethodUpdate;
    45 struct PaymentAuthorizationResult;
    4646
    4747class PaymentCoordinatorClient {
     
    6262    virtual void completeCouponCodeChange(std::optional<ApplePayCouponCodeUpdate>&&) = 0;
    6363#endif
    64     virtual void completePaymentSession(std::optional<PaymentAuthorizationResult>&&) = 0;
     64    virtual void completePaymentSession(ApplePayPaymentAuthorizationResult&&) = 0;
    6565    virtual void abortPaymentSession() = 0;
    6666    virtual void cancelPaymentSession() = 0;
  • trunk/Source/WebCore/Modules/applepay/cocoa/PaymentAPIVersionCocoa.mm

    r285444 r288698  
    3636{
    3737    static unsigned current = [] {
    38 #if ENABLE(APPLE_PAY_PAYMENT_DETAILS_DATA) || ENABLE(APPLE_PAY_AMS_UI)
     38#if ENABLE(APPLE_PAY_PAYMENT_COMPLETE_DETAILS_DATA)
     39        return 14;
     40#elif ENABLE(APPLE_PAY_PAYMENT_DETAILS_DATA) || ENABLE(APPLE_PAY_AMS_UI)
    3941        return 13;
    4042#elif ENABLE(APPLE_PAY_COUPON_CODE) || ENABLE(APPLE_PAY_SHIPPING_CONTACT_EDITING_MODE) || ENABLE(APPLE_PAY_RECURRING_LINE_ITEM) || ENABLE(APPLE_PAY_DEFERRED_LINE_ITEM) || ENABLE(APPLE_PAY_SHIPPING_METHOD_DATE_COMPONENTS_RANGE)
  • trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.idl

    r288697 r288698  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #pragma once
    27 
    28 #if ENABLE(APPLE_PAY)
    29 
    30 #include "ApplePayError.h"
    31 #include <wtf/RefPtr.h>
    32 #include <wtf/Vector.h>
    33 
    34 namespace WebCore {
    35 
    36 struct ApplePayPaymentAuthorizationResult {
    37     unsigned short status;
    38     Vector<RefPtr<ApplePayError>> errors;
     26[
     27    Conditional=APPLE_PAY&PAYMENT_REQUEST
     28] dictionary ApplePayPaymentCompleteDetails {
    3929};
    40 
    41 }
    42 
    43 #endif
  • trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp

    r287731 r288698  
    4141#include "ApplePayModifier.h"
    4242#include "ApplePayPayment.h"
     43#include "ApplePayPaymentAuthorizationResult.h"
     44#include "ApplePayPaymentCompleteDetails.h"
    4345#include "ApplePayPaymentMethodUpdate.h"
    4446#include "ApplePaySessionPaymentRequest.h"
     
    6062#include "PayerErrorFields.h"
    6163#include "Payment.h"
    62 #include "PaymentAuthorizationStatus.h"
     64#include "PaymentComplete.h"
    6365#include "PaymentContact.h"
    6466#include "PaymentCoordinator.h"
     
    686688}
    687689
    688 void ApplePayPaymentHandler::complete(std::optional<PaymentComplete>&& result)
    689 {
    690     if (!result) {
    691         ASSERT(isFinalStateResult(std::nullopt));
    692         paymentCoordinator().completePaymentSession(std::nullopt);
    693         return;
    694     }
    695 
    696     PaymentAuthorizationResult authorizationResult;
    697     switch (*result) {
     690#if !USE(APPLE_INTERNAL_SDK)
     691static ExceptionOr<ApplePayPaymentCompleteDetails> convertAndValidate(ApplePayPaymentCompleteDetails&& details) { return WTFMove(details); }
     692static void merge(ApplePayPaymentAuthorizationResult&, ApplePayPaymentCompleteDetails&&) { }
     693#endif
     694
     695ExceptionOr<void> ApplePayPaymentHandler::complete(Document& document, std::optional<PaymentComplete>&& result, String&& serializedData)
     696{
     697    ApplePayPaymentAuthorizationResult authorizationResult;
     698
     699    switch (result.value_or(PaymentComplete::Success)) {
    698700    case PaymentComplete::Fail:
    699701    case PaymentComplete::Unknown:
    700         authorizationResult.status = PaymentAuthorizationStatus::Failure;
     702        authorizationResult.status = ApplePayPaymentAuthorizationResult::Failure;
    701703        break;
     704
    702705    case PaymentComplete::Success:
    703         authorizationResult.status = PaymentAuthorizationStatus::Success;
     706        authorizationResult.status = ApplePayPaymentAuthorizationResult::Success;
    704707        break;
    705708    }
    706709
    707     ASSERT(isFinalStateResult(authorizationResult));
     710    if (!serializedData.isEmpty()) {
     711        auto throwScope = DECLARE_THROW_SCOPE(document.vm());
     712
     713        auto parsedData = JSONParse(document.globalObject(), WTFMove(serializedData));
     714        if (throwScope.exception())
     715            return Exception { ExistingExceptionError };
     716
     717        auto details = convertDictionary<ApplePayPaymentCompleteDetails>(*document.globalObject(), WTFMove(parsedData));
     718        if (throwScope.exception())
     719            return Exception { ExistingExceptionError };
     720
     721        auto convertedDetails = convertAndValidate(WTFMove(details));
     722        if (convertedDetails.hasException())
     723            return convertedDetails.releaseException();
     724        merge(authorizationResult, convertedDetails.releaseReturnValue());
     725    }
     726
     727    ASSERT(authorizationResult.isFinalState());
    708728    paymentCoordinator().completePaymentSession(WTFMove(authorizationResult));
     729    return { };
    709730}
    710731
     
    724745        errors.append(ApplePayError::create(ApplePayErrorCode::Unknown, std::nullopt, nullString()));
    725746
    726     PaymentAuthorizationResult authorizationResult { PaymentAuthorizationStatus::Failure, WTFMove(errors) };
    727     ASSERT(!isFinalStateResult(authorizationResult));
     747    ApplePayPaymentAuthorizationResult authorizationResult { ApplePayPaymentAuthorizationResult::Failure, WTFMove(errors) };
     748    ASSERT(!authorizationResult.isFinalState());
    728749    paymentCoordinator().completePaymentSession(WTFMove(authorizationResult));
    729750    return { };
  • trunk/Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.h

    r286452 r288698  
    7979    ExceptionOr<void> detailsUpdated(PaymentRequest::UpdateReason, String&& error, AddressErrors&&, PayerErrorFields&&, JSC::JSObject* paymentMethodErrors) final;
    8080    ExceptionOr<void> merchantValidationCompleted(JSC::JSValue&&) final;
    81     void complete(std::optional<PaymentComplete>&&) final;
     81    ExceptionOr<void> complete(Document&, std::optional<PaymentComplete>&&, String&& serializedData) final;
    8282    ExceptionOr<void> retry(PaymentValidationErrors&&) final;
    8383
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentCompleteDetails.h

    r288697 r288698  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2626#pragma once
    2727
    28 #if ENABLE(APPLE_PAY)
     28#if ENABLE(PAYMENT_REQUEST)
    2929
    30 #include "ApplePayError.h"
    31 #include <wtf/RefPtr.h>
    32 #include <wtf/Vector.h>
     30#include <JavaScriptCore/JSObject.h>
     31#include <JavaScriptCore/Strong.h>
    3332
    3433namespace WebCore {
    3534
    36 struct ApplePayPaymentAuthorizationResult {
    37     unsigned short status;
    38     Vector<RefPtr<ApplePayError>> errors;
     35struct PaymentCompleteDetails {
     36    JSC::Strong<JSC::JSObject> data;
    3937};
    4038
    41 }
     39} // namespace WebCore
    4240
    43 #endif
     41#endif // ENABLE(PAYMENT_REQUEST)
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentCompleteDetails.idl

    r288697 r288698  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #pragma once
    27 
    28 #if ENABLE(APPLE_PAY)
    29 
    30 #include "ApplePayError.h"
    31 #include <wtf/RefPtr.h>
    32 #include <wtf/Vector.h>
    33 
    34 namespace WebCore {
    35 
    36 struct ApplePayPaymentAuthorizationResult {
    37     unsigned short status;
    38     Vector<RefPtr<ApplePayError>> errors;
     26[
     27    Conditional=PAYMENT_REQUEST
     28] dictionary PaymentCompleteDetails {
     29    object? data;
    3930};
    40 
    41 }
    42 
    43 #endif
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentHandler.h

    r286452 r288698  
    5858    virtual ExceptionOr<void> detailsUpdated(PaymentRequest::UpdateReason, String&& error, AddressErrors&&, PayerErrorFields&&, JSC::JSObject* paymentMethodErrors) = 0;
    5959    virtual ExceptionOr<void> merchantValidationCompleted(JSC::JSValue&&) = 0;
    60     virtual void complete(std::optional<PaymentComplete>&&) = 0;
     60    virtual ExceptionOr<void> complete(Document&, std::optional<PaymentComplete>&&, String&& serializedData) = 0;
    6161    virtual ExceptionOr<void> retry(PaymentValidationErrors&&) = 0;
    6262};
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp

    r287066 r288698  
    773773}
    774774
    775 ExceptionOr<void> PaymentRequest::complete(std::optional<PaymentComplete>&& result)
     775ExceptionOr<void> PaymentRequest::complete(Document& document, std::optional<PaymentComplete>&& result, String&& serializedData)
    776776{
    777777    ASSERT(m_state == State::Closed);
     
    779779        return Exception { AbortError };
    780780
    781     activePaymentHandler()->complete(WTFMove(result));
     781    auto exception = activePaymentHandler()->complete(document, WTFMove(result), WTFMove(serializedData));
     782    if (exception.hasException())
     783        return exception.releaseException();
     784
    782785    m_activePaymentHandler = std::nullopt;
    783786    return { };
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.h

    r285444 r288698  
    100100    void accept(const String& methodName, PaymentResponse::DetailsFunction&&, Ref<PaymentAddress>&& shippingAddress, const String& payerName, const String& payerEmail, const String& payerPhone);
    101101    void reject(Exception&&);
    102     ExceptionOr<void> complete(std::optional<PaymentComplete>&&);
     102    ExceptionOr<void> complete(Document&, std::optional<PaymentComplete>&&, String&& serializedData);
    103103    ExceptionOr<void> retry(PaymentValidationErrors&&);
    104104    void cancel();
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentResponse.cpp

    r287177 r288698  
    2929#if ENABLE(PAYMENT_REQUEST)
    3030
     31#include "Document.h"
    3132#include "JSDOMPromiseDeferred.h"
    3233#include "NotImplemented.h"
     34#include "PaymentComplete.h"
     35#include "PaymentCompleteDetails.h"
    3336#include "PaymentRequest.h"
     37#include <JavaScriptCore/JSONObject.h>
     38#include <JavaScriptCore/ThrowScope.h>
    3439#include <wtf/IsoMallocInlines.h>
    3540#include <wtf/RunLoop.h>
     
    6469}
    6570
    66 void PaymentResponse::complete(std::optional<PaymentComplete>&& result, DOMPromiseDeferred<void>&& promise)
     71void PaymentResponse::complete(Document& document, std::optional<PaymentComplete>&& result, std::optional<PaymentCompleteDetails>&& details, DOMPromiseDeferred<void>&& promise)
    6772{
    6873    if (m_state == State::Stopped || !m_request) {
     
    7681    }
    7782
    78     ASSERT(hasPendingActivity());
    79     ASSERT(m_state == State::Created);
    80     m_pendingActivity = nullptr;
    81     m_state = State::Completed;
     83    String serializedData;
     84    if (details) {
     85        if (auto data = details->data) {
     86            auto throwScope = DECLARE_THROW_SCOPE(document.globalObject()->vm());
    8287
    83     promise.settle(m_request->complete(WTFMove(result)));
     88            serializedData = JSONStringify(document.globalObject(), data.get(), 0);
     89            if (throwScope.exception()) {
     90                promise.reject(Exception { ExistingExceptionError });
     91                return;
     92            }
     93        }
     94    }
     95
     96    auto exception = m_request->complete(document, WTFMove(result), WTFMove(serializedData));
     97    if (!exception.hasException()) {
     98        ASSERT(hasPendingActivity());
     99        ASSERT(m_state == State::Created);
     100        m_pendingActivity = nullptr;
     101        m_state = State::Completed;
     102    }
     103    promise.settle(WTFMove(exception));
    84104}
    85105
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentResponse.h

    r278253 r288698  
    3333#include "JSValueInWrappedObject.h"
    3434#include "PaymentAddress.h"
    35 #include "PaymentComplete.h"
    3635#include <wtf/WeakPtr.h>
    3736
     
    4039class Document;
    4140class PaymentRequest;
     41
     42struct PaymentCompleteDetails;
    4243struct PaymentValidationErrors;
     44
     45enum class PaymentComplete;
    4346
    4447template<typename IDLType> class DOMPromiseDeferred;
     
    8487    void setPayerPhone(const String& payerPhone) { m_payerPhone = payerPhone; }
    8588
    86     void complete(std::optional<PaymentComplete>&&, DOMPromiseDeferred<void>&&);
     89    void complete(Document&, std::optional<PaymentComplete>&&, std::optional<PaymentCompleteDetails>&&, DOMPromiseDeferred<void>&&);
    8790    void retry(PaymentValidationErrors&&, DOMPromiseDeferred<void>&&);
    8891    void abortWithException(Exception&&);
  • trunk/Source/WebCore/Modules/paymentrequest/PaymentResponse.idl

    r283463 r288698  
    4343    readonly attribute DOMString? payerPhone;
    4444
    45     [NewObject] Promise<undefined> complete(optional PaymentComplete result = "unknown");
     45    [CallWith=Document, NewObject] Promise<undefined> complete(optional PaymentComplete result = "unknown", optional PaymentCompleteDetails details);
    4646    [NewObject] Promise<undefined> retry(optional PaymentValidationErrors errorFields);
    4747
  • trunk/Source/WebCore/PlatformMac.cmake

    r287310 r288698  
    797797
    798798    Modules/applepay/paymentrequest/ApplePayModifier.idl
     799    Modules/applepay/paymentrequest/ApplePayPaymentCompleteDetails.idl
    799800    Modules/applepay/paymentrequest/ApplePayRequest.idl
    800801
  • trunk/Source/WebCore/Sources.txt

    r288661 r288698  
    35453545JSPaymentAddress.cpp
    35463546JSPaymentComplete.cpp
     3547JSPaymentCompleteDetails.cpp
    35473548JSPaymentCurrencyAmount.cpp
    35483549JSPaymentDetailsBase.cpp
  • trunk/Source/WebCore/SourcesCocoa.txt

    r288604 r288698  
    4545JSApplePayPaymentAuthorizationResult.cpp
    4646JSApplePayPaymentAuthorizedEvent.cpp
     47JSApplePayPaymentCompleteDetails.cpp
    4748JSApplePayPaymentContact.cpp
    4849JSApplePayPaymentMethod.cpp
     
    7576Modules/applepay/ApplePayContactField.cpp
    7677Modules/applepay/ApplePayMerchantCapability.cpp
     78Modules/applepay/ApplePayPaymentAuthorizationResult.cpp
    7779Modules/applepay/ApplePayPaymentAuthorizedEvent.cpp
    7880Modules/applepay/ApplePayPaymentMethodSelectedEvent.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r288696 r288698  
    600600                1AE82F900CAAFA9D002237AE /* JSDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE82F8E0CAAFA9D002237AE /* JSDatabase.h */; };
    601601                1AE82FED0CAB07EE002237AE /* JSSQLResultSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE82FEB0CAB07EE002237AE /* JSSQLResultSet.h */; };
    602                 1AE96A881D1A0CEB00B86768 /* PaymentAuthorizationStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE96A861D1A0CEB00B86768 /* PaymentAuthorizationStatus.h */; settings = {ATTRIBUTES = (Private, ); }; };
    603602                1AE96A891D1A0CEB00B86768 /* PaymentMerchantSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE96A871D1A0CEB00B86768 /* PaymentMerchantSession.h */; settings = {ATTRIBUTES = (Private, ); }; };
    604603                1AE96A8B1D1A0DDD00B86768 /* JSApplePayPaymentAuthorizedEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE96A7B1D1A0A8000B86768 /* JSApplePayPaymentAuthorizedEvent.h */; };
     
    30973096                9596B93325DEEEA000ED2CFA /* ApplePayCouponCodeUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9596B93025DEEE9F00ED2CFA /* ApplePayCouponCodeUpdate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    30983097                9596B93825DEEF0300ED2CFA /* JSApplePayCouponCodeChangedEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9596B93625DEEF0200ED2CFA /* JSApplePayCouponCodeChangedEvent.h */; };
     3098                959CED10279CB6860017A8FF /* PaymentCompleteDetails.h in Headers */ = {isa = PBXBuildFile; fileRef = 959CED0D279CB6850017A8FF /* PaymentCompleteDetails.h */; };
     3099                959CED14279CB6B60017A8FF /* JSPaymentCompleteDetails.h in Headers */ = {isa = PBXBuildFile; fileRef = 959CED12279CB6B50017A8FF /* JSPaymentCompleteDetails.h */; };
     3100                959CED1C279CB82F0017A8FF /* ApplePayPaymentCompleteDetails.h in Headers */ = {isa = PBXBuildFile; fileRef = 959CED19279CB82E0017A8FF /* ApplePayPaymentCompleteDetails.h */; };
     3101                959CED21279CB88B0017A8FF /* JSApplePayPaymentCompleteDetails.h in Headers */ = {isa = PBXBuildFile; fileRef = 959CED1F279CB88B0017A8FF /* JSApplePayPaymentCompleteDetails.h */; };
    30993102                95A1E2E925CC75A900268C8E /* MediaControlsContextMenuItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 95A1E2E725CC75A800268C8E /* MediaControlsContextMenuItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
    31003103                95AA571025EEED32004E9283 /* InspectorCanvasCallTracer.h in Headers */ = {isa = PBXBuildFile; fileRef = 95AA570E25EEED31004E9283 /* InspectorCanvasCallTracer.h */; };
     
    33043307                A12A1050166444FD008FA311 /* GridTrackSize.h in Headers */ = {isa = PBXBuildFile; fileRef = A12A104E166444DC008FA311 /* GridTrackSize.h */; settings = {ATTRIBUTES = (Private, ); }; };
    33053308                A12C59EE2035FC9B0012236B /* ApplePayError.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADFDFD61E71D8DF008F5D34 /* ApplePayError.h */; settings = {ATTRIBUTES = (Private, ); }; };
    3306                 A12C59F02035FCAB0012236B /* ApplePayPaymentAuthorizationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADFDFD81E71D8DF008F5D34 /* ApplePayPaymentAuthorizationResult.h */; };
     3309                A12C59F02035FCAB0012236B /* ApplePayPaymentAuthorizationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADFDFD81E71D8DF008F5D34 /* ApplePayPaymentAuthorizationResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
    33073310                A12C59F12035FCBF0012236B /* ApplePayPaymentMethodUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADFDFDA1E71D8DF008F5D34 /* ApplePayPaymentMethodUpdate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    33083311                A12C59F22035FCD60012236B /* ApplePayShippingContactUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADFDFDC1E71D8DF008F5D34 /* ApplePayShippingContactUpdate.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    69977000                1ADFDFD61E71D8DF008F5D34 /* ApplePayError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplePayError.h; sourceTree = "<group>"; };
    69987001                1ADFDFD71E71D8DF008F5D34 /* ApplePayError.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ApplePayError.idl; sourceTree = "<group>"; };
     7002                1ADFDFD81E71D8DF008F5D33 /* ApplePayPaymentAuthorizationResult.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ApplePayPaymentAuthorizationResult.cpp; sourceTree = "<group>"; };
    69997003                1ADFDFD81E71D8DF008F5D34 /* ApplePayPaymentAuthorizationResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplePayPaymentAuthorizationResult.h; sourceTree = "<group>"; };
    70007004                1ADFDFD91E71D8DF008F5D34 /* ApplePayPaymentAuthorizationResult.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ApplePayPaymentAuthorizationResult.idl; sourceTree = "<group>"; };
     
    70907094                1AE96A831D1A0A8000B86768 /* JSApplePayShippingMethodSelectedEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSApplePayShippingMethodSelectedEvent.h; sourceTree = "<group>"; };
    70917095                1AE96A841D1A0A8000B86768 /* JSApplePayValidateMerchantEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSApplePayValidateMerchantEvent.cpp; sourceTree = "<group>"; };
    7092                 1AE96A861D1A0CEB00B86768 /* PaymentAuthorizationStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaymentAuthorizationStatus.h; sourceTree = "<group>"; };
    70937096                1AE96A871D1A0CEB00B86768 /* PaymentMerchantSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaymentMerchantSession.h; sourceTree = "<group>"; };
    70947097                1AEF4E66170E160300AB2799 /* CachedFontClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedFontClient.h; sourceTree = "<group>"; };
     
    1301513018                9596B93525DEEF0000ED2CFA /* JSApplePayCouponCodeUpdate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSApplePayCouponCodeUpdate.cpp; sourceTree = "<group>"; };
    1301613019                9596B93625DEEF0200ED2CFA /* JSApplePayCouponCodeChangedEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSApplePayCouponCodeChangedEvent.h; sourceTree = "<group>"; };
     13020                959CED0D279CB6850017A8FF /* PaymentCompleteDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaymentCompleteDetails.h; sourceTree = "<group>"; };
     13021                959CED0F279CB6850017A8FF /* PaymentCompleteDetails.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PaymentCompleteDetails.idl; sourceTree = "<group>"; };
     13022                959CED12279CB6B50017A8FF /* JSPaymentCompleteDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPaymentCompleteDetails.h; sourceTree = "<group>"; };
     13023                959CED13279CB6B50017A8FF /* JSPaymentCompleteDetails.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPaymentCompleteDetails.cpp; sourceTree = "<group>"; };
     13024                959CED19279CB82E0017A8FF /* ApplePayPaymentCompleteDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplePayPaymentCompleteDetails.h; sourceTree = "<group>"; };
     13025                959CED1B279CB82E0017A8FF /* ApplePayPaymentCompleteDetails.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ApplePayPaymentCompleteDetails.idl; sourceTree = "<group>"; };
     13026                959CED1E279CB88A0017A8FF /* JSApplePayPaymentCompleteDetails.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSApplePayPaymentCompleteDetails.cpp; path = ../../../../../../../../JSApplePayPaymentCompleteDetails.cpp; sourceTree = "<group>"; };
     13027                959CED1F279CB88B0017A8FF /* JSApplePayPaymentCompleteDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSApplePayPaymentCompleteDetails.h; path = ../../../../../../../../JSApplePayPaymentCompleteDetails.h; sourceTree = "<group>"; };
    1301713028                95A1E2E725CC75A800268C8E /* MediaControlsContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaControlsContextMenuItem.h; sourceTree = "<group>"; };
    1301813029                95AA570D25EEED30004E9283 /* InspectorCanvasCallTracer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorCanvasCallTracer.cpp; sourceTree = "<group>"; };
     
    1959419605                                7C6522FE1E00D03400677F22 /* ApplePayPayment.h */,
    1959519606                                7C6522FF1E00D03400677F22 /* ApplePayPayment.idl */,
     19607                                1ADFDFD81E71D8DF008F5D33 /* ApplePayPaymentAuthorizationResult.cpp */,
    1959619608                                1ADFDFD81E71D8DF008F5D34 /* ApplePayPaymentAuthorizationResult.h */,
    1959719609                                1ADFDFD91E71D8DF008F5D34 /* ApplePayPaymentAuthorizationResult.idl */,
     
    1965919671                                1A8A64371D19FC5300D0E00F /* Payment.h */,
    1966019672                                A169B042248F037B00EE8B7B /* PaymentAPIVersion.h */,
    19661                                 1AE96A861D1A0CEB00B86768 /* PaymentAuthorizationStatus.h */,
    1966219673                                1A8A64381D19FC5300D0E00F /* PaymentContact.h */,
    1966319674                                1A58E86B1D19E42D00C0EA73 /* PaymentCoordinator.cpp */,
     
    1982719838                                1AE96A7A1D1A0A8000B86768 /* JSApplePayPaymentAuthorizedEvent.cpp */,
    1982819839                                1AE96A7B1D1A0A8000B86768 /* JSApplePayPaymentAuthorizedEvent.h */,
     19840                                959CED1E279CB88A0017A8FF /* JSApplePayPaymentCompleteDetails.cpp */,
     19841                                959CED1F279CB88B0017A8FF /* JSApplePayPaymentCompleteDetails.h */,
    1982919842                                7C65230B1E00DBB400677F22 /* JSApplePayPaymentContact.cpp */,
    1983019843                                7C65230C1E00DBB400677F22 /* JSApplePayPaymentContact.h */,
     
    2648726500                                A1CC56601F46146200A4555B /* JSPaymentComplete.cpp */,
    2648826501                                A1CC564E1F46145200A4555B /* JSPaymentComplete.h */,
     26502                                959CED13279CB6B50017A8FF /* JSPaymentCompleteDetails.cpp */,
     26503                                959CED12279CB6B50017A8FF /* JSPaymentCompleteDetails.h */,
    2648926504                                A1CC565D1F46146000A4555B /* JSPaymentCurrencyAmount.cpp */,
    2649026505                                A1CC56631F46146600A4555B /* JSPaymentCurrencyAmount.h */,
     
    2652826543                                A1F6CFFC1FE096210018078C /* ApplePayModifier.h */,
    2652926544                                A1F6CFFE1FE096210018078C /* ApplePayModifier.idl */,
     26545                                959CED19279CB82E0017A8FF /* ApplePayPaymentCompleteDetails.h */,
     26546                                959CED1B279CB82E0017A8FF /* ApplePayPaymentCompleteDetails.idl */,
    2653026547                                A1DF5AA11F7EE1130058A477 /* ApplePayPaymentHandler.cpp */,
    2653126548                                A1DF5AA01F7EE1130058A477 /* ApplePayPaymentHandler.h */,
     
    2655126568                                A1F76B581F44D3B20014C318 /* PaymentComplete.h */,
    2655226569                                A1F76B5A1F44D3B20014C318 /* PaymentComplete.idl */,
     26570                                959CED0D279CB6850017A8FF /* PaymentCompleteDetails.h */,
     26571                                959CED0F279CB6850017A8FF /* PaymentCompleteDetails.idl */,
    2655326572                                A1F76B341F44C60F0014C318 /* PaymentCurrencyAmount.h */,
    2655426573                                A1F76B361F44C60F0014C318 /* PaymentCurrencyAmount.idl */,
     
    3339133410                                A12C59F02035FCAB0012236B /* ApplePayPaymentAuthorizationResult.h in Headers */,
    3339233411                                1A8A64521D19FCFB00D0E00F /* ApplePayPaymentAuthorizedEvent.h in Headers */,
     33412                                959CED1C279CB82F0017A8FF /* ApplePayPaymentCompleteDetails.h in Headers */,
    3339333413                                7C6522FB1E00C90900677F22 /* ApplePayPaymentContact.h in Headers */,
    3339433414                                A1DF5AA21F7EE1130058A477 /* ApplePayPaymentHandler.h in Headers */,
     
    3509135111                                A12C59FB20360B000012236B /* JSApplePayPaymentAuthorizationResult.h in Headers */,
    3509235112                                1AE96A8B1D1A0DDD00B86768 /* JSApplePayPaymentAuthorizedEvent.h in Headers */,
     35113                                959CED21279CB88B0017A8FF /* JSApplePayPaymentCompleteDetails.h in Headers */,
    3509335114                                7C6523161E00DBB500677F22 /* JSApplePayPaymentContact.h in Headers */,
    3509435115                                7C6523181E00DBB500677F22 /* JSApplePayPaymentMethod.h in Headers */,
     
    3555735578                                A1CC56671F46147A00A4555B /* JSPaymentAddress.h in Headers */,
    3555835579                                A1CC56691F46148000A4555B /* JSPaymentComplete.h in Headers */,
     35580                                959CED14279CB6B60017A8FF /* JSPaymentCompleteDetails.h in Headers */,
    3555935581                                A1CC566B1F46148500A4555B /* JSPaymentCurrencyAmount.h in Headers */,
    3556035582                                A1CC566D1F46148A00A4555B /* JSPaymentDetailsBase.h in Headers */,
     
    3644936471                                A1F76B431F44CF7F0014C318 /* PaymentAddress.h in Headers */,
    3645036472                                A169B043248F037B00EE8B7B /* PaymentAPIVersion.h in Headers */,
    36451                                 1AE96A881D1A0CEB00B86768 /* PaymentAuthorizationStatus.h in Headers */,
    3645236473                                A1F76B5B1F44D3B20014C318 /* PaymentComplete.h in Headers */,
     36474                                959CED10279CB6860017A8FF /* PaymentCompleteDetails.h in Headers */,
    3645336475                                1A8A643B1D19FC5300D0E00F /* PaymentContact.h in Headers */,
    3645436476                                1A58E86E1D19E42D00C0EA73 /* PaymentCoordinator.h in Headers */,
  • trunk/Source/WebCore/loader/EmptyClients.cpp

    r287684 r288698  
    427427    void completeCouponCodeChange(std::optional<ApplePayCouponCodeUpdate>&&) final { }
    428428#endif
    429     void completePaymentSession(std::optional<PaymentAuthorizationResult>&&) final { }
     429    void completePaymentSession(ApplePayPaymentAuthorizationResult&&) final { }
    430430    void cancelPaymentSession() final { }
    431431    void abortPaymentSession() final { }
  • trunk/Source/WebCore/testing/MockPaymentCoordinator.cpp

    r282464 r288698  
    3030
    3131#include "ApplePayCouponCodeUpdate.h"
     32#include "ApplePayPaymentAuthorizationResult.h"
    3233#include "ApplePayPaymentMethodUpdate.h"
    3334#include "ApplePaySessionPaymentRequest.h"
     
    249250}
    250251
    251 void MockPaymentCoordinator::completePaymentSession(std::optional<PaymentAuthorizationResult>&& result)
    252 {
    253     auto isFinalState = isFinalStateResult(result);
    254     m_errors = convert(WTFMove(result->errors));
     252void MockPaymentCoordinator::completePaymentSession(ApplePayPaymentAuthorizationResult&& result)
     253{
     254    auto isFinalState = result.isFinalState();
     255    m_errors = convert(WTFMove(result.errors));
    255256
    256257    if (!isFinalState)
  • trunk/Source/WebCore/testing/MockPaymentCoordinator.h

    r282464 r288698  
    108108    void completeCouponCodeChange(std::optional<ApplePayCouponCodeUpdate>&&) final;
    109109#endif
    110     void completePaymentSession(std::optional<PaymentAuthorizationResult>&&) final;
     110    void completePaymentSession(ApplePayPaymentAuthorizationResult&&) final;
    111111    void abortPaymentSession() final;
    112112    void cancelPaymentSession() final;
  • trunk/Source/WebKit/ChangeLog

    r288696 r288698  
     12022-01-27  Devin Rousso  <drousso@apple.com>
     2
     3        [Payment Request] allow additional payment method specific data to be passed to `complete()`
     4        https://bugs.webkit.org/show_bug.cgi?id=235415
     5        <rdar://problem/82970451>
     6
     7        Reviewed by Darin Adler.
     8
     9        This allows for developers/merchants to give additional details to Apple Pay on completion.
     10
     11        Issue: <https://github.com/w3c/payment-request/issues/981>
     12        Spec PR: <https://github.com/w3c/payment-request/pull/982>
     13
     14        * WebProcess/ApplePay/WebPaymentCoordinator.h:
     15        * WebProcess/ApplePay/WebPaymentCoordinator.cpp:
     16        (WebKit::WebPaymentCoordinator::completePaymentSession):
     17        * Scripts/webkit/messages.py:
     18        (headers_for_type):
     19        * Shared/WebCoreArgumentCoders.h:
     20        * Shared/Cocoa/WebCoreArgumentCodersCocoa.mm:
     21        (IPC::ArgumentCoder<WebCore::PaymentAuthorizationResult>::encode): Deleted.
     22        (IPC::ArgumentCoder<WebCore::PaymentAuthorizationResult>::decode): Deleted.
     23        * Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in:
     24        * Shared/ApplePay/WebPaymentCoordinatorProxy.h:
     25        * Shared/ApplePay/WebPaymentCoordinatorProxy.cpp:
     26        (WebKit::WebPaymentCoordinatorProxy::completePaymentSession):
     27        * Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm:
     28        (WebKit::WebPaymentCoordinatorProxy::platformCompletePaymentSession):
     29        * Shared/ApplePay/ios/WebPaymentCoordinatorProxyIOS.mm:
     30        * Platform/cocoa/PaymentAuthorizationPresenter.h:
     31        * Platform/cocoa/PaymentAuthorizationPresenter.mm:
     32        (WebKit::toPKPaymentAuthorizationStatus):
     33        (WebKit::PaymentAuthorizationPresenter::completePaymentSession):
     34        Replace `PaymentAuthorizationResult` with `ApplePayPaymentAuthorizationResult` so that data
     35        doesn't need to be moved between identically shaped structs for sending to the UIProcess.
     36
     37        * Platform/cocoa/WKPaymentAuthorizationDelegate.h:
     38        * Platform/cocoa/WKPaymentAuthorizationDelegate.mm:
     39        Add some WKA hooks.
     40
    1412022-01-27  Elliott Williams  <emw@apple.com>
    242
  • trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.h

    r283320 r288698  
    4444class PaymentSessionError;
    4545struct ApplePayCouponCodeUpdate;
     46struct ApplePayPaymentAuthorizationResult;
    4647struct ApplePayPaymentMethodUpdate;
    4748struct ApplePayShippingContactUpdate;
     
    7677    void completeMerchantValidation(const WebCore::PaymentMerchantSession&);
    7778    void completePaymentMethodSelection(std::optional<WebCore::ApplePayPaymentMethodUpdate>&&);
    78     void completePaymentSession(const std::optional<WebCore::PaymentAuthorizationResult>&);
     79    void completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&&);
    7980    void completeShippingContactSelection(std::optional<WebCore::ApplePayShippingContactUpdate>&&);
    8081    void completeShippingMethodSelection(std::optional<WebCore::ApplePayShippingMethodUpdate>&&);
  • trunk/Source/WebKit/Platform/cocoa/PaymentAuthorizationPresenter.mm

    r287660 r288698  
    3636#import <WebCore/ApplePayErrorCode.h>
    3737#import <WebCore/ApplePayErrorContactField.h>
     38#import <WebCore/ApplePayPaymentAuthorizationResult.h>
    3839#import <WebCore/ApplePayPaymentMethodUpdate.h>
    3940#import <WebCore/ApplePayShippingContactUpdate.h>
    4041#import <WebCore/ApplePayShippingMethodUpdate.h>
    41 #import <WebCore/PaymentAuthorizationStatus.h>
    4242#import <WebCore/PaymentMerchantSession.h>
    4343#import <WebCore/PaymentSummaryItems.h>
     
    6767// how to convert themselves to and from their platform representations.
    6868
    69 static PKPaymentAuthorizationStatus toPKPaymentAuthorizationStatus(WebCore::PaymentAuthorizationStatus status)
     69static PKPaymentAuthorizationStatus toPKPaymentAuthorizationStatus(WebCore::ApplePayPaymentAuthorizationResult::Status status)
    7070{
    7171    switch (status) {
    72     case WebCore::PaymentAuthorizationStatus::Success:
     72    case WebCore::ApplePayPaymentAuthorizationResult::Success:
    7373        return PKPaymentAuthorizationStatusSuccess;
    74     case WebCore::PaymentAuthorizationStatus::Failure:
     74
     75    case WebCore::ApplePayPaymentAuthorizationResult::Failure:
    7576        return PKPaymentAuthorizationStatusFailure;
    76     case WebCore::PaymentAuthorizationStatus::PINRequired:
     77
     78    case WebCore::ApplePayPaymentAuthorizationResult::PINRequired:
    7779        return PKPaymentAuthorizationStatusPINRequired;
    78     case WebCore::PaymentAuthorizationStatus::PINIncorrect:
     80
     81    case WebCore::ApplePayPaymentAuthorizationResult::PINIncorrect:
    7982        return PKPaymentAuthorizationStatusPINIncorrect;
    80     case WebCore::PaymentAuthorizationStatus::PINLockout:
     83
     84    case WebCore::ApplePayPaymentAuthorizationResult::PINLockout:
    8185        return PKPaymentAuthorizationStatusPINLockout;
     86
     87    default:
     88        ASSERT_NOT_REACHED();
     89        return PKPaymentAuthorizationStatusFailure;
    8290    }
    8391}
     
    232240}
    233241
    234 void PaymentAuthorizationPresenter::completePaymentSession(const std::optional<WebCore::PaymentAuthorizationResult>& result)
    235 {
    236     ASSERT(platformDelegate());
    237     auto status = result ? toPKPaymentAuthorizationStatus(result->status) : PKPaymentAuthorizationStatusSuccess;
    238     RetainPtr<NSArray> errors = result ? toNSErrors(result->errors) : @[ ];
     242void PaymentAuthorizationPresenter::completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&& result)
     243{
     244    ASSERT(platformDelegate());
     245    ASSERT(result.isFinalState());
     246
     247    auto status = toPKPaymentAuthorizationStatus(result.status);
     248    auto errors = toNSErrors(result.errors);
     249
     250#if defined(PaymentAuthorizationPresenterAdditions_completePaymentSession)
     251    PaymentAuthorizationPresenterAdditions_completePaymentSession
     252#endif
     253
    239254    [platformDelegate() completePaymentSession:status errors:errors.get()];
    240255}
  • trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.h

    r283320 r288698  
    6767- (void)invalidate;
    6868
     69#if USE(APPLE_INTERNAL_SDK)
     70#include <WebKitAdditions/WKPaymentAuthorizationDelegateAdditionsAfter.h>
     71#endif
     72
    6973@end
    7074
  • trunk/Source/WebKit/Platform/cocoa/WKPaymentAuthorizationDelegate.mm

    r285521 r288698  
    160160}
    161161
     162#if USE(APPLE_INTERNAL_SDK)
     163#include <WebKitAdditions/WKPaymentAuthorizationDelegateAdditionsAfter.mm>
     164#endif
     165
    162166@end
    163167
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r288416 r288698  
    809809        'WebCore::PasteboardURL': ['<WebCore/Pasteboard.h>'],
    810810        'WebCore::PasteboardWebContent': ['<WebCore/Pasteboard.h>'],
    811         'WebCore::PaymentAuthorizationResult': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
    812811        'WebCore::PixelFormat': ['<WebCore/ImageBufferBackend.h>'],
    813812        'WebCore::PlatformTextTrackData': ['<WebCore/PlatformTextTrack.h>'],
  • trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.cpp

    r284142 r288698  
    3535#include "WebProcessProxy.h"
    3636#include <WebCore/ApplePayCouponCodeUpdate.h>
     37#include <WebCore/ApplePayPaymentAuthorizationResult.h>
    3738#include <WebCore/ApplePayPaymentMethodUpdate.h>
    3839#include <WebCore/ApplePayShippingContactUpdate.h>
    3940#include <WebCore/ApplePayShippingMethodUpdate.h>
    40 #include <WebCore/PaymentAuthorizationStatus.h>
    4141
    4242#define MESSAGE_CHECK(assertion) MESSAGE_CHECK_BASE(assertion, messageSenderConnection())
     
    185185#endif // ENABLE(APPLE_PAY_COUPON_CODE)
    186186
    187 void WebPaymentCoordinatorProxy::completePaymentSession(const std::optional<WebCore::PaymentAuthorizationResult>& result)
     187void WebPaymentCoordinatorProxy::completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&& result)
    188188{
    189189    // It's possible that the payment has been canceled already.
     
    191191        return;
    192192
    193     bool isFinalStateResult = WebCore::isFinalStateResult(result);
    194 
    195     platformCompletePaymentSession(result);
    196 
    197     if (!isFinalStateResult) {
     193    bool isFinalState = result.isFinalState();
     194
     195    platformCompletePaymentSession(WTFMove(result));
     196
     197    if (!isFinalState) {
    198198        m_state = State::Active;
    199199        return;
  • trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.h

    r283320 r288698  
    4848
    4949namespace WebCore {
    50 enum class PaymentAuthorizationStatus;
    5150class Payment;
    5251class PaymentContact;
     
    140139    void completeCouponCodeChange(std::optional<WebCore::ApplePayCouponCodeUpdate>&&);
    141140#endif
    142     void completePaymentSession(const std::optional<WebCore::PaymentAuthorizationResult>&);
     141    void completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&&);
    143142    void abortPaymentSession();
    144143    void cancelPaymentSession();
     
    168167    void platformCompleteCouponCodeChange(std::optional<WebCore::ApplePayCouponCodeUpdate>&&);
    169168#endif
    170     void platformCompletePaymentSession(const std::optional<WebCore::PaymentAuthorizationResult>&);
     169    void platformCompletePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&&);
    171170    void platformHidePaymentUI();
    172171#if PLATFORM(COCOA)
  • trunk/Source/WebKit/Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in

    r283320 r288698  
    3939    CompleteCouponCodeChange(std::optional<WebCore::ApplePayCouponCodeUpdate> update)
    4040#endif
    41     CompletePaymentSession(std::optional<WebCore::PaymentAuthorizationResult> result)
     41    CompletePaymentSession(struct WebCore::ApplePayPaymentAuthorizationResult result)
    4242    AbortPaymentSession()
    4343    CancelPaymentSession()
  • trunk/Source/WebKit/Shared/ApplePay/cocoa/WebPaymentCoordinatorProxyCocoa.mm

    r285521 r288698  
    4242#import <WebCore/ApplePayShippingMethod.h>
    4343#import <WebCore/ApplePayShippingMethodUpdate.h>
    44 #import <WebCore/PaymentAuthorizationStatus.h>
    4544#import <WebCore/PaymentHeaders.h>
    4645#import <wtf/BlockPtr.h>
     
    349348}
    350349
    351 void WebPaymentCoordinatorProxy::platformCompletePaymentSession(const std::optional<WebCore::PaymentAuthorizationResult>& result)
    352 {
    353     m_authorizationPresenter->completePaymentSession(result);
     350void WebPaymentCoordinatorProxy::platformCompletePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&& result)
     351{
     352    m_authorizationPresenter->completePaymentSession(WTFMove(result));
    354353}
    355354
  • trunk/Source/WebKit/Shared/ApplePay/ios/WebPaymentCoordinatorProxyIOS.mm

    r284009 r288698  
    3333#import "WebPageProxy.h"
    3434#import <UIKit/UIViewController.h>
    35 #import <WebCore/PaymentAuthorizationStatus.h>
    3635#import <pal/cocoa/PassKitSoftLink.h>
    3736
  • trunk/Source/WebKit/Shared/Cocoa/WebCoreArgumentCodersCocoa.mm

    r288543 r288698  
    5959#if ENABLE(APPLE_PAY)
    6060#import "DataReference.h"
    61 #import <WebCore/PaymentAuthorizationStatus.h>
    6261#import <pal/cocoa/PassKitSoftLink.h>
    6362#endif
     
    125124
    126125    return WebCore::Payment { WTFMove(*payment) };
    127 }
    128 
    129 void ArgumentCoder<WebCore::PaymentAuthorizationResult>::encode(Encoder& encoder, const WebCore::PaymentAuthorizationResult& result)
    130 {
    131     encoder << result.status;
    132     encoder << result.errors;
    133 }
    134 
    135 std::optional<WebCore::PaymentAuthorizationResult> ArgumentCoder<WebCore::PaymentAuthorizationResult>::decode(Decoder& decoder)
    136 {
    137     std::optional<WebCore::PaymentAuthorizationStatus> status;
    138     decoder >> status;
    139     if (!status)
    140         return std::nullopt;
    141 
    142     std::optional<Vector<RefPtr<WebCore::ApplePayError>>> errors;
    143     decoder >> errors;
    144     if (!errors)
    145         return std::nullopt;
    146 
    147     return {{ WTFMove(*status), WTFMove(*errors) }};
    148126}
    149127
  • trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h

    r287496 r288698  
    646646};
    647647
    648 template<> struct ArgumentCoder<WebCore::PaymentAuthorizationResult> {
    649     static void encode(Encoder&, const WebCore::PaymentAuthorizationResult&);
    650     static std::optional<WebCore::PaymentAuthorizationResult> decode(Decoder&);
    651 };
    652 
    653648template<> struct ArgumentCoder<WebCore::PaymentContact> {
    654649    static void encode(Encoder&, const WebCore::PaymentContact&);
  • trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.cpp

    r283320 r288698  
    3838#include "WebProcess.h"
    3939#include <WebCore/ApplePayCouponCodeUpdate.h>
     40#include <WebCore/ApplePayPaymentAuthorizationResult.h>
    4041#include <WebCore/ApplePayPaymentMethodUpdate.h>
    4142#include <WebCore/ApplePayShippingContactUpdate.h>
     
    138139#endif // ENABLE(APPLE_PAY_COUPON_CODE)
    139140
    140 void WebPaymentCoordinator::completePaymentSession(std::optional<WebCore::PaymentAuthorizationResult>&& result)
    141 {
    142     send(Messages::WebPaymentCoordinatorProxy::CompletePaymentSession(result));
     141void WebPaymentCoordinator::completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&& result)
     142{
     143    send(Messages::WebPaymentCoordinatorProxy::CompletePaymentSession(WTFMove(result)));
    143144}
    144145
  • trunk/Source/WebKit/WebProcess/ApplePay/WebPaymentCoordinator.h

    r278712 r288698  
    7272    void completeCouponCodeChange(std::optional<WebCore::ApplePayCouponCodeUpdate>&&) override;
    7373#endif
    74     void completePaymentSession(std::optional<WebCore::PaymentAuthorizationResult>&&) override;
     74    void completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&&) override;
    7575
    7676    void abortPaymentSession() override;
  • trunk/Source/WebKitLegacy/mac/ChangeLog

    r288692 r288698  
     12022-01-27  Devin Rousso  <drousso@apple.com>
     2
     3        [Payment Request] allow additional payment method specific data to be passed to `complete()`
     4        https://bugs.webkit.org/show_bug.cgi?id=235415
     5        <rdar://problem/82970451>
     6
     7        Reviewed by Darin Adler.
     8
     9        * WebCoreSupport/WebPaymentCoordinatorClient.h:
     10        * WebCoreSupport/WebPaymentCoordinatorClient.mm:
     11        (WebPaymentCoordinatorClient::completePaymentSession):
     12
    1132022-01-27  Elliott Williams  <emw@apple.com>
    214
  • trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.h

    r278630 r288698  
    4949    void completeCouponCodeChange(std::optional<WebCore::ApplePayCouponCodeUpdate>&&) override;
    5050#endif
    51     void completePaymentSession(std::optional<WebCore::PaymentAuthorizationResult>&&) override;
     51    void completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&&) override;
    5252    void abortPaymentSession() override;
    5353    void cancelPaymentSession() override;
  • trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPaymentCoordinatorClient.mm

    r278630 r288698  
    9393#endif // ENABLE(APPLE_PAY_COUPON_CODE)
    9494
    95 void WebPaymentCoordinatorClient::completePaymentSession(std::optional<WebCore::PaymentAuthorizationResult>&&)
     95void WebPaymentCoordinatorClient::completePaymentSession(WebCore::ApplePayPaymentAuthorizationResult&&)
    9696{
    9797}
Note: See TracChangeset for help on using the changeset viewer.