| Index: Source/core/html/track/WebVTTParser.cpp
|
| diff --git a/Source/core/html/track/WebVTTParser.cpp b/Source/core/html/track/WebVTTParser.cpp
|
| index 2201249a81538045344bfcb6a298dabb6b445874..9716cdae215b9b8297f76f8197b864d3d07eb23c 100644
|
| --- a/Source/core/html/track/WebVTTParser.cpp
|
| +++ b/Source/core/html/track/WebVTTParser.cpp
|
| @@ -150,14 +150,14 @@ void WebVTTParser::flush()
|
|
|
| void WebVTTParser::parse()
|
| {
|
| - // 4.8.10.13.3 WHATWG WebVTT Parser algorithm.
|
| - // 1-3 - Initial setup.
|
| + // WebVTT parser algorithm. (5.1 WebVTT file parsing.)
|
| + // Steps 1 - 3 - Initial setup.
|
|
|
| String line;
|
| while (m_lineReader.getLine(line)) {
|
| switch (m_state) {
|
| case Initial:
|
| - // 4-12 - Check for a valid WebVTT signature.
|
| + // Steps 4 - 9 - Check for a valid WebVTT signature.
|
| if (!hasRequiredFileIdentifier(line)) {
|
| if (m_client)
|
| m_client->fileFailedToParse();
|
| @@ -168,9 +168,9 @@ void WebVTTParser::parse()
|
| break;
|
|
|
| case Header:
|
| + // Steps 10 - 14 - Allow a header (comment area) under the WEBVTT line.
|
| collectMetadataHeader(line);
|
|
|
| - // 13-18 - Allow a header (comment area) under the WEBVTT line.
|
| if (line.isEmpty()) {
|
| if (m_client && m_regionList.size())
|
| m_client->newRegionsParsed();
|
| @@ -179,35 +179,39 @@ void WebVTTParser::parse()
|
| break;
|
| }
|
|
|
| + // Step 16 - Line is not the empty string and does not contain "-->".
|
| break;
|
|
|
| case Id:
|
| - // 19-29 - Allow any number of line terminators, then initialize new cue values.
|
| + // Steps 17 - 20 - Allow any number of line terminators, then initialize new cue values.
|
| if (line.isEmpty())
|
| break;
|
| +
|
| + // Step 21 - Cue creation (start a new cue).
|
| resetCueValues();
|
|
|
| - // 30-39 - Check if this line contains an optional identifier or timing data.
|
| + // Steps 22 - 25 - Check if this line contains an optional identifier or timing data.
|
| m_state = collectCueId(line);
|
| break;
|
|
|
| case TimingsAndSettings:
|
| + // Steps 26 - 27 - Discard current cue if the line is empty.
|
| if (line.isEmpty()) {
|
| m_state = Id;
|
| break;
|
| }
|
|
|
| - // 40 - Collect cue timings and settings.
|
| + // Steps 28 - 29 - Collect cue timings and settings.
|
| m_state = collectTimingsAndSettings(line);
|
| break;
|
|
|
| case CueText:
|
| - // 41-53 - Collect the cue text, create a cue, and add it to the output.
|
| + // Steps 31 - 41 - Collect the cue text, create a cue, and add it to the output.
|
| m_state = collectCueText(line);
|
| break;
|
|
|
| case BadCue:
|
| - // 54-62 - Collect and discard the remaining cue.
|
| + // Steps 42 - 48 - Discard lines until an empty line or a potential timing line is seen.
|
| m_state = ignoreBadCue(line);
|
| break;
|
| }
|
| @@ -237,10 +241,10 @@ bool WebVTTParser::hasRequiredFileIdentifier(const String& line)
|
|
|
| void WebVTTParser::collectMetadataHeader(const String& line)
|
| {
|
| - // 4.1 Extension of WebVTT header parsing (11 - 15)
|
| + // WebVTT header parsing (WebVTT parser algorithm step 12)
|
| DEFINE_STATIC_LOCAL(const AtomicString, regionHeaderName, ("Region", AtomicString::ConstructFromLiteral));
|
|
|
| - // 15.4 If line contains the character ":" (A U+003A COLON), then set metadata's
|
| + // Step 12.4 If line contains the character ":" (A U+003A COLON), then set metadata's
|
| // name to the substring of line before the first ":" character and
|
| // metadata's value to the substring after this character.
|
| if (!RuntimeEnabledFeatures::webVTTRegionsEnabled() || !line.contains(":"))
|
| @@ -249,10 +253,10 @@ void WebVTTParser::collectMetadataHeader(const String& line)
|
| unsigned colonPosition = line.find(":");
|
| String headerName = line.substring(0, colonPosition);
|
|
|
| - // 15.5 If metadata's name equals "Region":
|
| + // Steps 12.5 If metadata's name equals "Region":
|
| if (headerName == regionHeaderName) {
|
| String headerValue = line.substring(colonPosition + 1);
|
| - // 15.5.1 - 15.5.8 Region creation: Let region be a new text track region [...]
|
| + // Steps 12.5.1 - 12.5.11 Region creation: Let region be a new text track region [...]
|
| createNewRegion(headerValue);
|
| }
|
| }
|
| @@ -267,12 +271,12 @@ WebVTTParser::ParseState WebVTTParser::collectCueId(const String& line)
|
|
|
| WebVTTParser::ParseState WebVTTParser::collectTimingsAndSettings(const String& line)
|
| {
|
| - // 4.8.10.13.3 Collect WebVTT cue timings and settings.
|
| - // 1-3 - Let input be the string being parsed and position be a pointer into input
|
| + // Collect WebVTT cue timings and settings. (5.3 WebVTT cue timings and settings parsing.)
|
| + // Steps 1 - 3 - Let input be the string being parsed and position be a pointer into input.
|
| unsigned position = 0;
|
| skipWhiteSpace(line, &position);
|
|
|
| - // 4-5 - Collect a WebVTT timestamp. If that fails, then abort and return failure. Otherwise, let cue's text track cue start time be the collected time.
|
| + // Steps 4 - 5 - Collect a WebVTT timestamp. If that fails, then abort and return failure. Otherwise, let cue's text track cue start time be the collected time.
|
| m_currentStartTime = collectTimeStamp(line, &position);
|
| if (m_currentStartTime == malformedTime)
|
| return BadCue;
|
| @@ -281,7 +285,7 @@ WebVTTParser::ParseState WebVTTParser::collectTimingsAndSettings(const String& l
|
|
|
| skipWhiteSpace(line, &position);
|
|
|
| - // 6-9 - If the next three characters are not "-->", abort and return failure.
|
| + // Steps 6 - 9 - If the next three characters are not "-->", abort and return failure.
|
| if (line.find("-->", position) == kNotFound)
|
| return BadCue;
|
| position += 3;
|
| @@ -290,13 +294,13 @@ WebVTTParser::ParseState WebVTTParser::collectTimingsAndSettings(const String& l
|
|
|
| skipWhiteSpace(line, &position);
|
|
|
| - // 10-11 - Collect a WebVTT timestamp. If that fails, then abort and return failure. Otherwise, let cue's text track cue end time be the collected time.
|
| + // Steps 10 - 11 - Collect a WebVTT timestamp. If that fails, then abort and return failure. Otherwise, let cue's text track cue end time be the collected time.
|
| m_currentEndTime = collectTimeStamp(line, &position);
|
| if (m_currentEndTime == malformedTime)
|
| return BadCue;
|
| skipWhiteSpace(line, &position);
|
|
|
| - // 12 - Parse the WebVTT settings for the cue (conducted in TextTrackCue).
|
| + // Step 12 - Parse the WebVTT settings for the cue (conducted in TextTrackCue).
|
| m_currentSettings = line.substring(position, line.length()-1);
|
| return CueText;
|
| }
|
| @@ -341,8 +345,8 @@ private:
|
| PassRefPtr<DocumentFragment> WebVTTTreeBuilder::buildFromString(const String& cueText)
|
| {
|
| // Cue text processing based on
|
| - // 4.8.10.13.4 WebVTT cue text parsing rules and
|
| - // 4.8.10.13.5 WebVTT cue text DOM construction rules.
|
| + // 5.4 WebVTT cue text parsing rules, and
|
| + // 5.5 WebVTT cue text DOM construction rules
|
|
|
| RefPtr<DocumentFragment> fragment = DocumentFragment::create(m_document);
|
|
|
| @@ -395,10 +399,11 @@ void WebVTTParser::createNewRegion(const String& headerValue)
|
| if (headerValue.isEmpty())
|
| return;
|
|
|
| + // Steps 12.5.1 - 12.5.9 - Construct and initialize a WebVTT Region object.
|
| RefPtr<VTTRegion> region = VTTRegion::create();
|
| region->setRegionSettings(headerValue);
|
|
|
| - // 15.5.10 If the text track list of regions regions contains a region
|
| + // Step 12.5.10 If the text track list of regions regions contains a region
|
| // with the same region identifier value as region, remove that region.
|
| for (size_t i = 0; i < m_regionList.size(); ++i)
|
| if (m_regionList[i]->id() == region->id()) {
|
| @@ -406,27 +411,28 @@ void WebVTTParser::createNewRegion(const String& headerValue)
|
| break;
|
| }
|
|
|
| + // Step 12.5.11
|
| m_regionList.append(region);
|
| }
|
|
|
| double WebVTTParser::collectTimeStamp(const String& line, unsigned* position)
|
| {
|
| - // 4.8.10.13.3 Collect a WebVTT timestamp.
|
| - // 1-4 - Initial checks, let most significant units be minutes.
|
| + // Collect a WebVTT timestamp (5.3 WebVTT cue timings and settings parsing.)
|
| + // Steps 1 - 4 - Initial checks, let most significant units be minutes.
|
| enum Mode { minutes, hours };
|
| Mode mode = minutes;
|
| if (*position >= line.length() || !isASCIIDigit(line[*position]))
|
| return malformedTime;
|
|
|
| - // 5-6 - Collect a sequence of characters that are 0-9.
|
| + // Steps 5 - 6 - Collect a sequence of characters that are 0-9.
|
| String digits1 = collectDigits(line, position);
|
| int value1 = digits1.toInt();
|
|
|
| - // 7 - If not 2 characters or value is greater than 59, interpret as hours.
|
| + // Step 7 - If not 2 characters or value is greater than 59, interpret as hours.
|
| if (digits1.length() != 2 || value1 > 59)
|
| mode = hours;
|
|
|
| - // 8-12 - Collect the next sequence of 0-9 after ':' (must be 2 chars).
|
| + // Steps 8 - 11 - Collect the next sequence of 0-9 after ':' (must be 2 chars).
|
| if (*position >= line.length() || line[(*position)++] != ':')
|
| return malformedTime;
|
| if (*position >= line.length() || !isASCIIDigit(line[(*position)]))
|
| @@ -436,7 +442,7 @@ double WebVTTParser::collectTimeStamp(const String& line, unsigned* position)
|
| if (digits2.length() != 2)
|
| return malformedTime;
|
|
|
| - // 13 - Detect whether this timestamp includes hours.
|
| + // Step 12 - Detect whether this timestamp includes hours.
|
| int value3;
|
| if (mode == hours || (*position < line.length() && line[*position] == ':')) {
|
| if (*position >= line.length() || line[(*position)++] != ':')
|
| @@ -453,7 +459,7 @@ double WebVTTParser::collectTimeStamp(const String& line, unsigned* position)
|
| value1 = 0;
|
| }
|
|
|
| - // 14-19 - Collect next sequence of 0-9 after '.' (must be 3 chars).
|
| + // Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars).
|
| if (*position >= line.length() || line[(*position)++] != '.')
|
| return malformedTime;
|
| if (*position >= line.length() || !isASCIIDigit(line[*position]))
|
| @@ -465,7 +471,7 @@ double WebVTTParser::collectTimeStamp(const String& line, unsigned* position)
|
| if (value2 > 59 || value3 > 59)
|
| return malformedTime;
|
|
|
| - // 20-21 - Calculate result.
|
| + // Steps 18 - 19 - Calculate result.
|
| return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (value4 * secondsPerMillisecond);
|
| }
|
|
|
|
|