/*
 * 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 COMPUTER, 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 COMPUTER, 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. 
 */

[
    Conditional=VIDEO_TRACK,
    V8EnabledAtRuntime=webkitVideoTrack,
    Constructor(in double startTime, in double endTime, in DOMString text),
    CallWith=ScriptExecutionContext,
    EventTarget,
    ImplementationLacksVTable
] interface TextTrackCue {
    readonly attribute TextTrack track;

    attribute DOMString id;
    attribute double startTime
        setter raises (DOMException);
    attribute double endTime
        setter raises (DOMException);
    attribute boolean pauseOnExit;

    attribute DOMString vertical
        setter raises (DOMException);
    attribute boolean snapToLines;
    attribute long line
        setter raises (DOMException);
    attribute long position
        setter raises (DOMException);
    attribute long size
        setter raises (DOMException);
    attribute DOMString align
        setter raises (DOMException);

    attribute DOMString text;
    DocumentFragment getCueAsHTML();

    attribute EventListener onenter;
    attribute EventListener onexit;

    // EventTarget interface
    void addEventListener(in DOMString type, 
                          in EventListener listener, 
                          in [Optional] boolean useCapture);
    void removeEventListener(in DOMString type, 
                             in EventListener listener, 
                             in [Optional] boolean useCapture);
    boolean dispatchEvent(in Event evt)
        raises(EventException);

#if defined(ENABLE_WEBVTT_REGIONS) && ENABLE_WEBVTT_REGIONS
    attribute DOMString regionId;
#endif
};

