115a86809f6f606b312da50e1a88b81472025a1e
[WebKit-https.git] / Source / WebCore / html / track / TextTrackCue.h
1 /*
2  * Copyright (C) 2011 Google Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef TextTrackCue_h
32 #define TextTrackCue_h
33
34 #if ENABLE(VIDEO_TRACK)
35
36 #include "EventTarget.h"
37 #include "HTMLElement.h"
38 #include "TextTrack.h"
39 #include <wtf/PassOwnPtr.h>
40 #include <wtf/RefCounted.h>
41
42 namespace WebCore {
43
44 class DocumentFragment;
45 class HTMLDivElement;
46 class ScriptExecutionContext;
47 class TextTrack;
48 class TextTrackCue;
49
50 // ----------------------------
51
52 class TextTrackCueBox : public HTMLElement {
53 public:
54     static PassRefPtr<TextTrackCueBox> create(Document* document, TextTrackCue* cue)
55     {
56         return adoptRef(new TextTrackCueBox(document, cue));
57     }
58
59     TextTrackCue* getCue() const;
60     void applyCSSProperties();
61
62     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
63
64 private:
65     TextTrackCueBox(Document*, TextTrackCue*);
66
67     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
68
69     TextTrackCue* m_cue;
70 };
71
72 // ----------------------------
73
74 class TextTrackCue : public RefCounted<TextTrackCue>, public EventTarget {
75 public:
76     static PassRefPtr<TextTrackCue> create(ScriptExecutionContext* context, double start, double end, const String& content)
77     {
78         return adoptRef(new TextTrackCue(context, start, end, content));
79     }
80
81     virtual ~TextTrackCue();
82
83     TextTrack* track() const;
84     void setTrack(PassRefPtr<TextTrack>);
85
86     const String& id() const { return m_id; }
87     void setId(const String&);
88
89     double startTime() const { return m_startTime; }
90     void setStartTime(double);
91
92     double endTime() const { return m_endTime; }
93     void setEndTime(double);
94
95     bool pauseOnExit() const { return m_pauseOnExit; }
96     void setPauseOnExit(bool);
97
98     const String& vertical() const;
99     void setVertical(const String&, ExceptionCode&);
100
101     bool snapToLines() const { return m_snapToLines; }
102     void setSnapToLines(bool);
103
104     int line() const { return m_linePosition; }
105     void setLine(int, ExceptionCode&);
106
107     int position() const { return m_textPosition; }
108     void setPosition(int, ExceptionCode&);
109
110     int size() const { return m_cueSize; }
111     void setSize(int, ExceptionCode&);
112
113     const String& align() const;
114     void setAlign(const String&, ExceptionCode&);
115
116     const String& text() const { return m_content; }
117     void setText(const String&);
118
119     void setCueSettings(const String&);
120
121     int cueIndex();
122     void invalidateCueIndex();
123
124     PassRefPtr<DocumentFragment> getCueAsHTML();
125
126     virtual bool dispatchEvent(PassRefPtr<Event>);
127     bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&);
128
129     bool isActive();
130     void setIsActive(bool);
131
132     PassRefPtr<TextTrackCueBox> getDisplayTree();
133     void updateDisplayTree(float);
134     void removeDisplayTree();
135
136     int calculateComputedLinePosition();
137
138     virtual const AtomicString& interfaceName() const;
139     virtual ScriptExecutionContext* scriptExecutionContext() const;
140
141     std::pair<double, double> getCSSPosition() const;
142     int getCSSSize() const;
143     int getCSSWritingMode() const;
144
145     enum WritingDirection {
146         Horizontal,
147         VerticalGrowingLeft,
148         VerticalGrowingRight,
149         NumberOfWritingDirections
150     };
151     WritingDirection getWritingDirection() const { return m_writingDirection; }
152
153     DEFINE_ATTRIBUTE_EVENT_LISTENER(enter);
154     DEFINE_ATTRIBUTE_EVENT_LISTENER(exit);
155
156     using RefCounted<TextTrackCue>::ref;
157     using RefCounted<TextTrackCue>::deref;
158
159 protected:
160     virtual EventTargetData* eventTargetData();
161     virtual EventTargetData* ensureEventTargetData();
162
163 private:
164     TextTrackCue(ScriptExecutionContext*, double start, double end, const String& content);
165
166     std::pair<double, double> getPositionCoordinates() const;
167     void parseSettings(const String&);
168
169     void calculateDisplayParameters();
170
171     void cueWillChange();
172     void cueDidChange();
173
174     virtual void refEventTarget() { ref(); }
175     virtual void derefEventTarget() { deref(); }
176
177     enum CueSetting { None, Vertical, Line, Position, Size, Align };
178     CueSetting settingName(const String&);
179
180     String m_id;
181     double m_startTime;
182     double m_endTime;
183     String m_content;
184     int m_linePosition;
185     int m_computedLinePosition;
186     int m_textPosition;
187     int m_cueSize;
188     int m_cueIndex;
189
190     WritingDirection m_writingDirection;
191
192     enum Alignment { Start, Middle, End };
193     Alignment m_cueAlignment;
194
195     RefPtr<DocumentFragment> m_documentFragment;
196     RefPtr<TextTrack> m_track;
197
198     EventTargetData m_eventTargetData;
199     ScriptExecutionContext* m_scriptExecutionContext;
200
201     bool m_isActive;
202     bool m_pauseOnExit;
203     bool m_snapToLines;
204
205     bool m_hasInnerTimestamps;
206     RefPtr<HTMLDivElement> m_pastDocumentNodes;
207     RefPtr<HTMLDivElement> m_futureDocumentNodes;
208
209     bool m_displayTreeShouldChange;
210     RefPtr<TextTrackCueBox> m_displayTree;
211
212     int m_displayDirection;
213
214     int m_displayWritingModeMap[NumberOfWritingDirections];
215     int m_displayWritingMode;
216
217     int m_displaySize;
218
219     std::pair<float, float> m_displayPosition;
220 };
221
222 } // namespace WebCore
223
224 #endif
225 #endif