Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/css/cssom/CSSTokenStreamValue.h" | 5 #include "core/css/cssom/CSSTokenStreamValue.h" |
| 6 | 6 |
| 7 #include "core/css/CSSVariableReferenceValue.h" | |
| 8 #include "core/css/cssom/CSSStyleVariableReferenceValue.h" | 7 #include "core/css/cssom/CSSStyleVariableReferenceValue.h" |
| 9 #include "core/css/parser/CSSTokenizer.h" | 8 #include "core/css/parser/CSSTokenizer.h" |
| 10 #include "wtf/text/StringBuilder.h" | 9 #include "wtf/text/StringBuilder.h" |
| 11 | 10 |
| 12 namespace blink { | 11 namespace blink { |
| 13 | 12 |
| 14 namespace { | 13 namespace { |
| 15 | 14 |
| 16 class TokenStreamValueIterationSource final : public ValueIterable<StringOrCSSVa riableReferenceValue>::IterationSource { | 15 class TokenStreamValueIterationSource final : public ValueIterable<StringOrCSSVa riableReferenceValue>::IterationSource { |
| 17 public: | 16 public: |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 31 DEFINE_INLINE_VIRTUAL_TRACE() | 30 DEFINE_INLINE_VIRTUAL_TRACE() |
| 32 { | 31 { |
| 33 visitor->trace(m_tokenStreamValue); | 32 visitor->trace(m_tokenStreamValue); |
| 34 ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource::trace (visitor); | 33 ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource::trace (visitor); |
| 35 } | 34 } |
| 36 | 35 |
| 37 private: | 36 private: |
| 38 const Member<CSSTokenStreamValue> m_tokenStreamValue; | 37 const Member<CSSTokenStreamValue> m_tokenStreamValue; |
| 39 }; | 38 }; |
| 40 | 39 |
| 40 void parseTokenRangeToFragments(CSSParserTokenRange, HeapVector<StringOrCSSVaria bleReferenceValue>&, StringBuilder&, bool); | |
| 41 | |
| 42 CSSTokenStreamValue* fromParserTokenRangeToCSSTokenStreamValue(CSSParserTokenRan ge range, StringBuilder& builder, bool isInsideVariable) | |
| 43 { | |
| 44 HeapVector<StringOrCSSVariableReferenceValue> fragments; | |
| 45 parseTokenRangeToFragments(range, fragments, builder, isInsideVariable); | |
| 46 | |
| 47 // return undefined if there is no value following the variable's name | |
| 48 if (fragments.size() == 0) | |
| 49 return nullptr; | |
| 50 return CSSTokenStreamValue::create(fragments); | |
| 51 } | |
| 52 | |
| 53 void handleVariableBlock(CSSParserTokenRange range, HeapVector<StringOrCSSVariab leReferenceValue>& fragments, StringBuilder& builder) | |
|
Timothy Loh
2016/08/22 06:30:59
handle -> parse?
I think this function should be
meade_UTC10
2016/08/22 07:55:48
how about calling this void variableReferenceValue
anthonyhkf
2016/08/24 04:47:39
Done.
| |
| 54 { | |
| 55 if (!builder.isEmpty()) { | |
| 56 // we only append the string before "var" if it is not an empty string | |
| 57 fragments.append(StringOrCSSVariableReferenceValue::fromString(builder.t oString())); | |
|
meade_UTC10
2016/08/22 07:55:48
If you move this bit to the caller of this functio
anthonyhkf
2016/08/24 04:47:39
Done.
| |
| 58 builder.clear(); | |
| 59 } | |
| 60 | |
| 61 CSSTokenStreamValue* tokenStreamValue = fromParserTokenRangeToCSSTokenStream Value(range, builder, true); | |
| 62 CSSStyleVariableReferenceValue* variableReferenceValue = CSSStyleVariableRef erenceValue::create(builder.toString(), tokenStreamValue); | |
| 63 | |
| 64 fragments.append(StringOrCSSVariableReferenceValue::fromCSSVariableReference Value(variableReferenceValue)); | |
| 65 builder.clear(); | |
| 66 } | |
| 67 | |
| 68 void parseTokenRangeToFragments(CSSParserTokenRange range, HeapVector<StringOrCS SVariableReferenceValue>& fragments, StringBuilder& builder, bool isInsideVariab le) | |
|
meade_UTC10
2016/08/22 07:55:48
nit: Was this supposed to be parserTokenRangeToFra
anthonyhkf
2016/08/24 04:47:39
Done.
| |
| 69 { | |
| 70 // if isInsideVariable, we need to store the variable's name | |
| 71 StringView variableName; | |
| 72 while (!range.atEnd()) { | |
|
Timothy Loh
2016/08/22 06:30:59
I think it'd be better (overall much simpler) to s
meade_UTC10
2016/08/22 07:55:47
I agree, but I think it works out slightly better
anthonyhkf
2016/08/24 04:47:39
Done.
| |
| 73 if (range.peek().getBlockType() == CSSParserToken::BlockStart) { | |
| 74 if (range.peek().functionId() == CSSValueVar) { | |
| 75 handleVariableBlock(range.consumeBlock(), fragments, builder); | |
| 76 } else { | |
| 77 range.peek().serialize(builder); | |
| 78 parseTokenRangeToFragments(range.consumeBlock(), fragments, buil der, false); | |
| 79 builder.append(')'); | |
| 80 } | |
| 81 } else { | |
| 82 CSSParserToken token = range.consume(); | |
| 83 if (token.type() == CSSParserTokenType::CommaToken) { | |
| 84 if (!isInsideVariable) | |
|
Timothy Loh
2016/08/22 06:30:59
BTW this logic is wrong because you can write "var
anthonyhkf
2016/08/24 04:47:39
Oh, sorry. Before I thought that it is only possib
| |
| 85 builder.append(','); | |
| 86 } else if (token.type() == CSSParserTokenType::IdentToken) { | |
| 87 variableName = token.value(); | |
| 88 } else { | |
| 89 token.serialize(builder); | |
| 90 } | |
| 91 } | |
| 92 } | |
| 93 if (isInsideVariable) { | |
| 94 if (!builder.isEmpty()) { | |
|
meade_UTC10
2016/08/22 07:55:48
You do this line regardless of isInsideVariable, s
| |
| 95 fragments.append(StringOrCSSVariableReferenceValue::fromString(build er.toString())); | |
| 96 builder.clear(); | |
| 97 } | |
| 98 // if it is inside variable block, we should keep the variable's name | |
| 99 builder.append(variableName); | |
| 100 } else if (!builder.isEmpty()) { | |
| 101 fragments.append(StringOrCSSVariableReferenceValue::fromString(builder.t oString())); | |
| 102 } | |
| 103 } | |
| 104 | |
| 41 } // namespace | 105 } // namespace |
| 42 | 106 |
| 43 ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource* CSSTokenStrea mValue::startIteration(ScriptState*, ExceptionState&) | 107 ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource* CSSTokenStrea mValue::startIteration(ScriptState*, ExceptionState&) |
| 44 { | 108 { |
| 45 return new TokenStreamValueIterationSource(this); | 109 return new TokenStreamValueIterationSource(this); |
| 46 } | 110 } |
| 47 | 111 |
| 112 CSSTokenStreamValue* CSSTokenStreamValue::fromCSSVariableReferenceValue(const CS SVariableReferenceValue& cssVariableReferenceValue) | |
|
meade_UTC10
2016/08/22 07:55:47
You can still call this fromCSSValue for consisten
anthonyhkf
2016/08/24 04:47:39
Done.
| |
| 113 { | |
| 114 StringBuilder builder; | |
| 115 return fromParserTokenRangeToCSSTokenStreamValue(cssVariableReferenceValue.v ariableDataValue()->tokenRange(), builder, false); | |
| 116 } | |
| 117 | |
| 48 CSSValue* CSSTokenStreamValue::toCSSValue() const | 118 CSSValue* CSSTokenStreamValue::toCSSValue() const |
| 49 { | 119 { |
| 50 StringBuilder tokens; | 120 StringBuilder tokens; |
| 51 | 121 |
| 52 for (unsigned i = 0; i < m_fragments.size(); i++) { | 122 for (unsigned i = 0; i < m_fragments.size(); i++) { |
| 53 if (i) | 123 if (i) |
| 54 tokens.append("/**/"); | 124 tokens.append("/**/"); |
| 55 if (m_fragments[i].isString()) | 125 if (m_fragments[i].isString()) |
| 56 tokens.append(m_fragments[i].getAsString()); | 126 tokens.append(m_fragments[i].getAsString()); |
| 57 else if (m_fragments[i].isCSSVariableReferenceValue()) | 127 else if (m_fragments[i].isCSSVariableReferenceValue()) |
| 58 tokens.append(m_fragments[i].getAsCSSVariableReferenceValue()->varia ble()); | 128 tokens.append(m_fragments[i].getAsCSSVariableReferenceValue()->varia ble()); |
| 59 else | 129 else |
| 60 NOTREACHED(); | 130 NOTREACHED(); |
| 61 } | 131 } |
| 62 | 132 |
| 63 CSSTokenizer::Scope scope(tokens.toString()); | 133 CSSTokenizer::Scope scope(tokens.toString()); |
| 64 | 134 |
| 65 return CSSVariableReferenceValue::create(CSSVariableData::create(scope.token Range())); | 135 return CSSVariableReferenceValue::create(CSSVariableData::create(scope.token Range())); |
| 66 } | 136 } |
| 67 | 137 |
| 68 } // namespace blink | 138 } // namespace blink |
| OLD | NEW |