8454eacac48d4f50c17cdc4ead01a97cb78d6bd2
[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, 2014 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 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 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 "VTTCue.h"
36 #include <wtf/RefCounted.h>
37 #include <wtf/text/WTFString.h>
38
39 namespace WebCore {
40
41 class ScriptExecutionContext;
42 class TextTrack;
43 class TextTrackCueList;
44 class VTTRegion;
45 class VTTRegionList;
46
47 class TextTrackClient {
48 public:
49     virtual ~TextTrackClient() { }
50     virtual void textTrackKindChanged(TextTrack*) = 0;
51     virtual void textTrackModeChanged(TextTrack*) = 0;
52     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) = 0;
53     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) = 0;
54     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
55     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
56 };
57
58 class TextTrack : public TrackBase, public EventTargetWithInlineData {
59 public:
60     static Ref<TextTrack> create(ScriptExecutionContext* context, TextTrackClient* client, const AtomicString& kind, const AtomicString& id, const AtomicString& label, const AtomicString& language)
61     {
62         return adoptRef(*new TextTrack(context, client, kind, id, label, language, AddTrack));
63     }
64     virtual ~TextTrack();
65
66     EventTargetInterface eventTargetInterface() const final { return TextTrackEventTargetInterfaceType; }
67     ScriptExecutionContext* scriptExecutionContext() const final { return m_scriptExecutionContext; }
68
69     static TextTrack* captionMenuOffItem();
70     static TextTrack* captionMenuAutomaticItem();
71
72     static const AtomicString& subtitlesKeyword();
73     static const AtomicString& captionsKeyword();
74     static const AtomicString& descriptionsKeyword();
75     static const AtomicString& chaptersKeyword();
76     static const AtomicString& metadataKeyword();
77     static const AtomicString& forcedKeyword();
78     const AtomicString& defaultKindKeyword() const override { return subtitlesKeyword(); }
79     static bool isValidKindKeyword(const AtomicString&);
80
81     static const AtomicString& disabledKeyword();
82     static const AtomicString& hiddenKeyword();
83     static const AtomicString& showingKeyword();
84
85     void setKind(const AtomicString&) override;
86
87     virtual AtomicString inBandMetadataTrackDispatchType() const { return emptyString(); }
88
89     AtomicString mode() const { return m_mode; }
90     virtual void setMode(const AtomicString&);
91
92     enum ReadinessState { NotLoaded = 0, Loading = 1, Loaded = 2, FailedToLoad = 3 };
93     ReadinessState readinessState() const { return m_readinessState; }
94     void setReadinessState(ReadinessState state) { m_readinessState = state; }
95
96     TextTrackCueList* cues();
97     TextTrackCueList* activeCues() const;
98
99     void clearClient() override { m_client = 0; }
100     TextTrackClient* client() { return m_client; }
101
102     void addCue(PassRefPtr<TextTrackCue>, ExceptionCode&);
103     virtual void removeCue(TextTrackCue*, ExceptionCode&);
104
105     bool hasCue(TextTrackCue*, TextTrackCue::CueMatchRules = TextTrackCue::MatchAllFields);
106
107     VTTRegionList* regions();
108     void addRegion(PassRefPtr<VTTRegion>);
109     void removeRegion(VTTRegion*, ExceptionCode&);
110
111     void cueWillChange(TextTrackCue*);
112     void cueDidChange(TextTrackCue*);
113
114     enum TextTrackType { TrackElement, AddTrack, InBand };
115     TextTrackType trackType() const { return m_trackType; }
116
117     virtual bool isClosedCaptions() const { return false; }
118     virtual bool isSDH() const { return false; }
119     virtual bool containsOnlyForcedSubtitles() const;
120     virtual bool isMainProgramContent() const;
121     virtual bool isEasyToRead() const { return false; }
122
123     int trackIndex();
124     void invalidateTrackIndex();
125
126     bool isRendered();
127     int trackIndexRelativeToRenderedTracks();
128
129     bool hasBeenConfigured() const { return m_hasBeenConfigured; }
130     void setHasBeenConfigured(bool flag) { m_hasBeenConfigured = flag; }
131
132     virtual bool isDefault() const { return false; }
133     virtual void setIsDefault(bool) { }
134
135     void removeAllCues();
136
137 #if ENABLE(MEDIA_SOURCE)
138     void setLanguage(const AtomicString&) override;
139 #endif
140
141     virtual bool isInband() const { return false; }
142
143     virtual MediaTime startTimeVariance() const { return MediaTime::zeroTime(); }
144
145     using RefCounted<TrackBase>::ref;
146     using RefCounted<TrackBase>::deref;
147
148 protected:
149     TextTrack(ScriptExecutionContext*, TextTrackClient*, const AtomicString& kind, const AtomicString& id, const AtomicString& label, const AtomicString& language, TextTrackType);
150
151     RefPtr<TextTrackCueList> m_cues;
152
153 private:
154     bool isValidKind(const AtomicString&) const override;
155
156     bool enabled() const override;
157
158     void refEventTarget() final { ref(); }
159     void derefEventTarget() final { deref(); }
160
161     VTTRegionList* ensureVTTRegionList();
162     RefPtr<VTTRegionList> m_regions;
163
164     TextTrackCueList* ensureTextTrackCueList();
165
166     ScriptExecutionContext* m_scriptExecutionContext;
167     AtomicString m_mode;
168     TextTrackClient* m_client;
169     TextTrackType m_trackType;
170     ReadinessState m_readinessState;
171     int m_trackIndex;
172     int m_renderedTrackIndex;
173     bool m_hasBeenConfigured;
174 };
175
176 inline TextTrack* toTextTrack(TrackBase* track)
177 {
178     ASSERT_WITH_SECURITY_IMPLICATION(track->type() == TrackBase::TextTrack);
179     return static_cast<TextTrack*>(track);
180 }
181
182 } // namespace WebCore
183
184 #endif
185 #endif