/*
 * 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_TRACK,
    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;
    // FIXME: region parameter should not be nullable in addRegion and removeRegion.
    void addRegion(VTTRegion? region);
    [MayThrowException] void removeRegion(VTTRegion? region);
};
