Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(867)

Unified Diff: Source/core/html/track/vtt/VTTParser.cpp

Issue 119143002: Introduce VTTScanner - a parser helper for various VTT parsing needs (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: struct Run -> class Run; explicit constructor; make non-copyable. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/html/track/vtt/VTTParser.h ('k') | Source/core/html/track/vtt/VTTScanner.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/track/vtt/VTTParser.cpp
diff --git a/Source/core/html/track/vtt/VTTParser.cpp b/Source/core/html/track/vtt/VTTParser.cpp
index e1b4b2a372d7c8f9c987fb97876c22a9bb280ebe..cfe7ba581ee01b9c83b8e10a30b39aef2bc6c50f 100644
--- a/Source/core/html/track/vtt/VTTParser.cpp
+++ b/Source/core/html/track/vtt/VTTParser.cpp
@@ -35,6 +35,7 @@
#include "core/dom/ProcessingInstruction.h"
#include "core/dom/Text.h"
#include "core/html/track/vtt/VTTElement.h"
+#include "core/html/track/vtt/VTTScanner.h"
#include "platform/text/SegmentedString.h"
#include "wtf/text/WTFString.h"
@@ -55,25 +56,8 @@ static unsigned scanDigits(const String& input, unsigned* position)
unsigned VTTParser::collectDigitsToInt(const String& input, unsigned* position, int& number)
{
- unsigned startPosition = *position;
- unsigned numDigits = scanDigits(input, position);
- if (!numDigits) {
- number = 0;
- return 0;
- }
- bool validNumber;
- if (input.is8Bit())
- number = charactersToInt(input.characters8() + startPosition, numDigits, &validNumber);
- else
- number = charactersToInt(input.characters16() + startPosition, numDigits, &validNumber);
-
- // Since we know that scanDigits only scanned valid (ASCII) digits (and
- // hence that's what got passed to charactersToInt()), the remaining
- // failure mode for charactersToInt() is overflow, so if |validNumber| is
- // not true, then set |number| to the maximum int value.
- if (!validNumber)
- number = std::numeric_limits<int>::max();
- return numDigits;
+ VTTLegacyScanner inputScanner(input, position);
+ return inputScanner.scanDigits(number);
}
String VTTParser::collectWord(const String& input, unsigned* position)
@@ -84,12 +68,6 @@ String VTTParser::collectWord(const String& input, unsigned* position)
return string.toString();
}
-void VTTParser::skipWhiteSpace(const String& line, unsigned* position)
-{
- while (*position < line.length() && isASpace(line[*position]))
- (*position)++;
-}
-
bool VTTParser::parseFloatPercentageValue(const String& value, float& percentage)
{
// '%' must be present and at the end of the setting value.
@@ -307,35 +285,29 @@ VTTParser::ParseState VTTParser::collectCueId(const String& line)
VTTParser::ParseState VTTParser::collectTimingsAndSettings(const String& line)
{
+ VTTScanner input(line);
+
// 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);
+ input.skipWhile<isASpace>();
// 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.
- if (!collectTimeStamp(line, &position, m_currentStartTime))
- return BadCue;
- if (position >= line.length())
+ if (!collectTimeStamp(input, m_currentStartTime))
return BadCue;
-
- skipWhiteSpace(line, &position);
+ input.skipWhile<isASpace>();
// Steps 6 - 9 - If the next three characters are not "-->", abort and return failure.
- if (line.find("-->", position) == kNotFound)
- return BadCue;
- position += 3;
- if (position >= line.length())
+ if (!input.scan("-->"))
return BadCue;
-
- skipWhiteSpace(line, &position);
+ input.skipWhile<isASpace>();
// 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.
- if (!collectTimeStamp(line, &position, m_currentEndTime))
+ if (!collectTimeStamp(input, m_currentEndTime))
return BadCue;
- skipWhiteSpace(line, &position);
+ input.skipWhile<isASpace>();
// Step 12 - Parse the WebVTT settings for the cue (conducted in TextTrackCue).
- m_currentSettings = line.substring(position, line.length()-1);
+ m_currentSettings = input.restOfInputAsString();
return CueText;
}
@@ -470,6 +442,12 @@ void VTTParser::createNewRegion(const String& headerValue)
bool VTTParser::collectTimeStamp(const String& line, unsigned* position, double& timeStamp)
{
+ VTTLegacyScanner input(line, position);
+ return collectTimeStamp(input, timeStamp);
+}
+
+bool VTTParser::collectTimeStamp(VTTScanner& input, double& timeStamp)
+{
// 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 };
@@ -478,25 +456,21 @@ bool VTTParser::collectTimeStamp(const String& line, unsigned* position, double&
// Steps 5 - 7 - Collect a sequence of characters that are 0-9.
// If not 2 characters or value is greater than 59, interpret as hours.
int value1;
- unsigned value1Digits = collectDigitsToInt(line, position, value1);
+ unsigned value1Digits = input.scanDigits(value1);
if (!value1Digits)
return false;
if (value1Digits != 2 || value1 > 59)
mode = Hours;
// Steps 8 - 11 - Collect the next sequence of 0-9 after ':' (must be 2 chars).
- if (*position >= line.length() || line[(*position)++] != ':')
- return false;
int value2;
- if (collectDigitsToInt(line, position, value2) != 2)
+ if (!input.scan(':') || input.scanDigits(value2) != 2)
return false;
// Step 12 - Detect whether this timestamp includes hours.
int value3;
- if (mode == Hours || (*position < line.length() && line[*position] == ':')) {
- if (*position >= line.length() || line[(*position)++] != ':')
- return false;
- if (collectDigitsToInt(line, position, value3) != 2)
+ if (mode == Hours || input.match(':')) {
+ if (!input.scan(':') || input.scanDigits(value3) != 2)
return false;
} else {
value3 = value2;
@@ -505,10 +479,8 @@ bool VTTParser::collectTimeStamp(const String& line, unsigned* position, double&
}
// Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars).
- if (*position >= line.length() || line[(*position)++] != '.')
- return false;
int value4;
- if (collectDigitsToInt(line, position, value4) != 3)
+ if (!input.scan('.') || input.scanDigits(value4) != 3)
return false;
if (value2 > 59 || value3 > 59)
return false;
« no previous file with comments | « Source/core/html/track/vtt/VTTParser.h ('k') | Source/core/html/track/vtt/VTTScanner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698