/*
 * Copyright (C) 2007, 2010, 2011, 2012 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */


typedef (
#if defined(ENABLE_MEDIA_STREAM) && ENABLE_MEDIA_STREAM
    MediaStream or
#endif
#if defined(ENABLE_MEDIA_SOURCE) && ENABLE_MEDIA_SOURCE
    MediaSource or
#endif
    Blob) MediaProvider;

[
    ActiveDOMObject,
    Conditional=VIDEO,
    ExportMacro=WEBCORE_EXPORT,
    JSGenerateToNativeObject,
] interface HTMLMediaElement : HTMLElement {

    // error state
    readonly attribute MediaError error;

    // network state
    [Reflect, URL] attribute USVString src;
    attribute MediaProvider? srcObject;
    [URL] readonly attribute USVString currentSrc;
    attribute DOMString? crossOrigin;

    const unsigned short NETWORK_EMPTY = 0;
    const unsigned short NETWORK_IDLE = 1;
    const unsigned short NETWORK_LOADING = 2;
    const unsigned short NETWORK_NO_SOURCE = 3;
    readonly attribute unsigned short networkState;
    attribute DOMString preload;

    readonly attribute TimeRanges buffered;
    void load();

    DOMString canPlayType(DOMString type);

    // ready state
    const unsigned short HAVE_NOTHING = 0;
    const unsigned short HAVE_METADATA = 1;
    const unsigned short HAVE_CURRENT_DATA = 2;
    const unsigned short HAVE_FUTURE_DATA = 3;
    const unsigned short HAVE_ENOUGH_DATA = 4;
    readonly attribute unsigned short readyState;
    readonly attribute boolean seeking;

    // playback state
    [ImplementedAs=currentTimeForBindings] attribute unrestricted double currentTime;
    readonly attribute unrestricted double duration;
    Date getStartDate();
    readonly attribute boolean paused;
    attribute unrestricted double defaultPlaybackRate;
    attribute unrestricted double playbackRate;
    readonly attribute TimeRanges played;
    readonly attribute TimeRanges seekable;
    readonly attribute boolean ended;
    [Reflect] attribute boolean autoplay;
    [Reflect] attribute boolean loop;
    Promise<void> play();
    void pause();
    void fastSeek(unrestricted double time);

    // controls
    attribute boolean controls;
    attribute double volume;
    attribute boolean muted;
    [Reflect=muted] attribute boolean defaultMuted;

    // WebKit extensions
    attribute boolean webkitPreservesPitch;

    readonly attribute boolean webkitHasClosedCaptions;
    attribute boolean webkitClosedCaptionsVisible;

    // The number of bytes consumed by the media decoder.
    [Conditional=MEDIA_STATISTICS] readonly attribute unsigned long webkitAudioDecodedByteCount;
    [Conditional=MEDIA_STATISTICS] readonly attribute unsigned long webkitVideoDecodedByteCount;

    [Conditional=LEGACY_ENCRYPTED_MEDIA, EnabledAtRuntime=LegacyEncryptedMediaAPI] readonly attribute WebKitMediaKeys webkitKeys;
    [Conditional=LEGACY_ENCRYPTED_MEDIA, EnabledAtRuntime=LegacyEncryptedMediaAPI] void webkitSetMediaKeys(WebKitMediaKeys? mediaKeys);
    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] readonly attribute MediaKeys mediaKeys;
    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] attribute EventHandler onencrypted;
    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] attribute EventHandler onwaitingforkey;
    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] Promise<void> setMediaKeys(MediaKeys? mediaKeys);

    [Conditional=VIDEO_TRACK, MayThrowException] TextTrack addTextTrack(DOMString kind, optional DOMString label = "", optional DOMString language = "");
    [Conditional=VIDEO_TRACK] readonly attribute AudioTrackList audioTracks;
    [Conditional=VIDEO_TRACK] readonly attribute TextTrackList textTracks;
    [Conditional=VIDEO_TRACK] readonly attribute VideoTrackList videoTracks;

    [Reflect] attribute DOMString mediaGroup;

    [ImplementedAs=controllerForBindings] attribute MediaController? controller;

    [Conditional=MEDIA_SOURCE] VideoPlaybackQuality getVideoPlaybackQuality();

    [Conditional=WIRELESS_PLAYBACK_TARGET] void webkitShowPlaybackTargetPicker();
    [Conditional=WIRELESS_PLAYBACK_TARGET] readonly attribute boolean webkitCurrentPlaybackTargetIsWireless;
};
