Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h |
index e1f2a5f6a246ddc69af242a03f058341d0602292..7e070a72d51db27d7d718e4691431ece5fe381d6 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h |
@@ -126,18 +126,35 @@ CSSIdentifierValue* ConsumeIdent(CSSParserTokenRange& range) { |
// the list, followed by the arguments to pass to this callback. |
// The first argument to the callback must be the CSSParserTokenRange |
template <typename Func, typename... Args> |
-CSSValueList* ConsumeCommaSeparatedList(Func callback, |
- CSSParserTokenRange& range, |
- Args... args) { |
- CSSValueList* list = CSSValueList::CreateCommaSeparated(); |
+CSSValue* ConsumeCommaSeparatedList(bool optimise, |
+ Func callback, |
+ CSSParserTokenRange& range, |
+ Args... args) { |
+ CSSValue* result = nullptr; |
+ if (!optimise) |
+ result = CSSValueList::CreateCommaSeparated(); |
do { |
CSSValue* value = callback(range, args...); |
if (!value) |
return nullptr; |
- list->Append(*value); |
+ |
+ if (optimise) { |
+ if (!result) { |
+ // To conserve memory we don't wrap a single value in a list. |
+ result = value; |
+ continue; |
+ } |
+ if (!result->IsBaseValueList()) { |
+ CSSValue* first_value = result; |
+ result = CSSValueList::CreateCommaSeparated(); |
+ ToCSSValueList(result)->Append(*first_value); |
+ } |
+ } |
+ ToCSSValueList(result)->Append(*value); |
} while (ConsumeCommaIncludingWhitespace(range)); |
- DCHECK(list->length()); |
- return list; |
+ |
+ DCHECK(!result->IsBaseValueList() || ToCSSValueList(result)->length()); |
+ return result; |
} |
} // namespace CSSPropertyParserHelpers |