| Index: Source/core/html/track/vtt/VTTCue.cpp
|
| diff --git a/Source/core/html/track/vtt/VTTCue.cpp b/Source/core/html/track/vtt/VTTCue.cpp
|
| index cffb9c5a87db938c2625eedb99f2188f41149777..d8075d6b69cf4c96d6cd8f0eed0db0a4a8009d8b 100644
|
| --- a/Source/core/html/track/vtt/VTTCue.cpp
|
| +++ b/Source/core/html/track/vtt/VTTCue.cpp
|
| @@ -968,31 +968,25 @@ VTTCue::CueSetting VTTCue::settingName(VTTScanner& input)
|
| return None;
|
| }
|
|
|
| -// Used for 'position' and 'size'.
|
| -static bool scanPercentage(VTTScanner& input, const VTTScanner::Run& valueRun, int& number)
|
| +static bool scanPercentage(VTTScanner& input, float& number)
|
| {
|
| - // 1. If value contains any characters other than U+0025 PERCENT SIGN
|
| - // characters (%) and characters in the range U+0030 DIGIT ZERO (0) to
|
| - // U+0039 DIGIT NINE (9), then jump to the step labeled next setting.
|
| - // 2. If value does not contain at least one character in the range U+0030
|
| - // DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump to the step
|
| - // labeled next setting.
|
| - if (!input.scanDigits(number))
|
| - return false;
|
| -
|
| - // 3. If any character in value other than the last character is a U+0025
|
| - // PERCENT SIGN character (%), then jump to the step labeled next
|
| - // setting.
|
| - // 4. If the last character in value is not a U+0025 PERCENT SIGN character
|
| - // (%), then jump to the step labeled next setting.
|
| - if (!input.scan('%') || !input.isAt(valueRun.end()))
|
| - return false;
|
| -
|
| - // 5. Ignoring the trailing percent sign, interpret value as an integer,
|
| - // and let number be that number.
|
| - // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to the step
|
| - // labeled next setting.
|
| - return number >= 0 && number <= 100;
|
| + // http://dev.w3.org/html5/webvtt/#dfn-parse-a-percentage-string
|
| +
|
| + // 1. Let input be the string being parsed.
|
| + // 2. If input contains any characters other than U+0025 PERCENT SIGN
|
| + // characters (%), U+002E DOT characters (.) and ASCII digits, then
|
| + // fail.
|
| + // 3. If input does not contain at least one ASCII digit, then fail.
|
| + // 4. If input contains more than one U+002E DOT character (.), then fail.
|
| + // 5. If any character in input other than the last character is a U+0025
|
| + // PERCENT SIGN character (%), then fail.
|
| + // 6. If the last character in input is not a U+0025 PERCENT SIGN character
|
| + // (%), then fail.
|
| + // 7. Ignoring the trailing percent sign, interpret input as a real
|
| + // number. Let that number be the percentage.
|
| + // 8. If percentage is outside the range 0..100, then fail.
|
| + // 9. Return percentage.
|
| + return input.scanPercentage(number) && !isInvalidPercentage(number);
|
| }
|
|
|
| void VTTCue::parseSettings(const String& inputString)
|
| @@ -1024,100 +1018,114 @@ void VTTCue::parseSettings(const String& inputString)
|
| switch (name) {
|
| case Vertical: {
|
| // If name is a case-sensitive match for "vertical"
|
| - // 1. If value is a case-sensitive match for the string "rl", then let cue's text track cue writing direction
|
| - // be vertical growing left.
|
| + // 1. If value is a case-sensitive match for the string "rl", then
|
| + // let cue's text track cue writing direction be vertical
|
| + // growing left.
|
| if (input.scanRun(valueRun, verticalGrowingLeftKeyword()))
|
| m_writingDirection = VerticalGrowingLeft;
|
|
|
| - // 2. Otherwise, if value is a case-sensitive match for the string "lr", then let cue's text track cue writing
|
| - // direction be vertical growing right.
|
| + // 2. Otherwise, if value is a case-sensitive match for the string
|
| + // "lr", then let cue's text track cue writing direction be
|
| + // vertical growing right.
|
| else if (input.scanRun(valueRun, verticalGrowingRightKeyword()))
|
| m_writingDirection = VerticalGrowingRight;
|
| break;
|
| }
|
| case Line: {
|
| - // 1-2 - Collect chars that are either '-', '%', or a digit.
|
| - // 1. If value contains any characters other than U+002D HYPHEN-MINUS characters (-), U+0025 PERCENT SIGN
|
| - // characters (%), and characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump
|
| - // to the step labeled next setting.
|
| - bool isNegative = input.scan('-');
|
| - int linePosition;
|
| - unsigned numDigits = input.scanDigits(linePosition);
|
| - bool isPercentage = input.scan('%');
|
| -
|
| - if (!input.isAt(valueRun.end()))
|
| - break;
|
| -
|
| - // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT
|
| - // NINE (9), then jump to the step labeled next setting.
|
| - // 3. If any character in value other than the first character is a U+002D HYPHEN-MINUS character (-), then
|
| + // If name is a case-sensitive match for "line"
|
| + // Steps 1 - 2 skipped.
|
| + float number;
|
| + // 3. If linepos does not contain at least one ASCII digit, then
|
| // jump to the step labeled next setting.
|
| - // 4. If any character in value other than the last character is a U+0025 PERCENT SIGN character (%), then
|
| - // jump to the step labeled next setting.
|
| -
|
| - // 5. If the first character in value is a U+002D HYPHEN-MINUS character (-) and the last character in value is a
|
| - // U+0025 PERCENT SIGN character (%), then jump to the step labeled next setting.
|
| - if (!numDigits || (isPercentage && isNegative))
|
| - break;
|
| -
|
| - // 6. Ignoring the trailing percent sign, if any, interpret value as a (potentially signed) integer, and
|
| - // let number be that number.
|
| - // 7. If the last character in value is a U+0025 PERCENT SIGN character (%), but number is not in the range
|
| - // 0 ≤ number ≤ 100, then jump to the step labeled next setting.
|
| - // 8. Let cue's text track cue line position be number.
|
| - // 9. If the last character in value is a U+0025 PERCENT SIGN character (%), then let cue's text track cue
|
| - // snap-to-lines flag be false. Otherwise, let it be true.
|
| - if (isPercentage) {
|
| - if (linePosition < 0 || linePosition > 100)
|
| + // 4. If the last character in linepos is a U+0025 PERCENT SIGN character (%)
|
| + //
|
| + // If parse a percentage string from linepos doesn't fail, let
|
| + // number be the returned percentage, otherwise jump to the step
|
| + // labeled next setting.
|
| + bool isPercentage = scanPercentage(input, number);
|
| + if (!isPercentage) {
|
| + // Otherwise
|
| + //
|
| + // 1. If linepos contains any characters other than U+002D
|
| + // HYPHEN-MINUS characters (-) and ASCII digits, then jump to
|
| + // the step labeled next setting.
|
| + // 2. If any character in linepos other than the first character is
|
| + // a U+002D HYPHEN-MINUS character (-), then jump to the step
|
| + // labeled next setting.
|
| + bool isNegative = input.scan('-');
|
| + int intLinePosition;
|
| + if (!input.scanDigits(intLinePosition))
|
| break;
|
| - // 10 - If '%' then set snap-to-lines flag to false.
|
| - m_snapToLines = false;
|
| - } else {
|
| - if (isNegative)
|
| - linePosition = -linePosition;
|
| - m_snapToLines = true;
|
| + // 3. Interpret linepos as a (potentially signed) integer, and let
|
| + // number be that number.
|
| + number = isNegative ? -intLinePosition : intLinePosition;
|
| }
|
| - m_linePosition = linePosition;
|
| + if (!input.isAt(valueRun.end()))
|
| + break;
|
| + // 5. Let cue's text track cue line position be number.
|
| + m_linePosition = number;
|
| + // 6. If the last character in linepos is a U+0025 PERCENT SIGN
|
| + // character (%), then let cue's text track cue snap-to-lines
|
| + // flag be false. Otherwise, let it be true.
|
| + m_snapToLines = !isPercentage;
|
| + // Steps 7 - 9 skipped.
|
| break;
|
| }
|
| case Position: {
|
| - int number;
|
| - // Steps 1 - 6.
|
| - if (!scanPercentage(input, valueRun, number))
|
| + // If name is a case-sensitive match for "position".
|
| + float number;
|
| + // Steps 1 - 2 skipped.
|
| + // 3. If parse a percentage string from colpos doesn't fail, let
|
| + // number be the returned percentage, otherwise jump to the step
|
| + // labeled next setting (text track cue text position's value
|
| + // remains the special value auto).
|
| + if (!scanPercentage(input, number))
|
| break;
|
| -
|
| - // 7. Let cue's text track cue text position be number.
|
| + if (!input.isAt(valueRun.end()))
|
| + break;
|
| + // 4. Let cue's text track cue text position be number.
|
| m_textPosition = number;
|
| + // Steps 5 - 7 skipped.
|
| break;
|
| }
|
| case Size: {
|
| - int number;
|
| - // Steps 1 - 6.
|
| - if (!scanPercentage(input, valueRun, number))
|
| + // If name is a case-sensitive match for "size"
|
| + float number;
|
| + // 1. If parse a percentage string from value doesn't fail, let
|
| + // number be the returned percentage, otherwise jump to the step
|
| + // labeled next setting.
|
| + if (!scanPercentage(input, number))
|
| break;
|
| -
|
| - // 7. Let cue's text track cue size be number.
|
| + if (!input.isAt(valueRun.end()))
|
| + break;
|
| + // 2. Let cue's text track cue size be number.
|
| m_cueSize = number;
|
| break;
|
| }
|
| case Align: {
|
| - // 1. If value is a case-sensitive match for the string "start", then let cue's text track cue alignment be start alignment.
|
| + // If name is a case-sensitive match for "align"
|
| + // 1. If value is a case-sensitive match for the string "start",
|
| + // then let cue's text track cue alignment be start alignment.
|
| if (input.scanRun(valueRun, startKeyword()))
|
| m_cueAlignment = Start;
|
|
|
| - // 2. If value is a case-sensitive match for the string "middle", then let cue's text track cue alignment be middle alignment.
|
| + // 2. If value is a case-sensitive match for the string "middle",
|
| + // then let cue's text track cue alignment be middle alignment.
|
| else if (input.scanRun(valueRun, middleKeyword()))
|
| m_cueAlignment = Middle;
|
|
|
| - // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment.
|
| + // 3. If value is a case-sensitive match for the string "end", then
|
| + // let cue's text track cue alignment be end alignment.
|
| else if (input.scanRun(valueRun, endKeyword()))
|
| m_cueAlignment = End;
|
|
|
| - // 4. If value is a case-sensitive match for the string "left", then let cue's text track cue alignment be left alignment.
|
| + // 4. If value is a case-sensitive match for the string "left",
|
| + // then let cue's text track cue alignment be left alignment.
|
| else if (input.scanRun(valueRun, leftKeyword()))
|
| m_cueAlignment = Left;
|
|
|
| - // 5. If value is a case-sensitive match for the string "right", then let cue's text track cue alignment be right alignment.
|
| + // 5. If value is a case-sensitive match for the string "right",
|
| + // then let cue's text track cue alignment be right alignment.
|
| else if (input.scanRun(valueRun, rightKeyword()))
|
| m_cueAlignment = Right;
|
| break;
|
|
|