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