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

Side by Side Diff: third_party/WebKit/Source/core/css/cssom/CSSTokenStreamValue.cpp

Issue 2251663002: [Typed-OM] Get CSSTokenStreamValue from StyleMap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactor and add test Created 4 years, 4 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 unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698