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

Side by Side Diff: Source/core/html/track/vtt/VTTCue.cpp

Issue 864043002: WebVTT: Support fractional percentage values for position/line/size (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013, Opera Software ASA. All rights reserved. 2 * Copyright (c) 2013, Opera Software ASA. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 else if (input.scan("align")) 961 else if (input.scan("align"))
962 parsedSetting = Align; 962 parsedSetting = Align;
963 else if (RuntimeEnabledFeatures::webVTTRegionsEnabled() && input.scan("regio n")) 963 else if (RuntimeEnabledFeatures::webVTTRegionsEnabled() && input.scan("regio n"))
964 parsedSetting = RegionId; 964 parsedSetting = RegionId;
965 // Verify that a ':' follows. 965 // Verify that a ':' follows.
966 if (parsedSetting != None && input.scan(':')) 966 if (parsedSetting != None && input.scan(':'))
967 return parsedSetting; 967 return parsedSetting;
968 return None; 968 return None;
969 } 969 }
970 970
971 // Used for 'position' and 'size'. 971 static bool scanPercentage(VTTScanner& input, float& number)
972 static bool scanPercentage(VTTScanner& input, const VTTScanner::Run& valueRun, i nt& number)
973 { 972 {
974 // 1. If value contains any characters other than U+0025 PERCENT SIGN 973 // http://dev.w3.org/html5/webvtt/#dfn-parse-a-percentage-string
975 // characters (%) and characters in the range U+0030 DIGIT ZERO (0) to
976 // U+0039 DIGIT NINE (9), then jump to the step labeled next setting.
977 // 2. If value does not contain at least one character in the range U+0030
978 // DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump to the step
979 // labeled next setting.
980 if (!input.scanDigits(number))
981 return false;
982 974
983 // 3. If any character in value other than the last character is a U+0025 975 // 1. Let input be the string being parsed.
984 // PERCENT SIGN character (%), then jump to the step labeled next 976 // 2. If input contains any characters other than U+0025 PERCENT SIGN
985 // setting. 977 // characters (%), U+002E DOT characters (.) and ASCII digits, then
986 // 4. If the last character in value is not a U+0025 PERCENT SIGN character 978 // fail.
987 // (%), then jump to the step labeled next setting. 979 // 3. If input does not contain at least one ASCII digit, then fail.
988 if (!input.scan('%') || !input.isAt(valueRun.end())) 980 // 4. If input contains more than one U+002E DOT character (.), then fail.
989 return false; 981 // 5. If any character in input other than the last character is a U+0025
990 982 // PERCENT SIGN character (%), then fail.
991 // 5. Ignoring the trailing percent sign, interpret value as an integer, 983 // 6. If the last character in input is not a U+0025 PERCENT SIGN character
992 // and let number be that number. 984 // (%), then fail.
993 // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to the step 985 // 7. Ignoring the trailing percent sign, interpret input as a real
994 // labeled next setting. 986 // number. Let that number be the percentage.
995 return number >= 0 && number <= 100; 987 // 8. If percentage is outside the range 0..100, then fail.
988 // 9. Return percentage.
989 return input.scanPercentage(number) && !isInvalidPercentage(number);
996 } 990 }
997 991
998 void VTTCue::parseSettings(const String& inputString) 992 void VTTCue::parseSettings(const String& inputString)
999 { 993 {
1000 VTTScanner input(inputString); 994 VTTScanner input(inputString);
1001 995
1002 while (!input.isAtEnd()) { 996 while (!input.isAtEnd()) {
1003 997
1004 // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order, 998 // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order,
1005 // separated from each other by one or more U+0020 SPACE characters or U +0009 CHARACTER TABULATION (tab) characters. 999 // separated from each other by one or more U+0020 SPACE characters or U +0009 CHARACTER TABULATION (tab) characters.
(...skipping 11 matching lines...) Expand all
1017 // 2. Let name be the leading substring of setting up to and excludin g the first U+003A COLON character (:) in that string. 1011 // 2. Let name be the leading substring of setting up to and excludin g the first U+003A COLON character (:) in that string.
1018 CueSetting name = settingName(input); 1012 CueSetting name = settingName(input);
1019 1013
1020 // 3. Let value be the trailing substring of setting starting from the c haracter immediately after the first U+003A COLON character (:) in that string. 1014 // 3. Let value be the trailing substring of setting starting from the c haracter immediately after the first U+003A COLON character (:) in that string.
1021 VTTScanner::Run valueRun = input.collectUntil<VTTParser::isValidSettingD elimiter>(); 1015 VTTScanner::Run valueRun = input.collectUntil<VTTParser::isValidSettingD elimiter>();
1022 1016
1023 // 4. Run the appropriate substeps that apply for the value of name, as follows: 1017 // 4. Run the appropriate substeps that apply for the value of name, as follows:
1024 switch (name) { 1018 switch (name) {
1025 case Vertical: { 1019 case Vertical: {
1026 // If name is a case-sensitive match for "vertical" 1020 // If name is a case-sensitive match for "vertical"
1027 // 1. If value is a case-sensitive match for the string "rl", then l et cue's text track cue writing direction 1021 // 1. If value is a case-sensitive match for the string "rl", then
1028 // be vertical growing left. 1022 // let cue's text track cue writing direction be vertical
1023 // growing left.
1029 if (input.scanRun(valueRun, verticalGrowingLeftKeyword())) 1024 if (input.scanRun(valueRun, verticalGrowingLeftKeyword()))
1030 m_writingDirection = VerticalGrowingLeft; 1025 m_writingDirection = VerticalGrowingLeft;
1031 1026
1032 // 2. Otherwise, if value is a case-sensitive match for the string " lr", then let cue's text track cue writing 1027 // 2. Otherwise, if value is a case-sensitive match for the string
1033 // direction be vertical growing right. 1028 // "lr", then let cue's text track cue writing direction be
1029 // vertical growing right.
1034 else if (input.scanRun(valueRun, verticalGrowingRightKeyword())) 1030 else if (input.scanRun(valueRun, verticalGrowingRightKeyword()))
1035 m_writingDirection = VerticalGrowingRight; 1031 m_writingDirection = VerticalGrowingRight;
1036 break; 1032 break;
1037 } 1033 }
1038 case Line: { 1034 case Line: {
1039 // 1-2 - Collect chars that are either '-', '%', or a digit. 1035 // If name is a case-sensitive match for "line"
1040 // 1. If value contains any characters other than U+002D HYPHEN-MINU S characters (-), U+0025 PERCENT SIGN 1036 // Steps 1 - 2 skipped.
1041 // characters (%), and characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump 1037 float number;
1042 // to the step labeled next setting. 1038 // 3. If linepos does not contain at least one ASCII digit, then
1043 bool isNegative = input.scan('-'); 1039 // jump to the step labeled next setting.
1044 int linePosition; 1040 // 4. If the last character in linepos is a U+0025 PERCENT SIGN char acter (%)
1045 unsigned numDigits = input.scanDigits(linePosition); 1041 //
1046 bool isPercentage = input.scan('%'); 1042 // If parse a percentage string from linepos doesn't fail, let
1047 1043 // number be the returned percentage, otherwise jump to the step
1044 // labeled next setting.
1045 bool isPercentage = scanPercentage(input, number);
1046 if (!isPercentage) {
1047 // Otherwise
1048 //
1049 // 1. If linepos contains any characters other than U+002D
1050 // HYPHEN-MINUS characters (-) and ASCII digits, then jump to
1051 // the step labeled next setting.
1052 // 2. If any character in linepos other than the first character is
1053 // a U+002D HYPHEN-MINUS character (-), then jump to the step
1054 // labeled next setting.
1055 bool isNegative = input.scan('-');
1056 int intLinePosition;
1057 if (!input.scanDigits(intLinePosition))
1058 break;
1059 // 3. Interpret linepos as a (potentially signed) integer, and l et
1060 // number be that number.
1061 number = isNegative ? -intLinePosition : intLinePosition;
1062 }
1048 if (!input.isAt(valueRun.end())) 1063 if (!input.isAt(valueRun.end()))
philipj_slow 2015/01/22 10:31:03 Can you move this up closer to input.scanDigits? I
fs 2015/01/22 11:22:38 No, this is needed in both code-paths (scanPercent
1049 break; 1064 break;
1050 1065 // 5. Let cue's text track cue line position be number.
1051 // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT 1066 m_linePosition = number;
1052 // NINE (9), then jump to the step labeled next setting. 1067 // 6. If the last character in linepos is a U+0025 PERCENT SIGN
1053 // 3. If any character in value other than the first character is a U+002D HYPHEN-MINUS character (-), then 1068 // character (%), then let cue's text track cue snap-to-lines
1054 // jump to the step labeled next setting. 1069 // flag be false. Otherwise, let it be true.
1055 // 4. If any character in value other than the last character is a U +0025 PERCENT SIGN character (%), then 1070 m_snapToLines = !isPercentage;
1056 // jump to the step labeled next setting. 1071 // Steps 7 - 9 skipped.
1057
1058 // 5. If the first character in value is a U+002D HYPHEN-MINUS chara cter (-) and the last character in value is a
1059 // U+0025 PERCENT SIGN character (%), then jump to the step label ed next setting.
1060 if (!numDigits || (isPercentage && isNegative))
1061 break;
1062
1063 // 6. Ignoring the trailing percent sign, if any, interpret value as a (potentially signed) integer, and
1064 // let number be that number.
1065 // 7. If the last character in value is a U+0025 PERCENT SIGN charac ter (%), but number is not in the range
1066 // 0 ≤ number ≤ 100, then jump to the step labeled next setting.
1067 // 8. Let cue's text track cue line position be number.
1068 // 9. If the last character in value is a U+0025 PERCENT SIGN charac ter (%), then let cue's text track cue
1069 // snap-to-lines flag be false. Otherwise, let it be true.
1070 if (isPercentage) {
1071 if (linePosition < 0 || linePosition > 100)
1072 break;
1073 // 10 - If '%' then set snap-to-lines flag to false.
1074 m_snapToLines = false;
1075 } else {
1076 if (isNegative)
1077 linePosition = -linePosition;
1078 m_snapToLines = true;
1079 }
1080 m_linePosition = linePosition;
1081 break; 1072 break;
1082 } 1073 }
1083 case Position: { 1074 case Position: {
1084 int number; 1075 // If name is a case-sensitive match for "position".
1085 // Steps 1 - 6. 1076 float number;
1086 if (!scanPercentage(input, valueRun, number)) 1077 // Steps 1 - 2 skipped.
1078 // 3. If parse a percentage string from colpos doesn't fail, let
1079 // number be the returned percentage, otherwise jump to the step
1080 // labeled next setting (text track cue text position's value
1081 // remains the special value auto).
1082 if (!scanPercentage(input, number))
1087 break; 1083 break;
1088 1084 if (!input.isAt(valueRun.end()))
philipj_slow 2015/01/22 10:31:03 I think scanPercentage takes care of this case and
fs 2015/01/22 11:22:38 It used to, but no longer does.
1089 // 7. Let cue's text track cue text position be number. 1085 break;
1086 // 4. Let cue's text track cue text position be number.
1090 m_textPosition = number; 1087 m_textPosition = number;
1088 // Steps 5 - 7 skipped.
1091 break; 1089 break;
1092 } 1090 }
1093 case Size: { 1091 case Size: {
1094 int number; 1092 // If name is a case-sensitive match for "size"
1095 // Steps 1 - 6. 1093 float number;
1096 if (!scanPercentage(input, valueRun, number)) 1094 // 1. If parse a percentage string from value doesn't fail, let
1095 // number be the returned percentage, otherwise jump to the step
1096 // labeled next setting.
1097 if (!scanPercentage(input, number))
1097 break; 1098 break;
1098 1099 if (!input.isAt(valueRun.end()))
1099 // 7. Let cue's text track cue size be number. 1100 break;
1101 // 2. Let cue's text track cue size be number.
1100 m_cueSize = number; 1102 m_cueSize = number;
1101 break; 1103 break;
1102 } 1104 }
1103 case Align: { 1105 case Align: {
1104 // 1. If value is a case-sensitive match for the string "start", the n let cue's text track cue alignment be start alignment. 1106 // If name is a case-sensitive match for "align"
1107 // 1. If value is a case-sensitive match for the string "start",
1108 // then let cue's text track cue alignment be start alignment.
1105 if (input.scanRun(valueRun, startKeyword())) 1109 if (input.scanRun(valueRun, startKeyword()))
1106 m_cueAlignment = Start; 1110 m_cueAlignment = Start;
1107 1111
1108 // 2. If value is a case-sensitive match for the string "middle", th en let cue's text track cue alignment be middle alignment. 1112 // 2. If value is a case-sensitive match for the string "middle",
1113 // then let cue's text track cue alignment be middle alignment.
1109 else if (input.scanRun(valueRun, middleKeyword())) 1114 else if (input.scanRun(valueRun, middleKeyword()))
1110 m_cueAlignment = Middle; 1115 m_cueAlignment = Middle;
1111 1116
1112 // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment. 1117 // 3. If value is a case-sensitive match for the string "end", then
1118 // let cue's text track cue alignment be end alignment.
1113 else if (input.scanRun(valueRun, endKeyword())) 1119 else if (input.scanRun(valueRun, endKeyword()))
1114 m_cueAlignment = End; 1120 m_cueAlignment = End;
1115 1121
1116 // 4. If value is a case-sensitive match for the string "left", then let cue's text track cue alignment be left alignment. 1122 // 4. If value is a case-sensitive match for the string "left",
1123 // then let cue's text track cue alignment be left alignment.
1117 else if (input.scanRun(valueRun, leftKeyword())) 1124 else if (input.scanRun(valueRun, leftKeyword()))
1118 m_cueAlignment = Left; 1125 m_cueAlignment = Left;
1119 1126
1120 // 5. If value is a case-sensitive match for the string "right", the n let cue's text track cue alignment be right alignment. 1127 // 5. If value is a case-sensitive match for the string "right",
1128 // then let cue's text track cue alignment be right alignment.
1121 else if (input.scanRun(valueRun, rightKeyword())) 1129 else if (input.scanRun(valueRun, rightKeyword()))
1122 m_cueAlignment = Right; 1130 m_cueAlignment = Right;
1123 break; 1131 break;
1124 } 1132 }
1125 case RegionId: 1133 case RegionId:
1126 m_regionId = input.extractString(valueRun); 1134 m_regionId = input.extractString(valueRun);
1127 break; 1135 break;
1128 case None: 1136 case None:
1129 break; 1137 break;
1130 } 1138 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 1194
1187 void VTTCue::trace(Visitor* visitor) 1195 void VTTCue::trace(Visitor* visitor)
1188 { 1196 {
1189 visitor->trace(m_vttNodeTree); 1197 visitor->trace(m_vttNodeTree);
1190 visitor->trace(m_cueBackgroundBox); 1198 visitor->trace(m_cueBackgroundBox);
1191 visitor->trace(m_displayTree); 1199 visitor->trace(m_displayTree);
1192 TextTrackCue::trace(visitor); 1200 TextTrackCue::trace(visitor);
1193 } 1201 }
1194 1202
1195 } // namespace blink 1203 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698