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

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index a715b32bedd903d8e03c76e42dc03f4ad0fbb25b..9dd1f8c1c7ad9a438cdeecd7346d478d247891ff 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -26,6 +26,7 @@
#include "core/css/CSSValuePool.h"
#include "core/css/CSSVariableReferenceValue.h"
#include "core/css/FontFace.h"
+#include "core/css/HashTools.h"
#include "core/css/parser/CSSParserFastPaths.h"
#include "core/css/parser/CSSParserValues.h"
#include "core/css/parser/CSSVariableParser.h"
@@ -132,6 +133,115 @@ bool CSSPropertyParser::parseValueStart(CSSPropertyID unresolvedProperty, bool i
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'
+ // '-webkit-text'
+ //
+ return (id >= CSSValueAqua && id <= CSSValueWebkitText)
+ || (id >= CSSValueAliceblue && id <= CSSValueYellowgreen)
+ || id == CSSValueMenu;
+}
+
+bool CSSPropertyParser::isSystemColor(CSSValueID id)
+{
+ return (id >= CSSValueActiveborder && id <= CSSValueWindowtext) || id == CSSValueMenu;
+}
+
+template <typename CharacterType>
+static CSSPropertyID unresolvedCSSPropertyID(const CharacterType* propertyName, unsigned length)
+{
+ char buffer[maxCSSPropertyNameLength + 1]; // 1 for null character
+
+ for (unsigned i = 0; i != length; ++i) {
+ CharacterType c = propertyName[i];
+ if (c == 0 || c >= 0x7F)
+ return CSSPropertyInvalid; // illegal character
+ buffer[i] = toASCIILower(c);
+ }
+ buffer[length] = '\0';
+
+ const char* name = buffer;
+ const Property* hashTableEntry = findProperty(name, length);
+ if (!hashTableEntry)
+ return CSSPropertyInvalid;
+ CSSPropertyID property = static_cast<CSSPropertyID>(hashTableEntry->id);
+ if (!CSSPropertyMetadata::isEnabledProperty(property))
+ return CSSPropertyInvalid;
+ return property;
+}
+
+CSSPropertyID unresolvedCSSPropertyID(const String& string)
+{
+ unsigned length = string.length();
+
+ if (!length)
+ return CSSPropertyInvalid;
+ if (length > maxCSSPropertyNameLength)
+ return CSSPropertyInvalid;
+
+ return string.is8Bit() ? unresolvedCSSPropertyID(string.characters8(), length) : unresolvedCSSPropertyID(string.characters16(), length);
+}
+
+CSSPropertyID unresolvedCSSPropertyID(const CSSParserString& string)
+{
+ unsigned length = string.length();
+
+ if (!length)
+ return CSSPropertyInvalid;
+ if (length > maxCSSPropertyNameLength)
+ return CSSPropertyInvalid;
+
+ return string.is8Bit() ? unresolvedCSSPropertyID(string.characters8(), length) : unresolvedCSSPropertyID(string.characters16(), length);
+}
+
+template <typename CharacterType>
+static CSSValueID cssValueKeywordID(const CharacterType* valueKeyword, unsigned length)
+{
+ char buffer[maxCSSValueKeywordLength + 1]; // 1 for null character
+
+ for (unsigned i = 0; i != length; ++i) {
+ CharacterType c = valueKeyword[i];
+ if (c == 0 || c >= 0x7F)
+ return CSSValueInvalid; // illegal character
+ buffer[i] = WTF::toASCIILower(c);
+ }
+ buffer[length] = '\0';
+
+ const Value* hashTableEntry = findValue(buffer, length);
+ return hashTableEntry ? static_cast<CSSValueID>(hashTableEntry->id) : CSSValueInvalid;
+}
+
+CSSValueID cssValueKeywordID(const CSSParserString& string)
+{
+ unsigned length = string.length();
+ if (!length)
+ return CSSValueInvalid;
+ if (length > maxCSSValueKeywordLength)
+ return CSSValueInvalid;
+
+ return string.is8Bit() ? cssValueKeywordID(string.characters8(), length) : cssValueKeywordID(string.characters16(), length);
+}
+
bool CSSPropertyParser::consumeCSSWideKeyword(CSSPropertyID unresolvedProperty, bool important)
{
CSSParserTokenRange rangeCopy = m_range;
@@ -2548,21 +2658,21 @@ static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse
return values.release();
}
-PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeFontFaceSrcURI()
+static PassRefPtrWillBeRawPtr<CSSValue> consumeFontFaceSrcURI(CSSParserTokenRange& range, CSSParserContext context)
{
- String url = consumeUrl(m_range);
+ String url = consumeUrl(range);
if (url.isNull())
return nullptr;
- RefPtrWillBeRawPtr<CSSFontFaceSrcValue> uriValue(CSSFontFaceSrcValue::create(m_context.completeURL(url), m_context.shouldCheckContentSecurityPolicy()));
- uriValue->setReferrer(m_context.referrer());
+ RefPtrWillBeRawPtr<CSSFontFaceSrcValue> uriValue(CSSFontFaceSrcValue::create(context.completeURL(url), context.shouldCheckContentSecurityPolicy()));
+ uriValue->setReferrer(context.referrer());
- if (m_range.peek().functionId() != CSSValueFormat)
+ if (range.peek().functionId() != CSSValueFormat)
return uriValue.release();
// FIXME: https://drafts.csswg.org/css-fonts says that format() contains a comma-separated list of strings,
// but CSSFontFaceSrcValue stores only one format. Allowing one format for now.
// FIXME: IdentToken should not be supported here.
- CSSParserTokenRange args = consumeFunction(m_range);
+ CSSParserTokenRange args = consumeFunction(range);
const CSSParserToken& arg = args.consumeIncludingWhitespace();
if ((arg.type() != StringToken && arg.type() != IdentToken) || !args.atEnd())
return nullptr;
@@ -2570,10 +2680,10 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeFontFaceSrcURI()
return uriValue.release();
}
-PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeFontFaceSrcLocal()
+static PassRefPtrWillBeRawPtr<CSSValue> consumeFontFaceSrcLocal(CSSParserTokenRange& range, CSSParserContext context)
{
- CSSParserTokenRange args = consumeFunction(m_range);
- ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy = m_context.shouldCheckContentSecurityPolicy();
+ CSSParserTokenRange args = consumeFunction(range);
+ ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy = context.shouldCheckContentSecurityPolicy();
if (args.peek().type() == StringToken) {
const CSSParserToken& arg = args.consumeIncludingWhitespace();
if (!args.atEnd())
@@ -2589,21 +2699,21 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeFontFaceSrcLocal()
return nullptr;
}
-PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::consumeFontFaceSrc()
+static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceSrc(CSSParserTokenRange& range, CSSParserContext context)
{
RefPtrWillBeRawPtr<CSSValueList> values(CSSValueList::createCommaSeparated());
do {
- const CSSParserToken& token = m_range.peek();
+ const CSSParserToken& token = range.peek();
RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr;
if (token.functionId() == CSSValueLocal)
- parsedValue = consumeFontFaceSrcLocal();
+ parsedValue = consumeFontFaceSrcLocal(range, context);
else
- parsedValue = consumeFontFaceSrcURI();
+ parsedValue = consumeFontFaceSrcURI(range, context);
if (!parsedValue)
return nullptr;
values->append(parsedValue);
- } while (consumeCommaIncludingWhitespace(m_range));
+ } while (consumeCommaIncludingWhitespace(range));
return values.release();
}
@@ -2617,7 +2727,7 @@ bool CSSPropertyParser::parseFontFaceDescriptor(CSSPropertyID propId)
parsedValue = consumeFamilyName(m_range);
break;
case CSSPropertySrc: // This is a list of urls or local references.
- parsedValue = consumeFontFaceSrc();
+ parsedValue = consumeFontFaceSrc(m_range, m_context);
break;
case CSSPropertyUnicodeRange:
parsedValue = consumeFontFaceUnicodeRange(m_range);

Powered by Google App Engine
This is Rietveld 408576698