| 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 b428af028ed9ebc5a5d7ff467eea1d24336c36c5..e1b4b2a372d7c8f9c987fb97876c22a9bb280ebe 100644
|
| --- a/Source/core/html/track/vtt/VTTParser.cpp
|
| +++ b/Source/core/html/track/vtt/VTTParser.cpp
|
| @@ -43,7 +43,6 @@ namespace WebCore {
|
| const double secondsPerHour = 3600;
|
| const double secondsPerMinute = 60;
|
| const double secondsPerMillisecond = 0.001;
|
| -const double malformedTime = -1;
|
| const unsigned fileIdentifierLength = 6;
|
|
|
| static unsigned scanDigits(const String& input, unsigned* position)
|
| @@ -91,13 +90,11 @@ void VTTParser::skipWhiteSpace(const String& line, unsigned* position)
|
| (*position)++;
|
| }
|
|
|
| -float VTTParser::parseFloatPercentageValue(const String& value, bool& isValidSetting)
|
| +bool VTTParser::parseFloatPercentageValue(const String& value, float& percentage)
|
| {
|
| // '%' must be present and at the end of the setting value.
|
| - if (value.find('%', 1) != value.length() - 1) {
|
| - isValidSetting = false;
|
| - return 0;
|
| - }
|
| + if (value.isEmpty() || value[value.length() - 1] != '%')
|
| + return false;
|
|
|
| unsigned position = 0;
|
| unsigned digitsBeforeDot = scanDigits(value, &position);
|
| @@ -109,35 +106,36 @@ float VTTParser::parseFloatPercentageValue(const String& value, bool& isValidSet
|
| }
|
|
|
| // At least one digit required.
|
| - if (!digitsBeforeDot && !digitsAfterDot) {
|
| - isValidSetting = false;
|
| - return 0;
|
| - }
|
| + if (!digitsBeforeDot && !digitsAfterDot)
|
| + return false;
|
|
|
| float number = value.toFloat();
|
| - isValidSetting = number >= 0 && number <= 100;
|
| - return number;
|
| + if (number < 0 || number > 100)
|
| + return false;
|
| +
|
| + percentage = number;
|
| + return true;
|
| }
|
|
|
| -FloatPoint VTTParser::parseFloatPercentageValuePair(const String& value, char delimiter, bool& isValidSetting)
|
| +bool VTTParser::parseFloatPercentageValuePair(const String& value, char delimiter, FloatPoint& valuePair)
|
| {
|
| // The delimiter can't be the first or second value because a pair of
|
| // percentages (x%,y%) implies that at least the first two characters
|
| // are the first percentage value.
|
| size_t delimiterOffset = value.find(delimiter, 2);
|
| - if (delimiterOffset == kNotFound || delimiterOffset == value.length() - 1) {
|
| - isValidSetting = false;
|
| - return FloatPoint(0, 0);
|
| - }
|
| + if (delimiterOffset == kNotFound || delimiterOffset == value.length() - 1)
|
| + return false;
|
|
|
| - bool isFirstValueValid;
|
| - float firstCoord = parseFloatPercentageValue(value.substring(0, delimiterOffset), isFirstValueValid);
|
| + float firstCoord;
|
| + if (!parseFloatPercentageValue(value.substring(0, delimiterOffset), firstCoord))
|
| + return false;
|
|
|
| - bool isSecondValueValid;
|
| - float secondCoord = parseFloatPercentageValue(value.substring(delimiterOffset + 1, value.length() - 1), isSecondValueValid);
|
| + float secondCoord;
|
| + if (!parseFloatPercentageValue(value.substring(delimiterOffset + 1, value.length() - 1), secondCoord))
|
| + return false;
|
|
|
| - isValidSetting = isFirstValueValid && isSecondValueValid;
|
| - return FloatPoint(firstCoord, secondCoord);
|
| + valuePair = FloatPoint(firstCoord, secondCoord);
|
| + return true;
|
| }
|
|
|
| VTTParser::VTTParser(VTTParserClient* client, Document& document)
|
| @@ -315,8 +313,7 @@ VTTParser::ParseState VTTParser::collectTimingsAndSettings(const String& line)
|
| skipWhiteSpace(line, &position);
|
|
|
| // 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)
|
| + if (!collectTimeStamp(line, &position, m_currentStartTime))
|
| return BadCue;
|
| if (position >= line.length())
|
| return BadCue;
|
| @@ -333,8 +330,7 @@ VTTParser::ParseState VTTParser::collectTimingsAndSettings(const String& line)
|
| skipWhiteSpace(line, &position);
|
|
|
| // 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)
|
| + if (!collectTimeStamp(line, &position, m_currentEndTime))
|
| return BadCue;
|
| skipWhiteSpace(line, &position);
|
|
|
| @@ -472,7 +468,7 @@ void VTTParser::createNewRegion(const String& headerValue)
|
| m_regionList.append(region);
|
| }
|
|
|
| -double VTTParser::collectTimeStamp(const String& line, unsigned* position)
|
| +bool VTTParser::collectTimeStamp(const String& line, unsigned* position, 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.
|
| @@ -484,24 +480,24 @@ double VTTParser::collectTimeStamp(const String& line, unsigned* position)
|
| int value1;
|
| unsigned value1Digits = collectDigitsToInt(line, position, value1);
|
| if (!value1Digits)
|
| - return malformedTime;
|
| + 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 malformedTime;
|
| + return false;
|
| int value2;
|
| if (collectDigitsToInt(line, position, value2) != 2)
|
| - return malformedTime;
|
| + 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 malformedTime;
|
| + return false;
|
| if (collectDigitsToInt(line, position, value3) != 2)
|
| - return malformedTime;
|
| + return false;
|
| } else {
|
| value3 = value2;
|
| value2 = value1;
|
| @@ -510,15 +506,16 @@ double VTTParser::collectTimeStamp(const String& line, unsigned* position)
|
|
|
| // Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars).
|
| if (*position >= line.length() || line[(*position)++] != '.')
|
| - return malformedTime;
|
| + return false;
|
| int value4;
|
| if (collectDigitsToInt(line, position, value4) != 3)
|
| - return malformedTime;
|
| + return false;
|
| if (value2 > 59 || value3 > 59)
|
| - return malformedTime;
|
| + return false;
|
|
|
| // Steps 18 - 19 - Calculate result.
|
| - return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (value4 * secondsPerMillisecond);
|
| + timeStamp = (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (value4 * secondsPerMillisecond);
|
| + return true;
|
| }
|
|
|
| static VTTNodeType tokenToNodeType(VTTToken& token)
|
| @@ -616,8 +613,8 @@ void VTTTreeBuilder::constructTreeFromToken(Document& document)
|
| case VTTTokenTypes::TimestampTag: {
|
| unsigned position = 0;
|
| String charactersString = m_token.characters();
|
| - double time = VTTParser::collectTimeStamp(charactersString, &position);
|
| - if (time != malformedTime)
|
| + double parsedTimeStamp;
|
| + if (VTTParser::collectTimeStamp(charactersString, &position, parsedTimeStamp))
|
| m_currentNode->parserAppendChild(ProcessingInstruction::create(document, "timestamp", charactersString));
|
| break;
|
| }
|
|
|