OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/css/parser/CSSPropertyParserHelpers.h" | 5 #include "core/css/parser/CSSPropertyParserHelpers.h" |
6 | 6 |
7 #include "core/css/CSSCalculationValue.h" | 7 #include "core/css/CSSCalculationValue.h" |
8 #include "core/css/CSSColorValue.h" | 8 #include "core/css/CSSColorValue.h" |
9 #include "core/css/CSSCrossfadeValue.h" | 9 #include "core/css/CSSCrossfadeValue.h" |
10 #include "core/css/CSSGradientValue.h" | 10 #include "core/css/CSSGradientValue.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 RefPtr<CSSVariableData> unparsedCSSVariableData = | 34 RefPtr<CSSVariableData> unparsedCSSVariableData = |
35 CSSVariableData::create(tokenRange, false, false); | 35 CSSVariableData::create(tokenRange, false, false); |
36 if (unparsedCSSVariableData.get()) { | 36 if (unparsedCSSVariableData.get()) { |
37 variableData->push_back(std::move(unparsedCSSVariableData)); | 37 variableData->push_back(std::move(unparsedCSSVariableData)); |
38 return true; | 38 return true; |
39 } | 39 } |
40 } | 40 } |
41 return false; | 41 return false; |
42 } | 42 } |
43 | 43 |
| 44 // Consume input arguments, if encounter function, will return the function |
| 45 // block as a Vector of CSSParserToken, otherwise, will just return a Vector of |
| 46 // a single CSSParserToken. |
| 47 Vector<CSSParserToken> consumeFunctionArgsOrNot(CSSParserTokenRange& args) { |
| 48 Vector<CSSParserToken> argumentTokens; |
| 49 if (args.peek().getBlockType() == CSSParserToken::BlockStart) { |
| 50 // Function block. |
| 51 // Push the function name and initial right parenthesis. |
| 52 // Since we don't have any upfront knowledge about the input argument types |
| 53 // here, we should just leave the token as it is and resolve it later in |
| 54 // the variable parsing phase. |
| 55 argumentTokens.push_back(args.peek()); |
| 56 CSSParserTokenRange contents = args.consumeBlock(); |
| 57 while (!contents.atEnd()) { |
| 58 argumentTokens.push_back(contents.consume()); |
| 59 } |
| 60 argumentTokens.push_back( |
| 61 CSSParserToken(RightParenthesisToken, CSSParserToken::BlockEnd)); |
| 62 |
| 63 } else { |
| 64 argumentTokens.push_back(args.consumeIncludingWhitespace()); |
| 65 } |
| 66 return argumentTokens; |
| 67 } |
| 68 |
44 } // namespace | 69 } // namespace |
45 | 70 |
46 void complete4Sides(CSSValue* side[4]) { | 71 void complete4Sides(CSSValue* side[4]) { |
47 if (side[3]) | 72 if (side[3]) |
48 return; | 73 return; |
49 if (!side[2]) { | 74 if (!side[2]) { |
50 if (!side[1]) | 75 if (!side[1]) |
51 side[1] = side[0]; | 76 side[1] = side[0]; |
52 side[2] = side[0]; | 77 side[2] = side[0]; |
53 } | 78 } |
(...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1158 | 1183 |
1159 if (!RuntimeEnabledFeatures::cssPaintAPIArgumentsEnabled()) { | 1184 if (!RuntimeEnabledFeatures::cssPaintAPIArgumentsEnabled()) { |
1160 // Arguments not enabled, but exists. Invalid. | 1185 // Arguments not enabled, but exists. Invalid. |
1161 return nullptr; | 1186 return nullptr; |
1162 } | 1187 } |
1163 | 1188 |
1164 // Begin parse paint arguments. | 1189 // Begin parse paint arguments. |
1165 if (!consumeCommaIncludingWhitespace(args)) | 1190 if (!consumeCommaIncludingWhitespace(args)) |
1166 return nullptr; | 1191 return nullptr; |
1167 | 1192 |
1168 // Consume arguments. Currently does not support complicated arguments | 1193 // Consume arguments. |
1169 // like function calls. | |
1170 // TODO(renjieliu): We may want to optimize the implementation by resolve | 1194 // TODO(renjieliu): We may want to optimize the implementation by resolve |
1171 // variables early if paint function is registered. | 1195 // variables early if paint function is registered. |
1172 Vector<CSSParserToken> argumentTokens; | 1196 Vector<CSSParserToken> argumentTokens; |
1173 Vector<RefPtr<CSSVariableData>> variableData; | 1197 Vector<RefPtr<CSSVariableData>> variableData; |
1174 while (!args.atEnd()) { | 1198 while (!args.atEnd()) { |
1175 if (args.peek().type() != CommaToken) { | 1199 if (args.peek().type() != CommaToken) { |
1176 argumentTokens.push_back(args.consumeIncludingWhitespace()); | 1200 argumentTokens.appendVector(consumeFunctionArgsOrNot(args)); |
1177 } else { | 1201 } else { |
1178 if (!addCSSPaintArgument(argumentTokens, &variableData)) | 1202 if (!addCSSPaintArgument(argumentTokens, &variableData)) |
1179 return nullptr; | 1203 return nullptr; |
1180 argumentTokens.clear(); | 1204 argumentTokens.clear(); |
1181 if (!consumeCommaIncludingWhitespace(args)) | 1205 if (!consumeCommaIncludingWhitespace(args)) |
1182 return nullptr; | 1206 return nullptr; |
1183 } | 1207 } |
1184 } | 1208 } |
1185 if (!addCSSPaintArgument(argumentTokens, &variableData)) | 1209 if (!addCSSPaintArgument(argumentTokens, &variableData)) |
1186 return nullptr; | 1210 return nullptr; |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1318 | 1342 |
1319 // https://drafts.csswg.org/css-shapes-1/#typedef-shape-box | 1343 // https://drafts.csswg.org/css-shapes-1/#typedef-shape-box |
1320 CSSIdentifierValue* consumeShapeBox(CSSParserTokenRange& range) { | 1344 CSSIdentifierValue* consumeShapeBox(CSSParserTokenRange& range) { |
1321 return consumeIdent<CSSValueContentBox, CSSValuePaddingBox, CSSValueBorderBox, | 1345 return consumeIdent<CSSValueContentBox, CSSValuePaddingBox, CSSValueBorderBox, |
1322 CSSValueMarginBox>(range); | 1346 CSSValueMarginBox>(range); |
1323 } | 1347 } |
1324 | 1348 |
1325 } // namespace CSSPropertyParserHelpers | 1349 } // namespace CSSPropertyParserHelpers |
1326 | 1350 |
1327 } // namespace blink | 1351 } // namespace blink |
OLD | NEW |