onload callback for <track> element attached to <video> does not fire
[WebKit-https.git] / Source / WebCore / html / track / TextTrack.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  * Copyright (C) 2011, 2012 Apple Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef TextTrack_h
28 #define TextTrack_h
29
30 #if ENABLE(VIDEO_TRACK)
31
32 #include "ExceptionCode.h"
33 #include "TrackBase.h"
34 #include <wtf/PassOwnPtr.h>
35 #include <wtf/RefCounted.h>
36 #include <wtf/text/WTFString.h>
37
38 namespace WebCore {
39
40 class HTMLMediaElement;
41 class TextTrack;
42 class TextTrackCue;
43 class TextTrackCueList;
44
45 class TextTrackClient {
46 public:
47     virtual ~TextTrackClient() { }
48     virtual void textTrackKindChanged(TextTrack*) = 0;
49     virtual void textTrackModeChanged(TextTrack*) = 0;
50     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) = 0;
51     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) = 0;
52     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
53     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
54 };
55
56 class TextTrack : public TrackBase {
57 public:
58     static PassRefPtr<TextTrack> create(ScriptExecutionContext* context, TextTrackClient* client, const AtomicString& kind, const AtomicString& label, const AtomicString& language)
59     {
60         return adoptRef(new TextTrack(context, client, kind, label, language, AddTrack));
61     }
62     virtual ~TextTrack();
63
64     void setMediaElement(HTMLMediaElement* element) { m_mediaElement = element; }
65     HTMLMediaElement* mediaElement() { return m_mediaElement; }
66
67     AtomicString kind() const { return m_kind; }
68     void setKind(const AtomicString&);
69
70     static const AtomicString& subtitlesKeyword();
71     static const AtomicString& captionsKeyword();
72     static const AtomicString& descriptionsKeyword();
73     static const AtomicString& chaptersKeyword();
74     static const AtomicString& metadataKeyword();
75     static bool isValidKindKeyword(const AtomicString&);
76
77     AtomicString label() const { return m_label; }
78     void setLabel(const AtomicString& label) { m_label = label; }
79
80     AtomicString language() const { return m_language; }
81     void setLanguage(const AtomicString& language) { m_language = language; }
82
83     static const AtomicString& disabledKeyword();
84     static const AtomicString& hiddenKeyword();
85     static const AtomicString& showingKeyword();
86
87     virtual AtomicString mode() const;
88     virtual void setMode(const AtomicString&);
89
90     bool showingByDefault() const { return m_showingByDefault; }
91     void setShowingByDefault(bool showing) { m_showingByDefault = showing; }
92
93     enum ReadinessState { NotLoaded = 0, Loading = 1, Loaded = 2, FailedToLoad = 3 };
94     ReadinessState readinessState() const { return m_readinessState; }
95     void setReadinessState(ReadinessState state) { m_readinessState = state; }
96
97     TextTrackCueList* cues();
98     TextTrackCueList* activeCues() const;
99
100     void clearClient() { m_client = 0; }
101     TextTrackClient* client() { return m_client; }
102
103     void addCue(PassRefPtr<TextTrackCue>);
104     void removeCue(TextTrackCue*, ExceptionCode&);
105
106     void cueWillChange(TextTrackCue*);
107     void cueDidChange(TextTrackCue*);
108
109     DEFINE_ATTRIBUTE_EVENT_LISTENER(cuechange);
110
111     enum TextTrackType { TrackElement, AddTrack, InBand };
112     TextTrackType trackType() const { return m_trackType; }
113
114     int trackIndex();
115     void invalidateTrackIndex();
116
117     bool isRendered();
118     int trackIndexRelativeToRenderedTracks();
119
120     bool hasBeenConfigured() const { return m_hasBeenConfigured; }
121     void setHasBeenConfigured(bool flag) { m_hasBeenConfigured = flag; }
122
123     virtual bool isDefault() const { return false; }
124     virtual void setIsDefault(bool) { }
125
126     void removeAllCues();
127
128 protected:
129     TextTrack(ScriptExecutionContext*, TextTrackClient*, const AtomicString& kind, const AtomicString& label, const AtomicString& language, TextTrackType);
130
131     RefPtr<TextTrackCueList> m_cues;
132
133 private:
134     TextTrackCueList* ensureTextTrackCueList();
135     HTMLMediaElement* m_mediaElement;
136     AtomicString m_kind;
137     AtomicString m_label;
138     AtomicString m_language;
139     AtomicString m_mode;
140     TextTrackClient* m_client;
141     TextTrackType m_trackType;
142     ReadinessState m_readinessState;
143     int m_trackIndex;
144     int m_renderedTrackIndex;
145     bool m_showingByDefault;
146     bool m_hasBeenConfigured;
147 };
148
149 } // namespace WebCore
150
151 #endif
152 #endif