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

Unified Diff: Source/core/css/parser/CSSPropertyParser.cpp

Issue 1219463003: Dissect and clean up instances of color parsing in CSSPropertyParser (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Update handling of 'grey' in fast-path color parser. Created 5 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/parser/CSSPropertyParser.cpp
diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp
index e1f79d30d75d0cf1591f02e91a98c9279f57ece4..fe36ecb0c7b3ed2217e47b46665943e6f3aaaad7 100644
--- a/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/Source/core/css/parser/CSSPropertyParser.cpp
@@ -563,37 +563,9 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
case CSSPropertyWebkitTextFillColor:
case CSSPropertyWebkitTextStrokeColor:
ASSERT(propId != CSSPropertyTextDecorationColor || RuntimeEnabledFeatures::css3TextDecorationsEnabled());
-
- if ((id >= CSSValueAqua && id <= CSSValueWebkitText) || id == CSSValueMenu) {
- validPrimitive = isValueAllowedInMode(id, m_context.mode());
- } else {
- if (!inQuirksMode()) {
- parsedValue = parseColor();
- if (parsedValue)
- m_valueList->next();
- break;
- }
-
- bool acceptQuirkyColors = false;
- switch (propId) {
- case CSSPropertyBackgroundColor:
- case CSSPropertyBorderBottomColor:
- case CSSPropertyBorderLeftColor:
- case CSSPropertyBorderRightColor:
- case CSSPropertyBorderTopColor:
- if (!inShorthand() || m_currentShorthand == CSSPropertyBorderColor)
- acceptQuirkyColors = true;
- break;
- case CSSPropertyColor:
- acceptQuirkyColors = true;
- break;
- default:
- break;
- }
- parsedValue = parseColor(0, acceptQuirkyColors);
- if (parsedValue)
- m_valueList->next();
- }
+ parsedValue = parseColor(m_valueList->current(), acceptQuirkyColors(propId));
+ if (parsedValue)
+ m_valueList->next();
break;
case CSSPropertyCursor: {
@@ -1374,14 +1346,9 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
break;
case CSSPropertyWebkitTapHighlightColor:
- if ((id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu
- || (id >= CSSValueWebkitFocusRingColor && id < CSSValueWebkitText && inQuirksMode())) {
- validPrimitive = true;
- } else {
- parsedValue = parseColor();
- if (parsedValue)
- m_valueList->next();
- }
+ parsedValue = parseTapHighlightColor(m_valueList->current());
+ if (parsedValue)
+ m_valueList->next();
break;
/* shorthand properties */
@@ -2298,13 +2265,123 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseAttr(CSSParserValueList
return cssValuePool().createValue(attrName, CSSPrimitiveValue::CSS_ATTR);
}
-PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseBackgroundColor()
+bool CSSPropertyParser::acceptQuirkyColors(CSSPropertyID propertyId) const
{
- CSSValueID id = m_valueList->current()->id;
- if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu || id == CSSValueCurrentcolor ||
- (id >= CSSValueGrey && id < CSSValueWebkitText && inQuirksMode()))
+ if (!inQuirksMode())
+ return false;
+ switch (propertyId) {
+ case CSSPropertyBackgroundColor:
+ case CSSPropertyBorderBottomColor:
+ case CSSPropertyBorderLeftColor:
+ case CSSPropertyBorderRightColor:
+ case CSSPropertyBorderTopColor:
+ return !inShorthand() || m_currentShorthand == CSSPropertyBorderColor;
+ case CSSPropertyColor:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+bool CSSPropertyParser::isColorKeyword(CSSValueID id)
+{
+ // Named colors and color keywords:
+ //
+ // <named-color>
+ // 'aqua', 'black', 'blue', ..., 'yellow' (CSS3: "basic color keywords")
+ // 'aliceblue', ..., 'yellowgreen' (CSS3: "extended color keywords")
+ // 'transparent'
+ //
+ // 'currentcolor'
+ //
+ // <deprecated-system-color>
+ // 'ActiveBorder', ..., 'WindowText'
+ //
+ // WebKit proprietary/internal:
+ // '-webkit-link'
+ // '-webkit-activelink'
+ // '-internal-active-list-box-selection'
+ // '-internal-active-list-box-selection-text'
+ // '-internal-inactive-list-box-selection'
+ // '-internal-inactive-list-box-selection-text'
+ // '-webkit-focus-ring-color'
+ //
+ // TODO(fs): The "extended color keywords" are not included.
+ return (id >= CSSValueAqua && id <= CSSValueWebkitText) || id == CSSValueMenu;
+}
+
+PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseColor(const CSSParserValue* value, bool acceptQuirkyColors)
+{
+ CSSValueID id = value->id;
+ if (isColorKeyword(id)) {
+ if (!isValueAllowedInMode(id, m_context.mode()))
+ return nullptr;
return cssValuePool().createIdentifierValue(id);
- return parseColor();
+ }
+ RGBA32 c = Color::transparent;
+ if (!parseColorFromValue(value, c, acceptQuirkyColors))
+ return nullptr;
+ return cssValuePool().createColorValue(c);
+}
+
+// Used to parse background-color when part of a shorthand.
+PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseBackgroundColor(const CSSParserValue* value)
+{
+ CSSValueID id = value->id;
+ // Allow -webkit-text regardless of quirks.
+ if (id == CSSValueWebkitText)
+ return cssValuePool().createIdentifierValue(id);
+ return parseColor(value);
+}
+
+// Used to parse the '-webkit-tap-highlight-color' property.
+PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseTapHighlightColor(const CSSParserValue* value)
+{
+ CSSValueID id = value->id;
+ // Disallow -webkit-text regardless of quirks.
+ if (id == CSSValueWebkitText)
+ return nullptr;
+ // Allow currentcolor in quirks-mode only.
+ if (id == CSSValueCurrentcolor) {
+ if (!inQuirksMode())
+ return nullptr;
+ return cssValuePool().createIdentifierValue(id);
+ }
+ return parseColor(value);
+}
+
+// Used to parse <color> for CSS gradients.
+PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseGradientStopColor(const CSSParserValue* value)
+{
+ CSSValueID id = value->id;
+ // Allow -webkit-text regardless of quirks.
+ if (id == CSSValueWebkitText)
+ return cssValuePool().createIdentifierValue(id);
+ return parseColor(value);
+}
+
+// Used to parse colors for -webkit-gradient(...).
+PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseDeprecatedGradientStopColor(const CSSParserValue* value)
+{
+ // Disallow currentcolor.
+ if (value->id == CSSValueCurrentcolor)
+ return nullptr;
+ return parseGradientStopColor(value);
+}
+
+// Used to parse <color> for SVG properties.
+PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseSVGColor(const CSSParserValue* value)
+{
+ CSSValueID id = value->id;
+ if (id == CSSValueCurrentcolor)
+ return cssValuePool().createIdentifierValue(id);
+ if ((id >= CSSValueActiveborder && id <= CSSValueWindowtext) || id == CSSValueMenu)
+ return cssValuePool().createColorValue(LayoutTheme::theme().systemColor(id).rgb());
+ RGBA32 c = Color::transparent;
+ if (!parseColorFromValue(value, c))
+ return nullptr;
+ return cssValuePool().createColorValue(c);
}
bool CSSPropertyParser::parseFillImage(CSSParserValueList* valueList, RefPtrWillBeRawPtr<CSSValue>& value)
@@ -2795,7 +2872,7 @@ bool CSSPropertyParser::parseFillProperty(CSSPropertyID propId, CSSPropertyID& p
switch (propId) {
case CSSPropertyBackgroundColor:
- currValue = parseBackgroundColor();
+ currValue = parseBackgroundColor(val);
if (currValue)
m_valueList->next();
break;
@@ -4972,7 +5049,7 @@ inline int CSSPropertyParser::colorIntFromValue(CSSParserValue* v)
return static_cast<int>(value);
}
-bool CSSPropertyParser::parseColorParameters(CSSParserValue* value, int* colorArray, bool parseAlpha)
+bool CSSPropertyParser::parseColorParameters(const CSSParserValue* value, int* colorArray, bool parseAlpha)
{
CSSParserValueList* args = value->function->args.get();
CSSParserValue* v = args->current();
@@ -5014,7 +5091,7 @@ bool CSSPropertyParser::parseColorParameters(CSSParserValue* value, int* colorAr
// and with alpha, the format is
// hsla(<number>, <percent>, <percent>, <number>)
// The first value, HUE, is in an angle with a value between 0 and 360
-bool CSSPropertyParser::parseHSLParameters(CSSParserValue* value, double* colorArray, bool parseAlpha)
+bool CSSPropertyParser::parseHSLParameters(const CSSParserValue* value, double* colorArray, bool parseAlpha)
{
CSSParserValueList* args = value->function->args.get();
CSSParserValue* v = args->current();
@@ -5045,15 +5122,7 @@ bool CSSPropertyParser::parseHSLParameters(CSSParserValue* value, double* colorA
return true;
}
-PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseColor(CSSParserValue* value, bool acceptQuirkyColors)
-{
- RGBA32 c = Color::transparent;
- if (!parseColorFromValue(value ? value : m_valueList->current(), c, acceptQuirkyColors))
- return nullptr;
- return cssValuePool().createColorValue(c);
-}
-
-bool CSSPropertyParser::parseColorFromValue(CSSParserValue* value, RGBA32& result, bool acceptQuirkyColors)
+bool CSSPropertyParser::parseColorFromValue(const CSSParserValue* value, RGBA32& result, bool acceptQuirkyColors)
{
if (acceptQuirkyColors && value->unit == CSSPrimitiveValue::CSS_NUMBER
&& value->fValue >= 0. && value->fValue < 1000000. && value->isInt) {
@@ -5272,24 +5341,13 @@ PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseShadow(CSSParserVal
context.commitStyle(val);
} else {
- // The only other type of value that's ok is a color value.
- RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedColor = nullptr;
- bool isColor = ((val->id >= CSSValueAqua && val->id <= CSSValueWindowtext) || val->id == CSSValueMenu
- || (val->id >= CSSValueWebkitFocusRingColor && val->id <= CSSValueWebkitText && inQuirksMode())
- || val->id == CSSValueCurrentcolor);
- if (isColor) {
- if (!context.allowColor)
- return nullptr;
- parsedColor = cssValuePool().createIdentifierValue(val->id);
- }
+ if (!context.allowColor)
+ return nullptr;
+ // The only other type of value that's ok is a color value.
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedColor = parseColor(val);
if (!parsedColor)
- // It's not built-in. Try to parse it as a color.
- parsedColor = parseColor(val);
-
- if (!parsedColor || !context.allowColor)
- return nullptr; // This value is not a color or length and is invalid or
- // it is a color, but a color isn't allowed at this point.
+ return nullptr;
context.commitColor(parsedColor.release());
}
@@ -6042,11 +6100,7 @@ bool CSSPropertyParser::parseDeprecatedGradientColorStop(CSSParserValue* a, CSSG
else
stop.m_position = cssValuePool().createValue(1, CSSPrimitiveValue::CSS_NUMBER);
- CSSValueID id = args->current()->id;
- if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
- stop.m_color = cssValuePool().createIdentifierValue(id);
- else
- stop.m_color = parseColor(args->current());
+ stop.m_color = parseDeprecatedGradientStopColor(args->current());
if (!stop.m_color)
return false;
}
@@ -6068,12 +6122,7 @@ bool CSSPropertyParser::parseDeprecatedGradientColorStop(CSSParserValue* a, CSSG
if (!consumeComma(args))
return false;
- stopArg = args->current();
- CSSValueID id = stopArg->id;
- if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu)
- stop.m_color = cssValuePool().createIdentifierValue(id);
- else
- stop.m_color = parseColor(stopArg);
+ stop.m_color = parseDeprecatedGradientStopColor(args->current());
if (!stop.m_color)
return false;
}
@@ -6638,12 +6687,7 @@ bool CSSPropertyParser::parseGradientColorStops(CSSParserValueList* valueList, C
// <color-stop> = <color> [ <percentage> | <length> ]?
// <color-hint> = <length> | <percentage>
CSSGradientColorStop stop;
- CSSValueID id = a->id;
- if (id == CSSValueWebkitText || (id >= CSSValueAqua && id <= CSSValueWindowtext) || id == CSSValueMenu || id == CSSValueCurrentcolor)
- stop.m_color = cssValuePool().createIdentifierValue(id);
- else
- stop.m_color = parseColor(a);
-
+ stop.m_color = parseGradientStopColor(a);
// Two hints in a row are not allowed.
if (!stop.m_color && (!supportsColorHints || previousStopWasColorHint))
@@ -7653,7 +7697,7 @@ CSSValueID cssValueKeywordID(const CSSParserString& string)
return string.is8Bit() ? cssValueKeywordID(string.characters8(), length) : cssValueKeywordID(string.characters16(), length);
}
-bool CSSPropertyParser::isSystemColor(int id)
+bool CSSPropertyParser::isSystemColor(CSSValueID id)
{
return (id >= CSSValueActiveborder && id <= CSSValueWindowtext) || id == CSSValueMenu;
}
@@ -7797,19 +7841,16 @@ bool CSSPropertyParser::parseSVGValue(CSSPropertyID propId, bool important)
case CSSPropertyFill: // <paint> | inherit
case CSSPropertyStroke: // <paint> | inherit
{
- if (id == CSSValueNone || id == CSSValueCurrentcolor) {
+ if (id == CSSValueNone) {
parsedValue = cssValuePool().createIdentifierValue(id);
- } else if (isSystemColor(id)) {
- parsedValue = cssValuePool().createColorValue(LayoutTheme::theme().systemColor(id).rgb());
} else if (value->unit == CSSPrimitiveValue::CSS_URI) {
- RGBA32 c = Color::transparent;
if (m_valueList->next()) {
RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated();
values->append(CSSPrimitiveValue::create(value->string, CSSPrimitiveValue::CSS_URI));
- if (parseColorFromValue(m_valueList->current(), c))
- parsedValue = cssValuePool().createColorValue(c);
- else if (m_valueList->current()->id == CSSValueNone || m_valueList->current()->id == CSSValueCurrentcolor)
+ if (m_valueList->current()->id == CSSValueNone)
parsedValue = cssValuePool().createIdentifierValue(m_valueList->current()->id);
+ else
+ parsedValue = parseSVGColor(m_valueList->current());
if (parsedValue) {
values->append(parsedValue);
parsedValue = values;
@@ -7818,7 +7859,7 @@ bool CSSPropertyParser::parseSVGValue(CSSPropertyID propId, bool important)
if (!parsedValue)
parsedValue = CSSPrimitiveValue::create(value->string, CSSPrimitiveValue::CSS_URI);
} else {
- parsedValue = parseColor();
+ parsedValue = parseSVGColor(m_valueList->current());
}
if (parsedValue)
@@ -7829,13 +7870,7 @@ bool CSSPropertyParser::parseSVGValue(CSSPropertyID propId, bool important)
case CSSPropertyStopColor: // TODO : icccolor
case CSSPropertyFloodColor:
case CSSPropertyLightingColor:
- if (isSystemColor(id))
- parsedValue = cssValuePool().createColorValue(LayoutTheme::theme().systemColor(id).rgb());
- else if (id == CSSValueCurrentcolor)
- parsedValue = cssValuePool().createIdentifierValue(id);
- else // TODO : svgcolor (iccColor)
- parsedValue = parseColor();
-
+ parsedValue = parseSVGColor(m_valueList->current());
if (parsedValue)
m_valueList->next();
« no previous file with comments | « Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698