| 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 f6b0e52e41fc2506236f6a4372952f1f9b2efccc..c02bb51985e106423fa9abd372f3525bd493acf9 100644
|
| --- a/Source/core/html/track/vtt/VTTParser.cpp
|
| +++ b/Source/core/html/track/vtt/VTTParser.cpp
|
| @@ -46,26 +46,35 @@ const double secondsPerMillisecond = 0.001;
|
| const double malformedTime = -1;
|
| const unsigned fileIdentifierLength = 6;
|
|
|
| -String VTTParser::collectDigits(const String& input, unsigned* position)
|
| +static unsigned scanDigits(const String& input, unsigned* position)
|
| {
|
| - StringBuilder digits;
|
| + unsigned startPosition = *position;
|
| while (*position < input.length() && isASCIIDigit(input[*position]))
|
| - digits.append(input[(*position)++]);
|
| - return digits.toString();
|
| + (*position)++;
|
| + return *position - startPosition;
|
| }
|
|
|
| unsigned VTTParser::collectDigitsToInt(const String& input, unsigned* position, int& number)
|
| {
|
| - String digits = collectDigits(input, position);
|
| + unsigned startPosition = *position;
|
| + unsigned numDigits = scanDigits(input, position);
|
| + if (!numDigits) {
|
| + number = 0;
|
| + return 0;
|
| + }
|
| bool validNumber;
|
| - number = digits.toInt(&validNumber);
|
| - // Since we know that |digits| only contain valid (ASCII) digits
|
| - // (disregarding the 'empty' case), the remaining failure mode for toInt()
|
| - // is overflow, so if |validNumber| is not true, then set |number| to the
|
| - // maximum int value.
|
| - if (!digits.isEmpty() && !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 digits.length();
|
| + return numDigits;
|
| }
|
|
|
| String VTTParser::collectWord(const String& input, unsigned* position)
|
| @@ -91,21 +100,22 @@ float VTTParser::parseFloatPercentageValue(const String& value, bool& isValidSet
|
| }
|
|
|
| unsigned position = 0;
|
| -
|
| - StringBuilder floatNumberAsString;
|
| - floatNumberAsString.append(VTTParser::collectDigits(value, &position));
|
| -
|
| + unsigned digitsBeforeDot = scanDigits(value, &position);
|
| + unsigned digitsAfterDot = 0;
|
| if (value[position] == '.') {
|
| - floatNumberAsString.append(".");
|
| position++;
|
|
|
| - floatNumberAsString.append(VTTParser::collectDigits(value, &position));
|
| + digitsAfterDot = scanDigits(value, &position);
|
| }
|
| - float number = floatNumberAsString.toString().toFloat(&isValidSetting);
|
|
|
| - if (isValidSetting && (number <= 0 || number >= 100))
|
| + // At least one digit required.
|
| + if (!digitsBeforeDot && !digitsAfterDot) {
|
| isValidSetting = false;
|
| + return 0;
|
| + }
|
|
|
| + float number = value.toFloat();
|
| + isValidSetting = number >= 0 && number <= 100;
|
| return number;
|
| }
|
|
|
|
|