// 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,
 Constructor(DOMString type, MediaKeyMessageEventInit eventInitDict)]
interface MediaKeyMessageEvent : Event {
    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,
 Constructor(DOMString type, optional MediaEncryptedEventInit eventInitDict)]
interface MediaEncryptedEvent : Event {
    readonly attribute DOMString    initDataType;
    readonly attribute ArrayBuffer? initData;
};

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