Stop using string-based enumerations in TextTrack, and eliminate support for string...
[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 #pragma once
28
29 #if ENABLE(VIDEO_TRACK)
30
31 #include "ExceptionCode.h"
32 #include "TextTrackCue.h"
33 #include "TrackBase.h"
34 #include "VTTCue.h"
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38
39 class ScriptExecutionContext;
40 class TextTrack;
41 class TextTrackCueList;
42 class VTTRegion;
43 class VTTRegionList;
44
45 enum class TextTrackKind { Subtitles, Captions, Descriptions, Chapters, Metadata, Forced };
46 enum class TextTrackMode { Disabled, Hidden, Showing };
47
48 class TextTrackClient {
49 public:
50     virtual ~TextTrackClient() { }
51     virtual void textTrackKindChanged(TextTrack*) = 0;
52     virtual void textTrackModeChanged(TextTrack*) = 0;
53     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) = 0;
54     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) = 0;
55     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
56     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) = 0;
57 };
58
59 class TextTrack : public TrackBase, public EventTargetWithInlineData {
60 public:
61     static Ref<TextTrack> create(ScriptExecutionContext* context, TextTrackClient* client, const AtomicString& kind, const AtomicString& id, const AtomicString& label, const AtomicString& language)
62     {
63         return adoptRef(*new TextTrack(context, client, kind, id, label, language, AddTrack));
64     }
65     virtual ~TextTrack();
66
67     EventTargetInterface eventTargetInterface() const final { return TextTrackEventTargetInterfaceType; }
68     ScriptExecutionContext* scriptExecutionContext() const final { return m_scriptExecutionContext; }
69
70     static TextTrack* captionMenuOffItem();
71     static TextTrack* captionMenuAutomaticItem();
72
73     static const AtomicString& subtitlesKeyword();
74     static bool isValidKindKeyword(const AtomicString&);
75
76     static const AtomicString& disabledKeyword();
77     static const AtomicString& hiddenKeyword();
78     static const AtomicString& showingKeyword();
79
80     TextTrackKind kind() const;
81     void setKind(TextTrackKind);
82
83     TextTrackKind kindForBindings() const;
84     void setKindForBindings(TextTrackKind);
85
86     const AtomicString& kindKeyword() const;
87     void setKindKeywordIgnoringASCIICase(StringView);
88
89     virtual AtomicString inBandMetadataTrackDispatchType() const { return emptyString(); }
90
91     TextTrackMode mode() const;
92     virtual void setMode(TextTrackMode);
93
94     enum ReadinessState { NotLoaded = 0, Loading = 1, Loaded = 2, FailedToLoad = 3 };
95     ReadinessState readinessState() const { return m_readinessState; }
96     void setReadinessState(ReadinessState state) { m_readinessState = state; }
97
98     TextTrackCueList* cues();
99     TextTrackCueList* activeCues() const;
100
101     void clearClient() override { m_client = nullptr; }
102     TextTrackClient* client() { return m_client; }
103
104     void addCue(PassRefPtr<TextTrackCue>, ExceptionCode&);
105     virtual void removeCue(TextTrackCue*, ExceptionCode&);
106
107     bool hasCue(TextTrackCue*, TextTrackCue::CueMatchRules = TextTrackCue::MatchAllFields);
108
109     VTTRegionList* regions();
110     void addRegion(PassRefPtr<VTTRegion>);
111     void removeRegion(VTTRegion*, ExceptionCode&);
112
113     void cueWillChange(TextTrackCue*);
114     void cueDidChange(TextTrackCue*);
115
116     enum TextTrackType { TrackElement, AddTrack, InBand };
117     TextTrackType trackType() const { return m_trackType; }
118
119     virtual bool isClosedCaptions() const { return false; }
120     virtual bool isSDH() const { return false; }
121     virtual bool containsOnlyForcedSubtitles() const;
122     virtual bool isMainProgramContent() const;
123     virtual bool isEasyToRead() const { return false; }
124
125     int trackIndex();
126     void invalidateTrackIndex();
127
128     bool isRendered();
129     int trackIndexRelativeToRenderedTracks();
130
131     bool hasBeenConfigured() const { return m_hasBeenConfigured; }
132     void setHasBeenConfigured(bool flag) { m_hasBeenConfigured = flag; }
133
134     virtual bool isDefault() const { return false; }
135     virtual void setIsDefault(bool) { }
136
137     void removeAllCues();
138
139 #if ENABLE(MEDIA_SOURCE)
140     void setLanguage(const AtomicString&) override;
141 #endif
142
143     virtual bool isInband() const { return false; }
144
145     virtual MediaTime startTimeVariance() const { return MediaTime::zeroTime(); }
146
147     using RefCounted<TrackBase>::ref;
148     using RefCounted<TrackBase>::deref;
149
150 protected:
151     TextTrack(ScriptExecutionContext*, TextTrackClient*, const AtomicString& kind, const AtomicString& id, const AtomicString& label, const AtomicString& language, TextTrackType);
152
153     RefPtr<TextTrackCueList> m_cues;
154
155 private:
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     TextTrackMode m_mode { TextTrackMode::Disabled };
168     TextTrackKind m_kind { TextTrackKind::Subtitles };
169     TextTrackClient* m_client;
170     TextTrackType m_trackType;
171     ReadinessState m_readinessState { NotLoaded };
172     int m_trackIndex;
173     int m_renderedTrackIndex;
174     bool m_hasBeenConfigured { false };
175 };
176
177 inline TextTrack* toTextTrack(TrackBase* track)
178 {
179     ASSERT_WITH_SECURITY_IMPLICATION(track->type() == TrackBase::TextTrack);
180     return static_cast<TextTrack*>(track);
181 }
182
183 inline TextTrackMode TextTrack::mode() const
184 {
185     return m_mode;
186 }
187
188 inline TextTrackKind TextTrack::kind() const
189 {
190     return m_kind;
191 }
192
193 inline TextTrackKind TextTrack::kindForBindings() const
194 {
195     return kind();
196 }
197
198 #if !ENABLE(MEDIA_SOURCE)
199
200 inline void TextTrack::setKindForBindings(TextTrackKind)
201 {
202     // FIXME: We are using kindForBindings only to implement this empty function, preserving the
203     // behavior of doing nothing when trying to set the kind, originally implemented in a custom setter.
204     // Once we no longer need this special case, we should remove kindForBindings and setKindForBindings.
205 }
206
207 #else
208
209 inline void TextTrack::setKindForBindings(TextTrackKind kind)
210 {
211     setKind(kind);
212 }
213
214 #endif
215
216
217 } // namespace WebCore
218
219 #endif