Not all subtitle tracks are SDH
[WebKit-https.git] / Source / WebCore / html / track / TextTrack.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  * Copyright (C) 2011, 2012, 2013 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 "TextTrackCue.h"
34 #include "TrackBase.h"
35 #include <wtf/PassOwnPtr.h>
36 #include <wtf/RefCounted.h>
37 #include <wtf/text/WTFString.h>
38
39 #if USE(PLATFORM_TEXT_TRACK_MENU)
40 #include "PlatformTextTrack.h"
41 #endif
42
43 namespace WebCore {
44
45 class ScriptExecutionContext;
46 class TextTrack;
47 class TextTrackCueList;
48 #if ENABLE(WEBVTT_REGIONS)
49 class TextTrackRegion;
50 class TextTrackRegionList;
51 #endif
52
53 class TextTrackClient {
54 public:
55     virtual ~TextTrackClient() { }
56     virtual void textTrackKindChanged(TextTrack*) = 0;
57     virtual void textTrackModeChanged(TextTrack*) = 0;
58     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) = 0;
59     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) = 0;
60     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
61     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
62 };
63
64 class TextTrack : public TrackBase, public EventTarget
65 #if USE(PLATFORM_TEXT_TRACK_MENU)
66     , public PlatformTextTrackClient
67 #endif
68     {
69 public:
70     static PassRefPtr<TextTrack> create(ScriptExecutionContext* context, TextTrackClient* client, const AtomicString& kind, const AtomicString& label, const AtomicString& language)
71     {
72         return adoptRef(new TextTrack(context, client, kind, label, language, AddTrack));
73     }
74     virtual ~TextTrack();
75
76     virtual const AtomicString& interfaceName() const;
77     virtual ScriptExecutionContext* scriptExecutionContext() const;
78
79     static TextTrack* captionMenuOffItem();
80     static TextTrack* captionMenuAutomaticItem();
81
82     static const AtomicString& subtitlesKeyword();
83     static const AtomicString& captionsKeyword();
84     static const AtomicString& descriptionsKeyword();
85     static const AtomicString& chaptersKeyword();
86     static const AtomicString& metadataKeyword();
87     static const AtomicString& forcedKeyword();
88     virtual const AtomicString& defaultKindKeyword() const OVERRIDE { return subtitlesKeyword(); }
89     static bool isValidKindKeyword(const AtomicString&);
90
91     static const AtomicString& disabledKeyword();
92     static const AtomicString& hiddenKeyword();
93     static const AtomicString& showingKeyword();
94
95     virtual void setKind(const AtomicString&) OVERRIDE;
96
97     AtomicString mode() const { return m_mode; }
98     virtual void setMode(const AtomicString&);
99
100     enum ReadinessState { NotLoaded = 0, Loading = 1, Loaded = 2, FailedToLoad = 3 };
101     ReadinessState readinessState() const { return m_readinessState; }
102     void setReadinessState(ReadinessState state) { m_readinessState = state; }
103
104     TextTrackCueList* cues();
105     TextTrackCueList* activeCues() const;
106
107     virtual void clearClient() OVERRIDE { m_client = 0; }
108     TextTrackClient* client() { return m_client; }
109
110     void addCue(PassRefPtr<TextTrackCue>);
111     virtual void removeCue(TextTrackCue*, ExceptionCode&);
112
113     bool hasCue(TextTrackCue*, TextTrackCue::CueMatchRules = TextTrackCue::MatchAllFields);
114
115 #if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS)
116     TextTrackRegionList* regions();
117     void addRegion(PassRefPtr<TextTrackRegion>);
118     void removeRegion(TextTrackRegion*, ExceptionCode&);
119 #endif
120
121     void cueWillChange(TextTrackCue*);
122     void cueDidChange(TextTrackCue*);
123
124     DEFINE_ATTRIBUTE_EVENT_LISTENER(cuechange);
125
126     enum TextTrackType { TrackElement, AddTrack, InBand };
127     TextTrackType trackType() const { return m_trackType; }
128
129     virtual bool isClosedCaptions() const { return false; }
130     virtual bool isSDH() const { return false; }
131     virtual bool containsOnlyForcedSubtitles() const { return false; }
132     virtual bool isMainProgramContent() const;
133     virtual bool isEasyToRead() const { return false; }
134
135     int trackIndex();
136     void invalidateTrackIndex();
137
138     bool isRendered();
139     int trackIndexRelativeToRenderedTracks();
140
141     bool hasBeenConfigured() const { return m_hasBeenConfigured; }
142     void setHasBeenConfigured(bool flag) { m_hasBeenConfigured = flag; }
143
144     virtual bool isDefault() const { return false; }
145     virtual void setIsDefault(bool) { }
146
147     void removeAllCues();
148
149 #if USE(PLATFORM_TEXT_TRACK_MENU)
150     PassRefPtr<PlatformTextTrack> platformTextTrack();
151 #endif
152
153     using RefCounted<TrackBase>::ref;
154     using RefCounted<TrackBase>::deref;
155
156 protected:
157     TextTrack(ScriptExecutionContext*, TextTrackClient*, const AtomicString& kind, const AtomicString& label, const AtomicString& language, TextTrackType);
158 #if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS)
159     TextTrackRegionList* regionList();
160 #endif
161
162     virtual EventTargetData* eventTargetData() OVERRIDE;
163     virtual EventTargetData* ensureEventTargetData() OVERRIDE;
164
165     RefPtr<TextTrackCueList> m_cues;
166
167 private:
168     virtual bool isValidKind(const AtomicString&) const OVERRIDE;
169
170     virtual void refEventTarget() OVERRIDE { ref(); }
171     virtual void derefEventTarget() OVERRIDE { deref(); }
172
173 #if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS)
174     TextTrackRegionList* ensureTextTrackRegionList();
175     RefPtr<TextTrackRegionList> m_regions;
176 #endif
177
178 #if USE(PLATFORM_TEXT_TRACK_MENU)
179     virtual TextTrack* publicTrack() OVERRIDE { return this; }
180
181     RefPtr<PlatformTextTrack> m_platformTextTrack;
182 #endif
183
184     TextTrackCueList* ensureTextTrackCueList();
185
186     ScriptExecutionContext* m_scriptExecutionContext;
187     EventTargetData m_eventTargetData;
188     AtomicString m_mode;
189     TextTrackClient* m_client;
190     TextTrackType m_trackType;
191     ReadinessState m_readinessState;
192     int m_trackIndex;
193     int m_renderedTrackIndex;
194     bool m_hasBeenConfigured;
195 };
196
197 inline TextTrack* toTextTrack(TrackBase* track)
198 {
199     ASSERT(track->type() == TrackBase::TextTrack);
200     return static_cast<TextTrack*>(track);
201 }
202
203 } // namespace WebCore
204
205 #endif
206 #endif