// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into reffy-reports
// (https://github.com/tidoust/reffy-reports)
// Source: Encrypted Media Extensions (https://w3c.github.io/encrypted-media/)

[Exposed=Window]
partial interface Navigator {
    [SecureContext] Promise<MediaKeySystemAccess> requestMediaKeySystemAccess (DOMString keySystem, sequence<MediaKeySystemConfiguration> supportedConfigurations);
};

enum MediaKeysRequirement {
    "required",
    "optional",
    "not-allowed"
};

dictionary MediaKeySystemConfiguration {
             DOMString                               label = "";
             sequence<DOMString>                     initDataTypes = [];
             sequence<MediaKeySystemMediaCapability> audioCapabilities = [];
             sequence<MediaKeySystemMediaCapability> videoCapabilities = [];
             MediaKeysRequirement                    distinctiveIdentifier = "optional";
             MediaKeysRequirement                    persistentState = "optional";
             sequence<DOMString>                     sessionTypes;
};

dictionary MediaKeySystemMediaCapability {
             DOMString contentType = "";
             DOMString robustness = "";
};

[Exposed=Window, SecureContext] interface MediaKeySystemAccess {
    readonly        attribute DOMString keySystem;
    MediaKeySystemConfiguration getConfiguration ();
    Promise<MediaKeys>          createMediaKeys ();
};

enum MediaKeySessionType {
    "temporary",
    "persistent-license"
};

[Exposed=Window, SecureContext] interface MediaKeys {
    MediaKeySession  createSession (optional MediaKeySessionType sessionType = "temporary");
    Promise<boolean> setServerCertificate (BufferSource serverCertificate);
};

[Exposed=Window, SecureContext] interface MediaKeySession : EventTarget {
    readonly        attribute DOMString           sessionId;
    readonly        attribute unrestricted double expiration;
    readonly        attribute Promise<void>       closed;
    readonly        attribute MediaKeyStatusMap   keyStatuses;
                    attribute EventHandler        onkeystatuseschange;
                    attribute EventHandler        onmessage;
    Promise<void>    generateRequest (DOMString initDataType, BufferSource initData);
    Promise<boolean> load (DOMString sessionId);
    Promise<void>    update (BufferSource response);
    Promise<void>    close ();
    Promise<void>    remove ();
};

[Exposed=Window, SecureContext] interface MediaKeyStatusMap {
    iterable<BufferSource,MediaKeyStatus>;
    readonly        attribute unsigned long size;
    boolean has (BufferSource keyId);
    any     get (BufferSource keyId);
};

enum MediaKeyStatus {
    "usable",
    "expired",
    "released",
    "output-restricted",
    "output-downscaled",
    "status-pending",
    "internal-error"
};

enum MediaKeyMessageType {
    "license-request",
    "license-renewal",
    "license-release",
    "individualization-request"
};

[Exposed=Window, SecureContext]
interface MediaKeyMessageEvent : Event {
    constructor(DOMString type, MediaKeyMessageEventInit eventInitDict);
    readonly        attribute MediaKeyMessageType messageType;
    readonly        attribute ArrayBuffer         message;
};

dictionary MediaKeyMessageEventInit : EventInit {
             required MediaKeyMessageType messageType;
             required ArrayBuffer         message;
};

[Exposed=Window] partial interface HTMLMediaElement {
    [SecureContext] readonly        attribute MediaKeys?   mediaKeys;
                                    attribute EventHandler onencrypted;
                                    attribute EventHandler onwaitingforkey;
    [SecureContext] Promise<void> setMediaKeys (MediaKeys? mediaKeys);
};

[Exposed=Window]
interface MediaEncryptedEvent : Event {
    constructor(DOMString type, optional MediaEncryptedEventInit eventInitDict = {});
    readonly        attribute DOMString    initDataType;
    readonly        attribute ArrayBuffer? initData;
};

dictionary MediaEncryptedEventInit : EventInit {
             DOMString    initDataType = "";
             ArrayBuffer? initData = null;
};
