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

Side by Side Diff: third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp

Issue 1506983002: Cleanup CSSPropertyParser some more (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Patch for landing Created 5 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 | « third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp ('k') | 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) 2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
9 * Copyright (C) 2012 Intel Corporation. All rights reserved. 9 * Copyright (C) 2012 Intel Corporation. All rights reserved.
10 * 10 *
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "core/css/CSSPropertyMetadata.h" 42 #include "core/css/CSSPropertyMetadata.h"
43 #include "core/css/CSSQuadValue.h" 43 #include "core/css/CSSQuadValue.h"
44 #include "core/css/CSSReflectValue.h" 44 #include "core/css/CSSReflectValue.h"
45 #include "core/css/CSSShadowValue.h" 45 #include "core/css/CSSShadowValue.h"
46 #include "core/css/CSSStringValue.h" 46 #include "core/css/CSSStringValue.h"
47 #include "core/css/CSSTimingFunctionValue.h" 47 #include "core/css/CSSTimingFunctionValue.h"
48 #include "core/css/CSSURIValue.h" 48 #include "core/css/CSSURIValue.h"
49 #include "core/css/CSSValuePair.h" 49 #include "core/css/CSSValuePair.h"
50 #include "core/css/CSSValuePool.h" 50 #include "core/css/CSSValuePool.h"
51 #include "core/css/CSSVariableReferenceValue.h" 51 #include "core/css/CSSVariableReferenceValue.h"
52 #include "core/css/HashTools.h"
53 #include "core/css/parser/CSSParserFastPaths.h" 52 #include "core/css/parser/CSSParserFastPaths.h"
54 #include "core/css/parser/CSSParserValues.h" 53 #include "core/css/parser/CSSParserValues.h"
55 #include "core/frame/UseCounter.h" 54 #include "core/frame/UseCounter.h"
56 #include "core/style/GridCoordinate.h" 55 #include "core/style/GridCoordinate.h"
57 #include "platform/RuntimeEnabledFeatures.h" 56 #include "platform/RuntimeEnabledFeatures.h"
58 57
59 namespace blink { 58 namespace blink {
60 59
61 template <unsigned N> 60 template <unsigned N>
62 static bool equalIgnoringCase(const CSSParserString& a, const char (&b)[N]) 61 static bool equalIgnoringCase(const CSSParserString& a, const char (&b)[N])
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 valueList->next(); 266 valueList->next();
268 return true; 267 return true;
269 } 268 }
270 269
271 static inline bool isForwardSlashOperator(CSSParserValue* value) 270 static inline bool isForwardSlashOperator(CSSParserValue* value)
272 { 271 {
273 ASSERT(value); 272 ASSERT(value);
274 return value->m_unit == CSSParserValue::Operator && value->iValue == '/'; 273 return value->m_unit == CSSParserValue::Operator && value->iValue == '/';
275 } 274 }
276 275
277 static bool isGeneratedImageValue(CSSValueID id)
278 {
279 return id == CSSValueLinearGradient || id == CSSValueRadialGradient
280 || id == CSSValueRepeatingLinearGradient || id == CSSValueRepeatingRadia lGradient
281 || id == CSSValueWebkitLinearGradient || id == CSSValueWebkitRadialGradi ent
282 || id == CSSValueWebkitRepeatingLinearGradient || id == CSSValueWebkitRe peatingRadialGradient
283 || id == CSSValueWebkitGradient || id == CSSValueWebkitCrossFade;
284 }
285
286 inline PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseValidPr imitive(CSSValueID identifier, CSSParserValue* value) 276 inline PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseValidPr imitive(CSSValueID identifier, CSSParserValue* value)
287 { 277 {
288 if (identifier) 278 if (identifier)
289 return cssValuePool().createIdentifierValue(identifier); 279 return cssValuePool().createIdentifierValue(identifier);
290 if (value->unit() >= CSSPrimitiveValue::UnitType::Number && value->unit() <= CSSPrimitiveValue::UnitType::Kilohertz) 280 if (value->unit() >= CSSPrimitiveValue::UnitType::Number && value->unit() <= CSSPrimitiveValue::UnitType::Kilohertz)
291 return createPrimitiveNumericValue(value); 281 return createPrimitiveNumericValue(value);
292 if (value->unit() >= CSSPrimitiveValue::UnitType::Turns && value->unit() <= CSSPrimitiveValue::UnitType::Chs) 282 if (value->unit() >= CSSPrimitiveValue::UnitType::Turns && value->unit() <= CSSPrimitiveValue::UnitType::Chs)
293 return createPrimitiveNumericValue(value); 283 return createPrimitiveNumericValue(value);
294 if (value->unit() >= CSSPrimitiveValue::UnitType::ViewportWidth && value->un it() <= CSSPrimitiveValue::UnitType::ViewportMax) 284 if (value->unit() >= CSSPrimitiveValue::UnitType::ViewportWidth && value->un it() <= CSSPrimitiveValue::UnitType::ViewportMax)
295 return createPrimitiveNumericValue(value); 285 return createPrimitiveNumericValue(value);
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 if (!args) 1287 if (!args)
1298 return nullptr; 1288 return nullptr;
1299 if (val->function->id == CSSValueAttr) { 1289 if (val->function->id == CSSValueAttr) {
1300 parsedValue = parseAttr(args); 1290 parsedValue = parseAttr(args);
1301 } else if (val->function->id == CSSValueCounter) { 1291 } else if (val->function->id == CSSValueCounter) {
1302 parsedValue = parseCounterContent(args, false); 1292 parsedValue = parseCounterContent(args, false);
1303 } else if (val->function->id == CSSValueCounters) { 1293 } else if (val->function->id == CSSValueCounters) {
1304 parsedValue = parseCounterContent(args, true); 1294 parsedValue = parseCounterContent(args, true);
1305 } else if (val->function->id == CSSValueWebkitImageSet) { 1295 } else if (val->function->id == CSSValueWebkitImageSet) {
1306 parsedValue = parseImageSet(m_valueList); 1296 parsedValue = parseImageSet(m_valueList);
1307 } else if (isGeneratedImageValue(val->function->id)) { 1297 } else if (CSSPropertyParser::isGeneratedImage(val->function->id)) {
1308 if (!parseGeneratedImage(m_valueList, parsedValue)) 1298 if (!parseGeneratedImage(m_valueList, parsedValue))
1309 return nullptr; 1299 return nullptr;
1310 } 1300 }
1311 } else if (val->m_unit == CSSParserValue::Identifier) { 1301 } else if (val->m_unit == CSSParserValue::Identifier) {
1312 switch (val->id) { 1302 switch (val->id) {
1313 case CSSValueOpenQuote: 1303 case CSSValueOpenQuote:
1314 case CSSValueCloseQuote: 1304 case CSSValueCloseQuote:
1315 case CSSValueNoOpenQuote: 1305 case CSSValueNoOpenQuote:
1316 case CSSValueNoCloseQuote: 1306 case CSSValueNoCloseQuote:
1317 case CSSValueNone: 1307 case CSSValueNone:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 return nullptr; 1340 return nullptr;
1351 1341
1352 if (m_context.isHTMLDocument()) 1342 if (m_context.isHTMLDocument())
1353 attrName = attrName.lower(); 1343 attrName = attrName.lower();
1354 1344
1355 RefPtrWillBeRawPtr<CSSFunctionValue> attrValue = CSSFunctionValue::create(CS SValueAttr); 1345 RefPtrWillBeRawPtr<CSSFunctionValue> attrValue = CSSFunctionValue::create(CS SValueAttr);
1356 attrValue->append(CSSCustomIdentValue::create(attrName)); 1346 attrValue->append(CSSCustomIdentValue::create(attrName));
1357 return attrValue.release(); 1347 return attrValue.release();
1358 } 1348 }
1359 1349
1360 bool CSSPropertyParser::isColorKeyword(CSSValueID id)
1361 {
1362 // Named colors and color keywords:
1363 //
1364 // <named-color>
1365 // 'aqua', 'black', 'blue', ..., 'yellow' (CSS3: "basic color keywords")
1366 // 'aliceblue', ..., 'yellowgreen' (CSS3: "extended color keywords" )
1367 // 'transparent'
1368 //
1369 // 'currentcolor'
1370 //
1371 // <deprecated-system-color>
1372 // 'ActiveBorder', ..., 'WindowText'
1373 //
1374 // WebKit proprietary/internal:
1375 // '-webkit-link'
1376 // '-webkit-activelink'
1377 // '-internal-active-list-box-selection'
1378 // '-internal-active-list-box-selection-text'
1379 // '-internal-inactive-list-box-selection'
1380 // '-internal-inactive-list-box-selection-text'
1381 // '-webkit-focus-ring-color'
1382 // '-webkit-text'
1383 //
1384 return (id >= CSSValueAqua && id <= CSSValueWebkitText)
1385 || (id >= CSSValueAliceblue && id <= CSSValueYellowgreen)
1386 || id == CSSValueMenu;
1387 }
1388
1389 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseColor(const CSSParserVa lue* value, bool acceptQuirkyColors) 1350 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseColor(const CSSParserVa lue* value, bool acceptQuirkyColors)
1390 { 1351 {
1391 CSSValueID id = value->id; 1352 CSSValueID id = value->id;
1392 if (isColorKeyword(id)) { 1353 if (isColorKeyword(id)) {
1393 if (!isValueAllowedInMode(id, m_context.mode())) 1354 if (!isValueAllowedInMode(id, m_context.mode()))
1394 return nullptr; 1355 return nullptr;
1395 if (id == CSSValueWebkitText && m_context.useCounter()) 1356 if (id == CSSValueWebkitText && m_context.useCounter())
1396 m_context.useCounter()->count(UseCounter::WebkitTextInColorProperty) ; 1357 m_context.useCounter()->count(UseCounter::WebkitTextInColorProperty) ;
1397 return cssValuePool().createIdentifierValue(id); 1358 return cssValuePool().createIdentifierValue(id);
1398 } 1359 }
1399 RGBA32 c = Color::transparent; 1360 RGBA32 c = Color::transparent;
1400 if (!parseColorFromValue(value, c, acceptQuirkyColors)) 1361 if (!parseColorFromValue(value, c, acceptQuirkyColors))
1401 return nullptr; 1362 return nullptr;
1402 return cssValuePool().createColorValue(c); 1363 return cssValuePool().createColorValue(c);
1403 } 1364 }
1404 1365
1405 bool CSSPropertyParser::parseFillImage(CSSParserValueList* valueList, RefPtrWill BeRawPtr<CSSValue>& value) 1366 bool CSSPropertyParser::parseFillImage(CSSParserValueList* valueList, RefPtrWill BeRawPtr<CSSValue>& value)
1406 { 1367 {
1407 if (valueList->current()->id == CSSValueNone) { 1368 if (valueList->current()->id == CSSValueNone) {
1408 value = cssValuePool().createIdentifierValue(CSSValueNone); 1369 value = cssValuePool().createIdentifierValue(CSSValueNone);
1409 return true; 1370 return true;
1410 } 1371 }
1411 if (valueList->current()->m_unit == CSSParserValue::URI) { 1372 if (valueList->current()->m_unit == CSSParserValue::URI) {
1412 value = createCSSImageValueWithReferrer(valueList->current()->string, m_ context); 1373 value = createCSSImageValueWithReferrer(valueList->current()->string, m_ context);
1413 return true; 1374 return true;
1414 } 1375 }
1415 1376
1416 if (valueList->current()->m_unit == CSSParserValue::Function) { 1377 if (valueList->current()->m_unit == CSSParserValue::Function) {
1417 if (isGeneratedImageValue(valueList->current()->function->id)) 1378 if (CSSPropertyParser::isGeneratedImage(valueList->current()->function-> id))
1418 return parseGeneratedImage(valueList, value); 1379 return parseGeneratedImage(valueList, value);
1419 1380
1420 if (valueList->current()->function->id == CSSValueWebkitImageSet) { 1381 if (valueList->current()->function->id == CSSValueWebkitImageSet) {
1421 value = parseImageSet(m_valueList); 1382 value = parseImageSet(m_valueList);
1422 if (value) 1383 if (value)
1423 return true; 1384 return true;
1424 } 1385 }
1425 } 1386 }
1426 1387
1427 return false; 1388 return false;
(...skipping 2319 matching lines...) Expand 10 before | Expand all | Expand 10 after
3747 while (CSSParserValue* val = m_valueList->current()) { 3708 while (CSSParserValue* val = m_valueList->current()) {
3748 context.setCanAdvance(false); 3709 context.setCanAdvance(false);
3749 3710
3750 if (!context.canAdvance() && context.allowForwardSlashOperator() && isFo rwardSlashOperator(val)) 3711 if (!context.canAdvance() && context.allowForwardSlashOperator() && isFo rwardSlashOperator(val))
3751 context.commitForwardSlashOperator(); 3712 context.commitForwardSlashOperator();
3752 3713
3753 if (!context.canAdvance() && context.allowImage()) { 3714 if (!context.canAdvance() && context.allowImage()) {
3754 if (val->m_unit == CSSParserValue::URI) { 3715 if (val->m_unit == CSSParserValue::URI) {
3755 context.commitImage(createCSSImageValueWithReferrer(val->string, m_context)); 3716 context.commitImage(createCSSImageValueWithReferrer(val->string, m_context));
3756 } else if (val->m_unit == CSSParserValue::Function) { 3717 } else if (val->m_unit == CSSParserValue::Function) {
3757 if (isGeneratedImageValue(val->function->id)) { 3718 if (CSSPropertyParser::isGeneratedImage(val->function->id)) {
3758 RefPtrWillBeRawPtr<CSSValue> value = nullptr; 3719 RefPtrWillBeRawPtr<CSSValue> value = nullptr;
3759 if (parseGeneratedImage(m_valueList, value)) 3720 if (parseGeneratedImage(m_valueList, value))
3760 context.commitImage(value.release()); 3721 context.commitImage(value.release());
3761 else 3722 else
3762 return false; 3723 return false;
3763 } else if (val->function->id == CSSValueWebkitImageSet) { 3724 } else if (val->function->id == CSSValueWebkitImageSet) {
3764 RefPtrWillBeRawPtr<CSSValue> value = parseImageSet(m_valueLi st); 3725 RefPtrWillBeRawPtr<CSSValue> value = parseImageSet(m_valueLi st);
3765 if (value) 3726 if (value)
3766 context.commitImage(value.release()); 3727 context.commitImage(value.release());
3767 else 3728 else
(...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after
4976 4937
4977 ASSERT(!m_parsedCalculation); 4938 ASSERT(!m_parsedCalculation);
4978 m_parsedCalculation = CSSCalcValue::create(args, range); 4939 m_parsedCalculation = CSSCalcValue::create(args, range);
4979 4940
4980 if (!m_parsedCalculation) 4941 if (!m_parsedCalculation)
4981 return false; 4942 return false;
4982 4943
4983 return true; 4944 return true;
4984 } 4945 }
4985 4946
4986 template <typename CharacterType>
4987 static CSSPropertyID unresolvedCSSPropertyID(const CharacterType* propertyName, unsigned length)
4988 {
4989 char buffer[maxCSSPropertyNameLength + 1]; // 1 for null character
4990
4991 for (unsigned i = 0; i != length; ++i) {
4992 CharacterType c = propertyName[i];
4993 if (c == 0 || c >= 0x7F)
4994 return CSSPropertyInvalid; // illegal character
4995 buffer[i] = toASCIILower(c);
4996 }
4997 buffer[length] = '\0';
4998
4999 const char* name = buffer;
5000 const Property* hashTableEntry = findProperty(name, length);
5001 if (!hashTableEntry)
5002 return CSSPropertyInvalid;
5003 CSSPropertyID property = static_cast<CSSPropertyID>(hashTableEntry->id);
5004 if (!CSSPropertyMetadata::isEnabledProperty(property))
5005 return CSSPropertyInvalid;
5006 return property;
5007 }
5008
5009 CSSPropertyID unresolvedCSSPropertyID(const String& string)
5010 {
5011 unsigned length = string.length();
5012
5013 if (!length)
5014 return CSSPropertyInvalid;
5015 if (length > maxCSSPropertyNameLength)
5016 return CSSPropertyInvalid;
5017
5018 return string.is8Bit() ? unresolvedCSSPropertyID(string.characters8(), lengt h) : unresolvedCSSPropertyID(string.characters16(), length);
5019 }
5020
5021 CSSPropertyID unresolvedCSSPropertyID(const CSSParserString& string)
5022 {
5023 unsigned length = string.length();
5024
5025 if (!length)
5026 return CSSPropertyInvalid;
5027 if (length > maxCSSPropertyNameLength)
5028 return CSSPropertyInvalid;
5029
5030 return string.is8Bit() ? unresolvedCSSPropertyID(string.characters8(), lengt h) : unresolvedCSSPropertyID(string.characters16(), length);
5031 }
5032
5033 template <typename CharacterType>
5034 static CSSValueID cssValueKeywordID(const CharacterType* valueKeyword, unsigned length)
5035 {
5036 char buffer[maxCSSValueKeywordLength + 1]; // 1 for null character
5037
5038 for (unsigned i = 0; i != length; ++i) {
5039 CharacterType c = valueKeyword[i];
5040 if (c == 0 || c >= 0x7F)
5041 return CSSValueInvalid; // illegal character
5042 buffer[i] = WTF::toASCIILower(c);
5043 }
5044 buffer[length] = '\0';
5045
5046 const Value* hashTableEntry = findValue(buffer, length);
5047 return hashTableEntry ? static_cast<CSSValueID>(hashTableEntry->id) : CSSVal ueInvalid;
5048 }
5049
5050 CSSValueID cssValueKeywordID(const CSSParserString& string)
5051 {
5052 unsigned length = string.length();
5053 if (!length)
5054 return CSSValueInvalid;
5055 if (length > maxCSSValueKeywordLength)
5056 return CSSValueInvalid;
5057
5058 return string.is8Bit() ? cssValueKeywordID(string.characters8(), length) : c ssValueKeywordID(string.characters16(), length);
5059 }
5060
5061 bool CSSPropertyParser::isSystemColor(CSSValueID id)
5062 {
5063 return (id >= CSSValueActiveborder && id <= CSSValueWindowtext) || id == CSS ValueMenu;
5064 }
5065
5066 } // namespace blink 4947 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698