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