947ace610dc58c07715881cbee6dafb15997f23b
[WebKit-https.git] / Source / WebCore / html / track / VTTCue.h
1 /*
2  * Copyright (C) 2011, 2013 Google Inc.  All rights reserved.
3  * Copyright (C) 2012-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 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 #ifndef VTTCue_h
33 #define VTTCue_h
34
35 #if ENABLE(VIDEO_TRACK)
36
37 #include "EventTarget.h"
38 #include "HTMLElement.h"
39 #include "TextTrackCue.h"
40 #include <wtf/RefCounted.h>
41
42 namespace WebCore {
43
44 class DocumentFragment;
45 class HTMLSpanElement;
46 class ScriptExecutionContext;
47 class VTTCue;
48 class VTTScanner;
49
50 // ----------------------------
51
52 class VTTCueBox : public HTMLElement {
53 public:
54     static PassRefPtr<VTTCueBox> create(Document& document, VTTCue* cue)
55     {
56         return adoptRef(new VTTCueBox(document, cue));
57     }
58
59     VTTCue* getCue() const;
60     virtual void applyCSSProperties(const IntSize& videoSize);
61
62     static const AtomicString& vttCueBoxShadowPseudoId();
63
64 protected:
65     VTTCueBox(Document&, VTTCue*);
66
67     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
68
69     VTTCue* m_cue;
70 };
71
72 // ----------------------------
73
74 class VTTCue : public TextTrackCue {
75 public:
76     static PassRefPtr<VTTCue> create(ScriptExecutionContext& context, double start, double end, const String& content)
77     {
78         return adoptRef(new VTTCue(context, start, end, content));
79     }
80
81     virtual ~VTTCue();
82
83     const String& vertical() const;
84     void setVertical(const String&, ExceptionCode&);
85
86     bool snapToLines() const { return m_snapToLines; }
87     void setSnapToLines(bool);
88
89     int line() const { return m_linePosition; }
90     virtual void setLine(int, ExceptionCode&);
91
92     int position() const { return m_textPosition; }
93     virtual void setPosition(int, ExceptionCode&);
94
95     int size() const { return m_cueSize; }
96     virtual void setSize(int, ExceptionCode&);
97
98     const String& align() const;
99     void setAlign(const String&, ExceptionCode&);
100
101     const String& text() const { return m_content; }
102     void setText(const String&);
103
104     const String& cueSettings() const { return m_settings; }
105     void setCueSettings(const String&);
106
107     PassRefPtr<DocumentFragment> getCueAsHTML();
108     PassRefPtr<DocumentFragment> createCueRenderingTree();
109
110 #if ENABLE(WEBVTT_REGIONS)
111     const String& regionId() const { return m_regionId; }
112     void setRegionId(const String&);
113     void notifyRegionWhenRemovingDisplayTree(bool);
114 #endif
115
116     virtual void setIsActive(bool);
117
118     bool hasDisplayTree() const { return m_displayTree; }
119     VTTCueBox* getDisplayTree(const IntSize& videoSize);
120     HTMLSpanElement* element() const { return m_cueBackgroundBox.get(); }
121
122     void updateDisplayTree(double);
123     void removeDisplayTree();
124     void markFutureAndPastNodes(ContainerNode*, double, double);
125
126     int calculateComputedLinePosition();
127     std::pair<double, double> getPositionCoordinates() const;
128
129     std::pair<double, double> getCSSPosition() const;
130
131     CSSValueID getCSSAlignment() const;
132     int getCSSSize() const;
133     CSSValueID getCSSWritingDirection() const;
134     CSSValueID getCSSWritingMode() const;
135
136     enum WritingDirection {
137         Horizontal = 0,
138         VerticalGrowingLeft,
139         VerticalGrowingRight,
140         NumberOfWritingDirections
141     };
142     WritingDirection getWritingDirection() const { return m_writingDirection; }
143
144     enum CueAlignment {
145         Start = 0,
146         Middle,
147         End,
148         Left,
149         Right,
150         NumberOfAlignments
151     };
152     CueAlignment getAlignment() const { return m_cueAlignment; }
153
154     virtual void setFontSize(int, const IntSize&, bool important);
155
156     virtual bool isEqual(const TextTrackCue&, CueMatchRules) const override;
157     virtual bool cueContentsMatch(const TextTrackCue&) const override;
158     virtual bool doesExtendCue(const TextTrackCue&) const override;
159
160     virtual CueType cueType() const { return WebVTT; }
161     virtual bool isRenderable() const override final { return true; }
162
163     virtual void didChange() override;
164
165 protected:
166     VTTCue(ScriptExecutionContext&, double start, double end, const String& content);
167
168     virtual PassRefPtr<VTTCueBox> createDisplayTree();
169     VTTCueBox* displayTreeInternal();
170
171 private:
172     void createWebVTTNodeTree();
173     void copyWebVTTNodeToDOMTree(ContainerNode* WebVTTNode, ContainerNode* root);
174
175     void parseSettings(const String&);
176
177     void determineTextDirection();
178     void calculateDisplayParameters();
179
180     enum CueSetting {
181         None,
182         Vertical,
183         Line,
184         Position,
185         Size,
186         Align,
187 #if ENABLE(WEBVTT_REGIONS)
188         RegionId
189 #endif
190     };
191     CueSetting settingName(VTTScanner&);
192
193     String m_content;
194     String m_settings;
195     int m_linePosition;
196     int m_computedLinePosition;
197     int m_textPosition;
198     int m_cueSize;
199
200     WritingDirection m_writingDirection;
201     CueAlignment m_cueAlignment;
202 #if ENABLE(WEBVTT_REGIONS)
203     String m_regionId;
204 #endif
205
206     RefPtr<DocumentFragment> m_webVTTNodeTree;
207     RefPtr<HTMLSpanElement> m_cueBackgroundBox;
208     RefPtr<VTTCueBox> m_displayTree;
209
210     CSSValueID m_displayDirection;
211     int m_displaySize;
212     std::pair<float, float> m_displayPosition;
213
214     bool m_snapToLines : 1;
215     bool m_displayTreeShouldChange : 1;
216     bool m_notifyRegion : 1;
217 };
218
219 VTTCue* toVTTCue(TextTrackCue*);
220 const VTTCue* toVTTCue(const TextTrackCue*);
221
222 } // namespace WebCore
223
224 #endif
225 #endif