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

Unified 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: Add layouttest 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698