// Encrypted Media Extensions WebIDL
//
// NOTE: Please update the link below to the specification version from
//       which this IDL was extracted.
//
// https://www.w3.org/TR/2016/WD-encrypted-media-20160610/
//

partial interface Navigator {
    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 = "";
};

interface MediaKeySystemAccess {
    readonly        attribute DOMString keySystem;
    MediaKeySystemConfiguration getConfiguration ();
    Promise<MediaKeys>          createMediaKeys ();
};

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

interface MediaKeys {
    MediaKeySession  createSession (optional MediaKeySessionType sessionType = "temporary");
    Promise<boolean> setServerCertificate (BufferSource serverCertificate);
};

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 ();
};

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"
};

[ Constructor (DOMString type, optional MediaKeyMessageEventInit eventInitDict)]
interface MediaKeyMessageEvent : Event {
    readonly        attribute MediaKeyMessageType messageType;
    readonly        attribute ArrayBuffer         message;
};

dictionary MediaKeyMessageEventInit : EventInit {
             MediaKeyMessageType messageType = "license-request";
             ArrayBuffer         message;
};

// partial interface HTMLMediaElement : EventTarget {
partial interface HTMLMediaElement {
    readonly        attribute MediaKeys?   mediaKeys;
                    attribute EventHandler onencrypted;
                    attribute EventHandler onwaitingforkey;
    Promise<void> setMediaKeys (MediaKeys? mediaKeys);
};

[ 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;
};

