Remove excessive include directives from WebCore/css
[WebKit-https.git] / Source / WebCore / html / track / TextTrackCue.cpp
1 /*
2  * Copyright (C) 2011, 2013 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 are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include "config.h"
33 #include "TextTrackCue.h"
34
35 #if ENABLE(VIDEO_TRACK)
36
37 #include "CSSPropertyNames.h"
38 #include "CSSValueKeywords.h"
39 #include "Event.h"
40 #include "Logging.h"
41 #include "NodeTraversal.h"
42 #include "Text.h"
43 #include "TextTrack.h"
44 #include "TextTrackCueList.h"
45 #include "VTTCue.h"
46 #include "VTTRegionList.h"
47 #include <wtf/MathExtras.h>
48 #include <wtf/NeverDestroyed.h>
49
50 namespace WebCore {
51
52 const AtomicString& TextTrackCue::cueShadowPseudoId()
53 {
54     static NeverDestroyed<const AtomicString> cue("cue", AtomicString::ConstructFromLiteral);
55     return cue;
56 }
57
58 TextTrackCue::TextTrackCue(ScriptExecutionContext& context, const MediaTime& start, const MediaTime& end)
59     : m_startTime(start)
60     , m_endTime(end)
61     , m_scriptExecutionContext(context)
62     , m_isActive(false)
63     , m_pauseOnExit(false)
64 {
65     ASSERT(m_scriptExecutionContext.isDocument());
66 }
67
68 void TextTrackCue::willChange()
69 {
70     if (++m_processingCueChanges > 1)
71         return;
72
73     if (m_track)
74         m_track->cueWillChange(this);
75 }
76
77 void TextTrackCue::didChange()
78 {
79     ASSERT(m_processingCueChanges);
80     if (--m_processingCueChanges)
81         return;
82
83     if (m_track)
84         m_track->cueDidChange(this);
85 }
86
87 TextTrack* TextTrackCue::track() const
88 {
89     return m_track;
90 }
91
92 void TextTrackCue::setTrack(TextTrack* track)
93 {
94     m_track = track;
95 }
96
97 void TextTrackCue::setId(const String& id)
98 {
99     if (m_id == id)
100         return;
101
102     willChange();
103     m_id = id;
104     didChange();
105 }
106
107 void TextTrackCue::setStartTime(double value)
108 {
109     // TODO(93143): Add spec-compliant behavior for negative time values.
110     if (m_startTime.toDouble() == value || value < 0)
111         return;
112
113     setStartTime(MediaTime::createWithDouble(value));
114 }
115
116 void TextTrackCue::setStartTime(const MediaTime& value)
117 {
118     willChange();
119     m_startTime = value;
120     didChange();
121 }
122     
123 void TextTrackCue::setEndTime(double value)
124 {
125     // TODO(93143): Add spec-compliant behavior for negative time values.
126     if (m_endTime.toDouble() == value || value < 0)
127         return;
128
129     setEndTime(MediaTime::createWithDouble(value));
130 }
131
132 void TextTrackCue::setEndTime(const MediaTime& value)
133 {
134     willChange();
135     m_endTime = value;
136     didChange();
137 }
138     
139 void TextTrackCue::setPauseOnExit(bool value)
140 {
141     if (m_pauseOnExit == value)
142         return;
143     
144     m_pauseOnExit = value;
145 }
146
147 bool TextTrackCue::dispatchEvent(Event& event)
148 {
149     // When a TextTrack's mode is disabled: no cues are active, no events fired.
150     if (!track() || track()->mode() == TextTrack::Mode::Disabled)
151         return false;
152
153     return EventTarget::dispatchEvent(event);
154 }
155
156 bool TextTrackCue::isActive()
157 {
158     return m_isActive && track() && track()->mode() != TextTrack::Mode::Disabled;
159 }
160
161 void TextTrackCue::setIsActive(bool active)
162 {
163     m_isActive = active;
164 }
165
166 bool TextTrackCue::isOrderedBefore(const TextTrackCue* other) const
167 {
168     return startMediaTime() < other->startMediaTime() || (startMediaTime() == other->startMediaTime() && endMediaTime() > other->endMediaTime());
169 }
170
171 bool TextTrackCue::cueContentsMatch(const TextTrackCue& cue) const
172 {
173     if (cueType() != cue.cueType())
174         return false;
175
176     if (id() != cue.id())
177         return false;
178
179     return true;
180 }
181
182 bool TextTrackCue::isEqual(const TextTrackCue& cue, TextTrackCue::CueMatchRules match) const
183 {
184     if (cueType() != cue.cueType())
185         return false;
186
187     if (match != IgnoreDuration && endMediaTime() != cue.endMediaTime())
188         return false;
189     if (!hasEquivalentStartTime(cue))
190         return false;
191     if (!cueContentsMatch(cue))
192         return false;
193
194     return true;
195 }
196
197 bool TextTrackCue::hasEquivalentStartTime(const TextTrackCue& cue) const
198 {
199     MediaTime startTimeVariance = MediaTime::zeroTime();
200     if (track())
201         startTimeVariance = track()->startTimeVariance();
202     else if (cue.track())
203         startTimeVariance = cue.track()->startTimeVariance();
204
205     return abs(abs(startMediaTime()) - abs(cue.startMediaTime())) <= startTimeVariance;
206 }
207
208 bool TextTrackCue::doesExtendCue(const TextTrackCue& cue) const
209 {
210     if (!cueContentsMatch(cue))
211         return false;
212
213     if (endMediaTime() != cue.startMediaTime())
214         return false;
215     
216     return true;
217 }
218
219 } // namespace WebCore
220
221 #endif