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

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: Remove unused header Created 4 years, 3 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 StringView findVariableName(CSSParserTokenRange& range)
41 {
42 range.consumeWhitespace();
43 return range.consume().value();
44 }
45
46 StringOrCSSVariableReferenceValue variableReferenceValue(const StringView& varia bleName, const HeapVector<StringOrCSSVariableReferenceValue>& fragments)
47 {
48 CSSTokenStreamValue* tokenStreamValue;
49 if (fragments.size() == 0)
50 tokenStreamValue = nullptr;
51 else
52 tokenStreamValue = CSSTokenStreamValue::create(fragments);
53 CSSStyleVariableReferenceValue* variableReference = CSSStyleVariableReferenc eValue::create(variableName.toString(), tokenStreamValue);
54 return StringOrCSSVariableReferenceValue::fromCSSVariableReferenceValue(vari ableReference);
55 }
56
57 HeapVector<StringOrCSSVariableReferenceValue> parserTokenRangeToFragments(CSSPar serTokenRange range)
58 {
59 HeapVector<StringOrCSSVariableReferenceValue> fragments;
60 StringBuilder builder;
61 while (!range.atEnd()) {
62 if (range.peek().functionId() == CSSValueVar) {
63 if (!builder.isEmpty()) {
64 fragments.append(StringOrCSSVariableReferenceValue::fromString(b uilder.toString()));
65 builder.clear();
66 }
67 CSSParserTokenRange block = range.consumeBlock();
68 StringView variableName = findVariableName(block);
69 block.consumeWhitespace();
70 if (block.peek().type() == CSSParserTokenType::CommaToken)
71 block.consume();
72 fragments.append(variableReferenceValue(variableName, parserTokenRan geToFragments(block)));
73 } else {
74 range.consume().serialize(builder);
75 }
76 }
77 if (!builder.isEmpty())
78 fragments.append(StringOrCSSVariableReferenceValue::fromString(builder.t oString()));
79 return fragments;
80 }
81
41 } // namespace 82 } // namespace
42 83
43 ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource* CSSTokenStrea mValue::startIteration(ScriptState*, ExceptionState&) 84 ValueIterable<StringOrCSSVariableReferenceValue>::IterationSource* CSSTokenStrea mValue::startIteration(ScriptState*, ExceptionState&)
44 { 85 {
45 return new TokenStreamValueIterationSource(this); 86 return new TokenStreamValueIterationSource(this);
46 } 87 }
47 88
89 CSSTokenStreamValue* CSSTokenStreamValue::fromCSSValue(const CSSVariableReferenc eValue& cssVariableReferenceValue)
90 {
91 return CSSTokenStreamValue::create(parserTokenRangeToFragments(cssVariableRe ferenceValue.variableDataValue()->tokenRange()));
92 }
93
48 CSSValue* CSSTokenStreamValue::toCSSValue() const 94 CSSValue* CSSTokenStreamValue::toCSSValue() const
49 { 95 {
50 StringBuilder tokens; 96 StringBuilder tokens;
51 97
52 for (unsigned i = 0; i < m_fragments.size(); i++) { 98 for (unsigned i = 0; i < m_fragments.size(); i++) {
53 if (i) 99 if (i)
54 tokens.append("/**/"); 100 tokens.append("/**/");
55 if (m_fragments[i].isString()) 101 if (m_fragments[i].isString())
56 tokens.append(m_fragments[i].getAsString()); 102 tokens.append(m_fragments[i].getAsString());
57 else if (m_fragments[i].isCSSVariableReferenceValue()) 103 else if (m_fragments[i].isCSSVariableReferenceValue())
58 tokens.append(m_fragments[i].getAsCSSVariableReferenceValue()->varia ble()); 104 tokens.append(m_fragments[i].getAsCSSVariableReferenceValue()->varia ble());
59 else 105 else
60 NOTREACHED(); 106 NOTREACHED();
61 } 107 }
62 108
63 CSSTokenizer::Scope scope(tokens.toString()); 109 CSSTokenizer::Scope scope(tokens.toString());
64 110
65 return CSSVariableReferenceValue::create(CSSVariableData::create(scope.token Range())); 111 return CSSVariableReferenceValue::create(CSSVariableData::create(scope.token Range()));
66 } 112 }
67 113
68 } // namespace blink 114 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698