#pragma once
#if ENABLE(APPLE_PAY)
#include "ActiveDOMObject.h"
#include "ApplePayPaymentRequest.h"
#include "EventTarget.h"
#include "ExceptionOr.h"
#include "PaymentSession.h"
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
namespace JSC {
class ExecState;
class JSValue;
}
namespace WebCore {
class DeferredPromise;
class Document;
class Payment;
class PaymentContact;
class PaymentCoordinator;
class PaymentMethod;
class URL;
enum class PaymentAuthorizationStatus;
struct ApplePayLineItem;
struct ApplePayPaymentRequest;
struct ApplePayShippingMethod;
struct ApplePayPaymentAuthorizationResult;
struct ApplePayPaymentMethodUpdate;
struct ApplePayShippingContactUpdate;
struct ApplePayShippingMethodUpdate;
class ApplePaySession final : public PaymentSession, public ActiveDOMObject, public EventTargetWithInlineData {
public:
static ExceptionOr<Ref<ApplePaySession>> create(Document&, unsigned version, ApplePayPaymentRequest&&);
virtual ~ApplePaySession();
static const unsigned short STATUS_SUCCESS = 0;
static const unsigned short STATUS_FAILURE = 1;
static const unsigned short STATUS_INVALID_BILLING_POSTAL_ADDRESS = 2;
static const unsigned short STATUS_INVALID_SHIPPING_POSTAL_ADDRESS = 3;
static const unsigned short STATUS_INVALID_SHIPPING_CONTACT = 4;
static const unsigned short STATUS_PIN_REQUIRED = 5;
static const unsigned short STATUS_PIN_INCORRECT = 6;
static const unsigned short STATUS_PIN_LOCKOUT = 7;
static ExceptionOr<bool> supportsVersion(ScriptExecutionContext&, unsigned version);
static ExceptionOr<bool> canMakePayments(ScriptExecutionContext&);
static ExceptionOr<void> canMakePaymentsWithActiveCard(ScriptExecutionContext&, const String& merchantIdentifier, Ref<DeferredPromise>&&);
static ExceptionOr<void> openPaymentSetup(ScriptExecutionContext&, const String& merchantIdentifier, Ref<DeferredPromise>&&);
ExceptionOr<void> begin();
ExceptionOr<void> abort();
ExceptionOr<void> completeMerchantValidation(JSC::ExecState&, JSC::JSValue merchantSession);
ExceptionOr<void> completeShippingMethodSelection(ApplePayShippingMethodUpdate&&);
ExceptionOr<void> completeShippingContactSelection(ApplePayShippingContactUpdate&&);
ExceptionOr<void> completePaymentMethodSelection(ApplePayPaymentMethodUpdate&&);
ExceptionOr<void> completePayment(ApplePayPaymentAuthorizationResult&&);
ExceptionOr<void> completeShippingMethodSelection(unsigned short status, ApplePayLineItem&& newTotal, Vector<ApplePayLineItem>&& newLineItems);
ExceptionOr<void> completeShippingContactSelection(unsigned short status, Vector<ApplePayShippingMethod>&& newShippingMethods, ApplePayLineItem&& newTotal, Vector<ApplePayLineItem>&& newLineItems);
ExceptionOr<void> completePaymentMethodSelection(ApplePayLineItem&& newTotal, Vector<ApplePayLineItem>&& newLineItems);
ExceptionOr<void> completePayment(unsigned short status);
const ApplePaySessionPaymentRequest& paymentRequest() const { return m_paymentRequest; }
using PaymentSession::ref;
using PaymentSession::deref;
private:
ApplePaySession(Document&, unsigned version, ApplePaySessionPaymentRequest&&);
const char* activeDOMObjectName() const override;
bool canSuspendForDocumentSuspension() const override;
void stop() override;
EventTargetInterface eventTargetInterface() const override { return ApplePaySessionEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
void refEventTarget() override { ref(); }
void derefEventTarget() override { deref(); }
unsigned version() const override;
void validateMerchant(const URL&) override;
void didAuthorizePayment(const Payment&) override;
void didSelectShippingMethod(const ApplePaySessionPaymentRequest::ShippingMethod&) override;
void didSelectShippingContact(const PaymentContact&) override;
void didSelectPaymentMethod(const PaymentMethod&) override;
void didCancelPaymentSession() override;
PaymentCoordinator& paymentCoordinator() const;
bool canBegin() const;
bool canAbort() const;
bool canCancel() const;
bool canCompleteMerchantValidation() const;
bool canCompleteShippingMethodSelection() const;
bool canCompleteShippingContactSelection() const;
bool canCompletePaymentMethodSelection() const;
bool canCompletePayment() const;
bool isFinalState() const;
void didReachFinalState();
enum class State {
Idle,
Active,
ShippingMethodSelected,
ShippingContactSelected,
PaymentMethodSelected,
CancelRequested,
Authorized,
Completed,
Aborted,
Canceled,
} m_state { State::Idle };
enum class MerchantValidationState {
Idle,
ValidatingMerchant,
ValidationComplete,
} m_merchantValidationState { MerchantValidationState::Idle };
const ApplePaySessionPaymentRequest m_paymentRequest;
unsigned m_version;
};
}
#endif