Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/cssom/CSSTokenStreamValue.cpp |
| diff --git a/third_party/WebKit/Source/core/css/cssom/CSSTokenStreamValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSTokenStreamValue.cpp |
| index fdb62cc2379dda0c5debdeedf8735653af398397..ea652e28a0b8c9437d7f1bf5c3df657292ebb598 100644 |
| --- a/third_party/WebKit/Source/core/css/cssom/CSSTokenStreamValue.cpp |
| +++ b/third_party/WebKit/Source/core/css/cssom/CSSTokenStreamValue.cpp |
| @@ -45,6 +45,62 @@ ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource* CSSTokenStrea |
| return new TokenStreamValueIterationSource(this); |
| } |
| +CSSTokenStreamValue* CSSTokenStreamValue::fromCSSValue(const CSSValue& cssValue) |
|
meade_UTC10
2016/08/19 08:43:51
It'd be more correct to take a CSSVariableReferenc
anthonyhkf
2016/08/22 03:19:21
Done.
|
| +{ |
| + StringBuilder builder; |
| + return CSSTokenStreamValue::fromParserTokenRange(toCSSVariableReferenceValue(cssValue).variableDataValue()->tokenRange(), builder, false); |
| +} |
| + |
| +void parseTokenRangeToFragments(CSSParserTokenRange range, HeapVector<StringOrCSSVariableReferenceValue>& fragments, StringBuilder& builder, bool isInsideVariable) |
|
meade_UTC10
2016/08/19 08:43:51
Put this helper function up in the anonymous names
anthonyhkf
2016/08/22 03:19:21
Done.
|
| +{ |
| + StringView variable; |
|
meade_UTC10
2016/08/19 08:43:52
This variable needs a more descriptive name - I do
anthonyhkf
2016/08/22 03:19:20
Done.
|
| + while (!range.atEnd()) { |
| + if (range.peek().getBlockType() == CSSParserToken::BlockStart) { |
| + if (range.peek().functionId() == CSSValueVar) { |
| + fragments.append(StringOrCSSVariableReferenceValue::fromString(builder.toString())); |
| + builder.clear(); |
| + CSSTokenStreamValue* tokenStreamValue = CSSTokenStreamValue::fromParserTokenRange(range.consumeBlock(), builder, true); |
|
meade_UTC10
2016/08/19 08:43:51
It would be clearer if you split out the creation
anthonyhkf
2016/08/22 03:19:21
Done.
|
| + CSSStyleVariableReferenceValue* variableReferenceValue = CSSStyleVariableReferenceValue::create(builder.toString(), tokenStreamValue); |
| + fragments.append(StringOrCSSVariableReferenceValue::fromCSSVariableReferenceValue(variableReferenceValue)); |
| + builder.clear(); |
| + } else { |
| + range.peek().serialize(builder); |
| + parseTokenRangeToFragments(range.consumeBlock(), fragments, builder, false); |
|
meade_UTC10
2016/08/19 08:43:51
Should you be both serializing the first token, an
anthonyhkf
2016/08/22 03:19:21
I think the consumeBlock() will only return the pa
meade_UTC10
2016/08/22 07:55:47
In that case it might be clearer to do
builder.a
|
| + builder.append(')'); |
| + } |
| + } else { |
| + if (range.peek().type() == CSSParserTokenType::CommaToken) { |
| + if (!isInsideVariable) |
| + builder.append(','); |
| + } else if (range.peek().type() == CSSParserTokenType::IdentToken) { |
| + variable = range.peek().value(); |
| + } else { |
| + range.peek().serialize(builder); |
| + } |
| + range.consume(); |
|
meade_UTC10
2016/08/19 08:43:51
You should be able simplify these type of calls by
anthonyhkf
2016/08/22 03:19:21
Done.
|
| + } |
| + } |
| + if (isInsideVariable) { |
| + if (!builder.isEmpty()) { |
| + fragments.append(StringOrCSSVariableReferenceValue::fromString(builder.toString())); |
| + builder.clear(); |
| + } |
| + builder.append(variable); |
| + } |
| +} |
| + |
| +CSSTokenStreamValue* CSSTokenStreamValue::fromParserTokenRange(CSSParserTokenRange range, StringBuilder& builder, bool isInsideVariable) |
| +{ |
| + HeapVector<StringOrCSSVariableReferenceValue> fragments; |
| + parseTokenRangeToFragments(range, fragments, builder, isInsideVariable); |
| + if (!builder.isEmpty() && !isInsideVariable) { |
| + fragments.append(StringOrCSSVariableReferenceValue::fromString(builder.toString())); |
|
meade_UTC10
2016/08/19 08:43:51
Can this be moved up into parseTokenFragments? It'
anthonyhkf
2016/08/22 03:19:21
Done.
|
| + } |
| + if (fragments.size() == 0) |
| + return nullptr; |
|
meade_UTC10
2016/08/19 08:43:51
If this is a private function, you can DCHECK this
anthonyhkf
2016/08/22 03:19:21
It is possible to happen. This one is for the case
|
| + return CSSTokenStreamValue::create(fragments); |
| +} |
| + |
| CSSValue* CSSTokenStreamValue::toCSSValue() const |
| { |
| StringBuilder tokens; |