[SecureContext,
 Exposed=(Window,Worker)]
interface PaymentManager {
    [SameObject]
    readonly attribute PaymentInstruments instruments;
    [Exposed=Window] static Promise<PermissionState> requestPermission();
};
[SecureContext,
 Exposed=(Window,Worker)]
interface PaymentInstruments {
    Promise<boolean>             delete(DOMString instrumentKey);
    Promise<PaymentInstrument>   get(DOMString instrumentKey);
    Promise<sequence<DOMString>> keys();
    Promise<boolean>             has(DOMString instrumentKey);
    Promise<void>                set(DOMString instrumentKey,
                                     PaymentInstrument details);
    Promise<void>                clear();
};
dictionary PaymentInstrument {
    required DOMString             name;
             sequence<ImageObject> icons;
             sequence<DOMString>   enabledMethods;
             object                capabilities;
};
dictionary ImageObject {
    required USVString src;
             DOMString sizes;
             DOMString type;
};
[Constructor(DOMString type, CanMakePaymentEventInit eventInitDict),
 Exposed=ServiceWorker]
interface CanMakePaymentEvent : ExtendableEvent {
    readonly attribute USVString                           topLevelOrigin;
    readonly attribute USVString                           paymentRequestOrigin;
    readonly attribute FrozenArray<PaymentMethodData>      methodData;
    readonly attribute FrozenArray<PaymentDetailsModifier> modifiers;
    void respondWith(Promise<boolean> canMakePaymentResponse);
};
dictionary CanMakePaymentEventInit : ExtendableEventInit {
    USVString                        topLevelOrigin;
    USVString                        paymentRequestOrigin;
    sequence<PaymentMethodData>      methodData;
    sequence<PaymentDetailsModifier> modifiers;
};
[Constructor(DOMString type, PaymentRequestEventInit eventInitDict),
 Exposed=ServiceWorker]
interface PaymentRequestEvent : ExtendableEvent {
    readonly attribute USVString                           topLevelOrigin;
    readonly attribute USVString                           paymentRequestOrigin;
    readonly attribute DOMString                           paymentRequestId;
    readonly attribute FrozenArray<PaymentMethodData>      methodData;
    readonly attribute object                              total;
    readonly attribute FrozenArray<PaymentDetailsModifier> modifiers;
    readonly attribute DOMString                           instrumentKey;
    Promise<WindowClient?> openWindow(USVString url);
    void                   respondWith(Promise<PaymentHandlerResponse> handlerResponse);
};
dictionary PaymentRequestEventInit : ExtendableEventInit {
    USVString                        topLevelOrigin;
    USVString                        paymentRequestOrigin;
    DOMString                        paymentRequestId;
    sequence<PaymentMethodData>      methodData;
    PaymentCurrencyAmount            total;
    sequence<PaymentDetailsModifier> modifiers;
    DOMString                        instrumentKey;
};
dictionary PaymentHandlerResponse {
    DOMString methodName;
    object    details;
};
