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

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

Issue 118263002: Split out common parsing code for Position/Size VTT cue settings (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 if (name == sizeKeyword) 851 if (name == sizeKeyword)
852 return Size; 852 return Size;
853 if (name == alignKeyword) 853 if (name == alignKeyword)
854 return Align; 854 return Align;
855 if (RuntimeEnabledFeatures::webVTTRegionsEnabled() && name == regionIdKeywor d) 855 if (RuntimeEnabledFeatures::webVTTRegionsEnabled() && name == regionIdKeywor d)
856 return RegionId; 856 return RegionId;
857 857
858 return None; 858 return None;
859 } 859 }
860 860
861 // Used for 'position' and 'size'.
862 static bool scanPercentage(const String& input, unsigned* position, int& number)
863 {
864 ASSERT(position);
865 // 1. If value contains any characters other than U+0025 PERCENT SIGN
866 // characters (%) and characters in the range U+0030 DIGIT ZERO (0) to
867 // U+0039 DIGIT NINE (9), then jump to the step labeled next setting.
868 // 2. If value does not contain at least one character in the range U+0030
869 // DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump to the step
870 // labeled next setting.
871 if (!VTTParser::collectDigitsToInt(input, position, number))
872 return false;
873 if (*position >= input.length())
874 return false;
875
876 // 3. If any character in value other than the last character is a U+0025
877 // PERCENT SIGN character (%), then jump to the step labeled next
878 // setting.
879 // 4. If the last character in value is not a U+0025 PERCENT SIGN character
880 // (%), then jump to the step labeled next setting.
881 if (input[(*position)++] != '%')
882 return false;
883 if (*position < input.length() && !VTTParser::isValidSettingDelimiter(input[ *position]))
884 return false;
885
886 // 5. Ignoring the trailing percent sign, interpret value as an integer,
887 // and let number be that number.
888 // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to the step
889 // labeled next setting.
890 return number >= 0 && number <= 100;
891 }
892
861 void VTTCue::parseSettings(const String& input) 893 void VTTCue::parseSettings(const String& input)
862 { 894 {
863 unsigned position = 0; 895 unsigned position = 0;
864 896
865 while (position < input.length()) { 897 while (position < input.length()) {
866 898
867 // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order, 899 // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order,
868 // separated from each other by one or more U+0020 SPACE characters or U +0009 CHARACTER TABULATION (tab) characters. 900 // separated from each other by one or more U+0020 SPACE characters or U +0009 CHARACTER TABULATION (tab) characters.
869 while (position < input.length() && VTTParser::isValidSettingDelimiter(i nput[position])) 901 while (position < input.length() && VTTParser::isValidSettingDelimiter(i nput[position]))
870 position++; 902 position++;
(...skipping 16 matching lines...) Expand all
887 // 2. Let name be the leading substring of setting up to and excluding t he first U+003A COLON character (:) in that string. 919 // 2. Let name be the leading substring of setting up to and excluding t he first U+003A COLON character (:) in that string.
888 name = settingName(setting.substring(0, colonOffset)); 920 name = settingName(setting.substring(0, colonOffset));
889 921
890 // 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. 922 // 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.
891 position += colonOffset + 1; 923 position += colonOffset + 1;
892 if (position >= input.length()) 924 if (position >= input.length())
893 break; 925 break;
894 926
895 // 4. Run the appropriate substeps that apply for the value of name, as follows: 927 // 4. Run the appropriate substeps that apply for the value of name, as follows:
896 switch (name) { 928 switch (name) {
897 case Vertical: 929 case Vertical: {
898 {
899 // If name is a case-sensitive match for "vertical" 930 // If name is a case-sensitive match for "vertical"
900 // 1. If value is a case-sensitive match for the string "rl", then l et cue's text track cue writing direction 931 // 1. If value is a case-sensitive match for the string "rl", then l et cue's text track cue writing direction
901 // be vertical growing left. 932 // be vertical growing left.
902 String writingDirection = VTTParser::collectWord(input, &position); 933 String writingDirection = VTTParser::collectWord(input, &position);
903 if (writingDirection == verticalGrowingLeftKeyword()) 934 if (writingDirection == verticalGrowingLeftKeyword())
904 m_writingDirection = VerticalGrowingLeft; 935 m_writingDirection = VerticalGrowingLeft;
905 936
906 // 2. Otherwise, if value is a case-sensitive match for the string " lr", then let cue's text track cue writing 937 // 2. Otherwise, if value is a case-sensitive match for the string " lr", then let cue's text track cue writing
907 // direction be vertical growing right. 938 // direction be vertical growing right.
908 else if (writingDirection == verticalGrowingRightKeyword()) 939 else if (writingDirection == verticalGrowingRightKeyword())
909 m_writingDirection = VerticalGrowingRight; 940 m_writingDirection = VerticalGrowingRight;
910 }
911 break; 941 break;
912 case Line: 942 }
913 { 943 case Line: {
914 // 1-2 - Collect chars that are either '-', '%', or a digit. 944 // 1-2 - Collect chars that are either '-', '%', or a digit.
915 // 1. If value contains any characters other than U+002D HYPHEN-MINU S characters (-), U+0025 PERCENT SIGN 945 // 1. If value contains any characters other than U+002D HYPHEN-MINU S characters (-), U+0025 PERCENT SIGN
916 // characters (%), and characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump 946 // characters (%), and characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump
917 // to the step labeled next setting. 947 // to the step labeled next setting.
918 StringBuilder linePositionBuilder; 948 StringBuilder linePositionBuilder;
919 while (position < input.length() && (input[position] == '-' || input [position] == '%' || isASCIIDigit(input[position]))) 949 while (position < input.length() && (input[position] == '-' || input [position] == '%' || isASCIIDigit(input[position])))
920 linePositionBuilder.append(input[position++]); 950 linePositionBuilder.append(input[position++]);
921 if (position < input.length() && !VTTParser::isValidSettingDelimiter (input[position])) 951 if (position < input.length() && !VTTParser::isValidSettingDelimiter (input[position]))
922 break; 952 break;
923 953
(...skipping 27 matching lines...) Expand all
951 // snap-to-lines flag be false. Otherwise, let it be true. 981 // snap-to-lines flag be false. Otherwise, let it be true.
952 if (linePosition[linePosition.length() - 1] == '%') { 982 if (linePosition[linePosition.length() - 1] == '%') {
953 if (number < 0 || number > 100) 983 if (number < 0 || number > 100)
954 break; 984 break;
955 985
956 // 10 - If '%' then set snap-to-lines flag to false. 986 // 10 - If '%' then set snap-to-lines flag to false.
957 m_snapToLines = false; 987 m_snapToLines = false;
958 } 988 }
959 989
960 m_linePosition = number; 990 m_linePosition = number;
961 }
962 break; 991 break;
963 case Position: 992 }
964 { 993 case Position: {
965 // 1. If value contains any characters other than U+0025 PERCENT SIG N characters (%) and characters in the range
966 // U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump to t he step labeled next setting.
967 // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9),
968 // then jump to the step labeled next setting.
969 int number; 994 int number;
970 if (!VTTParser::collectDigitsToInt(input, &position, number)) 995 // Steps 1 - 6.
971 break; 996 if (!scanPercentage(input, &position, number))
972 if (position >= input.length())
973 break;
974
975 // 3. If any character in value other than the last character is a U +0025 PERCENT SIGN character (%), then jump
976 // to the step labeled next setting.
977 // 4. If the last character in value is not a U+0025 PERCENT SIGN ch aracter (%), then jump to the step labeled
978 // next setting.
979 if (input[position++] != '%')
980 break;
981 if (position < input.length() && !VTTParser::isValidSettingDelimiter (input[position]))
982 break;
983
984 // 5. Ignoring the trailing percent sign, interpret value as an inte ger, and let number be that number.
985 // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to t he step labeled next setting.
986 // NOTE: toInt ignores trailing non-digit characters, such as '%'.
987 if (number < 0 || number > 100)
988 break; 997 break;
989 998
990 // 7. Let cue's text track cue text position be number. 999 // 7. Let cue's text track cue text position be number.
991 m_textPosition = number; 1000 m_textPosition = number;
992 }
993 break; 1001 break;
994 case Size: 1002 }
995 { 1003 case Size: {
996 // 1. If value contains any characters other than U+0025 PERCENT SIG N characters (%) and characters in the
997 // range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jum p to the step labeled next setting.
998 // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT
999 // NINE (9), then jump to the step labeled next setting.
1000 int number; 1004 int number;
1001 if (!VTTParser::collectDigitsToInt(input, &position, number)) 1005 // Steps 1 - 6.
1002 break; 1006 if (!scanPercentage(input, &position, number))
1003 if (position >= input.length())
1004 break;
1005
1006 // 3. If any character in value other than the last character is a U +0025 PERCENT SIGN character (%),
1007 // then jump to the step labeled next setting.
1008 // 4. If the last character in value is not a U+0025 PERCENT SIGN ch aracter (%), then jump to the step
1009 // labeled next setting.
1010 if (input[position++] != '%')
1011 break;
1012 if (position < input.length() && !VTTParser::isValidSettingDelimiter (input[position]))
1013 break;
1014
1015 // 5. Ignoring the trailing percent sign, interpret value as an inte ger, and let number be that number.
1016 // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to t he step labeled next setting.
1017 if (number < 0 || number > 100)
1018 break; 1007 break;
1019 1008
1020 // 7. Let cue's text track cue size be number. 1009 // 7. Let cue's text track cue size be number.
1021 m_cueSize = number; 1010 m_cueSize = number;
1022 }
1023 break; 1011 break;
1024 case Align: 1012 }
1025 { 1013 case Align: {
1026 String cueAlignment = VTTParser::collectWord(input, &position); 1014 String cueAlignment = VTTParser::collectWord(input, &position);
1027 1015
1028 // 1. If value is a case-sensitive match for the string "start", the n let cue's text track cue alignment be start alignment. 1016 // 1. If value is a case-sensitive match for the string "start", the n let cue's text track cue alignment be start alignment.
1029 if (cueAlignment == startKeyword()) 1017 if (cueAlignment == startKeyword())
1030 m_cueAlignment = Start; 1018 m_cueAlignment = Start;
1031 1019
1032 // 2. If value is a case-sensitive match for the string "middle", th en let cue's text track cue alignment be middle alignment. 1020 // 2. If value is a case-sensitive match for the string "middle", th en let cue's text track cue alignment be middle alignment.
1033 else if (cueAlignment == middleKeyword()) 1021 else if (cueAlignment == middleKeyword())
1034 m_cueAlignment = Middle; 1022 m_cueAlignment = Middle;
1035 1023
1036 // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment. 1024 // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment.
1037 else if (cueAlignment == endKeyword()) 1025 else if (cueAlignment == endKeyword())
1038 m_cueAlignment = End; 1026 m_cueAlignment = End;
1039 1027
1040 // 4. If value is a case-sensitive match for the string "left", then let cue's text track cue alignment be left alignment. 1028 // 4. If value is a case-sensitive match for the string "left", then let cue's text track cue alignment be left alignment.
1041 else if (cueAlignment == leftKeyword()) 1029 else if (cueAlignment == leftKeyword())
1042 m_cueAlignment = Left; 1030 m_cueAlignment = Left;
1043 1031
1044 // 5. If value is a case-sensitive match for the string "right", the n let cue's text track cue alignment be right alignment. 1032 // 5. If value is a case-sensitive match for the string "right", the n let cue's text track cue alignment be right alignment.
1045 else if (cueAlignment == rightKeyword()) 1033 else if (cueAlignment == rightKeyword())
1046 m_cueAlignment = Right; 1034 m_cueAlignment = Right;
1047 }
1048 break; 1035 break;
1036 }
1049 case RegionId: 1037 case RegionId:
1050 m_regionId = VTTParser::collectWord(input, &position); 1038 m_regionId = VTTParser::collectWord(input, &position);
1051 break; 1039 break;
1052 case None: 1040 case None:
1053 break; 1041 break;
1054 } 1042 }
1055 1043
1056 NextSetting: 1044 NextSetting:
1057 position = endOfSetting; 1045 position = endOfSetting;
1058 } 1046 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 return m_cueBackgroundBox->executionContext(); 1089 return m_cueBackgroundBox->executionContext();
1102 } 1090 }
1103 1091
1104 Document& VTTCue::document() const 1092 Document& VTTCue::document() const
1105 { 1093 {
1106 ASSERT(m_cueBackgroundBox); 1094 ASSERT(m_cueBackgroundBox);
1107 return m_cueBackgroundBox->document(); 1095 return m_cueBackgroundBox->document();
1108 } 1096 }
1109 1097
1110 } // namespace WebCore 1098 } // namespace WebCore
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698