/*
 * Copyright (C) 2011 Google 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. 
 */

enum TextTrackMode { "disabled", "hidden", "showing" };
enum TextTrackKind { "subtitles", "captions", "descriptions", "chapters", "metadata", "forced" };

[
    Conditional=VIDEO,
    ExportToWrappedFunction,
    GenerateIsReachable=ImplElementRoot,
    JSCustomMarkFunction,
    SkipVTableValidation,
] interface TextTrack : EventTarget {
    readonly attribute DOMString id;
    [ImplementedAs=kindForBindings] attribute TextTrackKind kind;
    readonly attribute DOMString label;
    [ConditionallyReadWrite=MEDIA_SOURCE] attribute DOMString language;
    readonly attribute DOMString inBandMetadataTrackDispatchType;

    attribute TextTrackMode mode;

    readonly attribute TextTrackCueList? cues;
    readonly attribute TextTrackCueList? activeCues;

    [MayThrowException] void addCue(TextTrackCue cue);
    [MayThrowException] void removeCue(TextTrackCue cue);

    attribute EventHandler oncuechange;

    readonly attribute VTTRegionList regions;
    void addRegion(VTTRegion region);
    [MayThrowException] void removeRegion(VTTRegion region);
};
