# Copyright (C) 2015-2019 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.
#/

#if ENABLE(APPLE_PAY)

messages -> WebPaymentCoordinatorProxy NotRefCounted {

    CanMakePayments() -> (bool result) Synchronous
    CanMakePaymentsWithActiveCard(String merchantIdentifier, String domainName) -> (bool canMakePayments) Async
    OpenPaymentSetup(String merchantIdentifier, String domainName) -> (bool result) Async

    ShowPaymentUI(WebCore::PageIdentifier destinationID, WebKit::WebPageProxyIdentifier webPageProxyIdentifier, String originatingURLString, Vector<String> linkIconURLStrings, WebCore::ApplePaySessionPaymentRequest paymentRequest) -> (bool result) Synchronous
    CompleteMerchantValidation(WebCore::PaymentMerchantSession paymentMerchantSession)
    CompleteShippingMethodSelection(std::optional<WebCore::ApplePayShippingMethodUpdate> update)
    CompleteShippingContactSelection(std::optional<WebCore::ApplePayShippingContactUpdate> update)
    CompletePaymentMethodSelection(std::optional<WebCore::ApplePayPaymentMethodUpdate> update)
#if ENABLE(APPLE_PAY_COUPON_CODE)
    CompleteCouponCodeChange(std::optional<WebCore::ApplePayCouponCodeUpdate> update)
#endif
    CompletePaymentSession(std::optional<WebCore::PaymentAuthorizationResult> result)
    AbortPaymentSession()
    CancelPaymentSession()

    GetSetupFeatures(WebKit::PaymentSetupConfiguration configuration) -> (WebKit::PaymentSetupFeatures features) Async
    BeginApplePaySetup(WebKit::PaymentSetupConfiguration configuration, WebKit::PaymentSetupFeatures features) -> (bool result) Async
    EndApplePaySetup()
}

#endif
