Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / html / track / WebVTTParser.h
1 /*
2  * Copyright (C) 2011, 2013 Google Inc.  All rights reserved.
3  * Copyright (C) 2013 Cable Television Labs, Inc.
4  * Copyright (C) 2014 Apple Inc.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following disclaimer
14  * in the documentation and/or other materials provided with the
15  * distribution.
16  *     * Neither the name of Google Inc. nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #pragma once
34
35 #if ENABLE(VIDEO_TRACK)
36
37 #include "BufferedLineReader.h"
38 #include "DocumentFragment.h"
39 #include "HTMLNames.h"
40 #include "TextResourceDecoder.h"
41 #include "VTTRegion.h"
42 #include <memory>
43 #include <wtf/MediaTime.h>
44 #include <wtf/text/StringBuilder.h>
45
46 namespace WebCore {
47
48 using namespace HTMLNames;
49
50 class Document;
51 class ISOWebVTTCue;
52 class VTTScanner;
53
54 class WebVTTParserClient {
55 public:
56     virtual ~WebVTTParserClient() = default;
57
58     virtual void newCuesParsed() = 0;
59     virtual void newRegionsParsed() = 0;
60     virtual void fileFailedToParse() = 0;
61 };
62
63 class WebVTTCueData final : public RefCounted<WebVTTCueData> {
64 public:
65
66     static Ref<WebVTTCueData> create() { return adoptRef(*new WebVTTCueData()); }
67     ~WebVTTCueData() = default;
68
69     MediaTime startTime() const { return m_startTime; }
70     void setStartTime(const MediaTime& startTime) { m_startTime = startTime; }
71
72     MediaTime endTime() const { return m_endTime; }
73     void setEndTime(const MediaTime& endTime) { m_endTime = endTime; }
74
75     String id() const { return m_id; }
76     void setId(String id) { m_id = id; }
77
78     String content() const { return m_content; }
79     void setContent(String content) { m_content = content; }
80
81     String settings() const { return m_settings; }
82     void setSettings(String settings) { m_settings = settings; }
83
84     MediaTime originalStartTime() const { return m_originalStartTime; }
85     void setOriginalStartTime(const MediaTime& time) { m_originalStartTime = time; }
86
87 private:
88     WebVTTCueData() = default;
89
90     MediaTime m_startTime;
91     MediaTime m_endTime;
92     MediaTime m_originalStartTime;
93     String m_id;
94     String m_content;
95     String m_settings;
96 };
97
98 class WebVTTParser final {
99 public:
100     enum ParseState {
101         Initial,
102         Header,
103         Id,
104         TimingsAndSettings,
105         CueText,
106         BadCue,
107         Finished
108     };
109
110     WebVTTParser(WebVTTParserClient*, ScriptExecutionContext*);
111
112     static inline bool isRecognizedTag(const AtomicString& tagName)
113     {
114         return tagName == iTag
115             || tagName == bTag
116             || tagName == uTag
117             || tagName == rubyTag
118             || tagName == rtTag;
119     }
120
121     static inline bool isValidSettingDelimiter(UChar c)
122     {
123         // ... a WebVTT cue consists of zero or more of the following components, in any order, separated from each other by one or more 
124         // U+0020 SPACE characters or U+0009 CHARACTER TABULATION (tab) characters.
125         return c == ' ' || c == '\t';
126     }
127     static bool collectTimeStamp(const String&, MediaTime&);
128
129     // Useful functions for parsing percentage settings.
130     static bool parseFloatPercentageValue(VTTScanner& valueScanner, float&);
131     static bool parseFloatPercentageValuePair(VTTScanner& valueScanner, char, FloatPoint&);
132
133     // Input data to the parser to parse.
134     void parseBytes(const char*, unsigned);
135     void parseFileHeader(String&&);
136     void parseCueData(const ISOWebVTTCue&);
137     void flush();
138     void fileFinished();
139
140     // Transfers ownership of last parsed cues to caller.
141     void getNewCues(Vector<RefPtr<WebVTTCueData>>&);
142     void getNewRegions(Vector<RefPtr<VTTRegion>>&);
143
144     // Create the DocumentFragment representation of the WebVTT cue text.
145     static Ref<DocumentFragment> createDocumentFragmentFromCueText(Document&, const String&);
146
147 protected:
148     ScriptExecutionContext* m_scriptExecutionContext;
149     ParseState m_state;
150
151 private:
152     void parse();
153     void flushPendingCue();
154     bool hasRequiredFileIdentifier(const String&);
155     ParseState collectCueId(const String&);
156     ParseState collectTimingsAndSettings(const String&);
157     ParseState collectCueText(const String&);
158     ParseState recoverCue(const String&);
159     ParseState ignoreBadCue(const String&);
160
161     void createNewCue();
162     void resetCueValues();
163
164     void collectMetadataHeader(const String&);
165     void createNewRegion(const String& headerValue);
166
167     static bool collectTimeStamp(VTTScanner& input, MediaTime& timeStamp);
168
169     BufferedLineReader m_lineReader;
170     RefPtr<TextResourceDecoder> m_decoder;
171     String m_currentId;
172     MediaTime m_currentStartTime;
173     MediaTime m_currentEndTime;
174     StringBuilder m_currentContent;
175     String m_currentSettings;
176
177     WebVTTParserClient* m_client;
178
179     Vector<RefPtr<WebVTTCueData>> m_cuelist;
180     Vector<RefPtr<VTTRegion>> m_regionList;
181 };
182
183 } // namespace WebCore
184
185 #endif // ENABLE(VIDEO_TRACK)