// 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/
//  + commit 5499821932391ae2c2e53756ae7ab9fae89d5863
//

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, MediaKeyMessageEventInit eventInitDict)]
interface MediaKeyMessageEvent : Event {
    readonly        attribute MediaKeyMessageType messageType;
    readonly        attribute ArrayBuffer         message;
};

dictionary MediaKeyMessageEventInit : EventInit {
             required MediaKeyMessageType messageType;
             required 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;
};

