| Index: third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp b/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp
|
| deleted file mode 100644
|
| index 2a63bf0e540968e70f1f39d17efe28f23c2ff03a..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp
|
| +++ /dev/null
|
| @@ -1,179 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "config.h"
|
| -#include "core/css/resolver/CSSVariableResolver.h"
|
| -
|
| -#include "core/CSSPropertyNames.h"
|
| -#include "core/CSSValueKeywords.h"
|
| -#include "core/StyleBuilderFunctions.h"
|
| -#include "core/css/CSSVariableData.h"
|
| -#include "core/css/CSSVariableReferenceValue.h"
|
| -#include "core/css/parser/CSSParserToken.h"
|
| -#include "core/css/parser/CSSParserTokenRange.h"
|
| -#include "core/css/parser/CSSParserValues.h"
|
| -#include "core/css/parser/CSSPropertyParser.h"
|
| -#include "core/css/resolver/StyleBuilder.h"
|
| -#include "core/css/resolver/StyleResolverState.h"
|
| -#include "core/style/StyleVariableData.h"
|
| -#include "wtf/Vector.h"
|
| -
|
| -namespace blink {
|
| -
|
| -// TODO(leviw): This should take a CSSParserTokenRange
|
| -static void findEndIndexOfVariableReference(const Vector<CSSParserToken>& resolvedTokens, unsigned startIndex, unsigned& endIndex, unsigned& commaIndex, bool& hasClosingBracket)
|
| -{
|
| - endIndex = 0;
|
| - commaIndex = 0;
|
| - unsigned bracketCount = 1;
|
| - for (unsigned i = startIndex; i < resolvedTokens.size(); ++i) {
|
| - CSSParserTokenType type = resolvedTokens[i].type();
|
| -
|
| - if (type == CommaToken && !commaIndex) {
|
| - commaIndex = i;
|
| - } else if (type == LeftParenthesisToken || type == FunctionToken) {
|
| - bracketCount++;
|
| - } else if (type == RightParenthesisToken) {
|
| - if (bracketCount == 1) {
|
| - hasClosingBracket = true;
|
| - endIndex = i;
|
| - return;
|
| - }
|
| - bracketCount--;
|
| - }
|
| - }
|
| - hasClosingBracket = false;
|
| - endIndex = resolvedTokens.size() - 1;
|
| -}
|
| -
|
| -unsigned CSSVariableResolver::resolveVariableTokensRecursive(Vector<CSSParserToken>& resolvedTokens, unsigned startIndex)
|
| -{
|
| - unsigned variableLocation = startIndex;
|
| - while (resolvedTokens[variableLocation].type() != IdentToken)
|
| - variableLocation++;
|
| -
|
| - unsigned commaIndex;
|
| - unsigned endIndex;
|
| - bool hasClosingBracket;
|
| - // Find default value and match braces
|
| - findEndIndexOfVariableReference(resolvedTokens, variableLocation + 1, endIndex, commaIndex, hasClosingBracket);
|
| -
|
| - unsigned length = endIndex - startIndex + 1;
|
| - unsigned varFunctionPosition = startIndex;
|
| -
|
| - AtomicString variableName = resolvedTokens[variableLocation].value();
|
| -
|
| - if (m_variablesSeen.contains(variableName)) {
|
| - m_cycleDetected = true;
|
| - resolvedTokens.clear();
|
| - return 0;
|
| - }
|
| -
|
| - CSSVariableData* variableData = m_styleVariableData ? m_styleVariableData->getVariable(variableName) : nullptr;
|
| - if (variableData) {
|
| - Vector<CSSParserToken> tokens(variableData->tokens());
|
| - if (variableData->needsVariableResolution()) {
|
| - m_variablesSeen.add(variableName);
|
| - resolveVariableReferencesFromTokens(tokens);
|
| - m_variablesSeen.remove(variableName);
|
| -
|
| - // The old variable data holds onto the backing string the new resolved CSSVariableData
|
| - // relies on. Ensure it will live beyond us overwriting the RefPtr in StyleVariableData.
|
| - ASSERT(variableData->refCount() > 1);
|
| -
|
| - m_styleVariableData->setVariable(variableName, CSSVariableData::createResolved(tokens));
|
| - }
|
| - if (tokens.size()) {
|
| - resolvedTokens.remove(startIndex, length);
|
| - resolvedTokens.insert(startIndex, tokens);
|
| - return tokens.size();
|
| - }
|
| - }
|
| -
|
| - // Fallback on default value if present
|
| - if (!commaIndex || m_cycleDetected) {
|
| - resolvedTokens.clear();
|
| - return 0;
|
| - }
|
| -
|
| - // Move the tokens to the beginning of the variable reference
|
| - unsigned defaultValueStart = commaIndex + 1;
|
| - unsigned defaultValueLength = endIndex - commaIndex - (hasClosingBracket ? 1 : 0);
|
| - for (unsigned i = 0; i < defaultValueLength; ++i)
|
| - resolvedTokens[varFunctionPosition + i] = resolvedTokens[defaultValueStart + i];
|
| - resolvedTokens.remove(varFunctionPosition + defaultValueLength, length - defaultValueLength);
|
| -
|
| - resolveVariableReferencesFromTokens(resolvedTokens);
|
| -
|
| - return resolvedTokens.size();
|
| -}
|
| -
|
| -void CSSVariableResolver::resolveVariableReferencesFromTokens(Vector<CSSParserToken>& tokens)
|
| -{
|
| - for (unsigned i = 0; i < tokens.size(); ++i) {
|
| - if (tokens[i].functionId() == CSSValueVar) {
|
| - unsigned validTokens = resolveVariableTokensRecursive(tokens, i);
|
| - if (validTokens < 1 || m_cycleDetected) {
|
| - tokens.clear();
|
| - break;
|
| - }
|
| - i += validTokens - 1;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void CSSVariableResolver::resolveAndApplyVariableReferences(StyleResolverState& state, CSSPropertyID id, const CSSVariableReferenceValue& value)
|
| -{
|
| - // TODO(leviw): This should be a stack
|
| - Vector<CSSParserToken> tokens = value.variableDataValue()->tokens();
|
| -
|
| - CSSVariableResolver resolver(state.style()->variables());
|
| -
|
| - resolver.resolveVariableReferencesFromTokens(tokens);
|
| -
|
| - if (!tokens.size())
|
| - return;
|
| -
|
| - CSSParserContext context(HTMLStandardMode, 0);
|
| -
|
| - WillBeHeapVector<CSSProperty, 256> parsedProperties;
|
| -
|
| - CSSPropertyParser::parseValue(id, false, CSSParserTokenRange(tokens), context, parsedProperties, StyleRule::Type::Style);
|
| -
|
| - unsigned parsedPropertiesCount = parsedProperties.size();
|
| - for (unsigned i = 0; i < parsedPropertiesCount; ++i)
|
| - StyleBuilder::applyProperty(parsedProperties[i].id(), state, parsedProperties[i].value());
|
| -}
|
| -
|
| -void CSSVariableResolver::resolveVariableDefinitions(StyleVariableData* variables)
|
| -{
|
| - if (!variables)
|
| - return;
|
| -
|
| - for (auto& variable : variables->m_data) {
|
| - if (!variable.value->needsVariableResolution())
|
| - continue;
|
| - Vector<CSSParserToken> resolvedTokens(variable.value->tokens());
|
| -
|
| - CSSVariableResolver resolver(variables, variable.key);
|
| - resolver.resolveVariableReferencesFromTokens(resolvedTokens);
|
| -
|
| - variable.value = CSSVariableData::createResolved(resolvedTokens);
|
| - }
|
| -}
|
| -
|
| -CSSVariableResolver::CSSVariableResolver(StyleVariableData* styleVariableData)
|
| - : m_styleVariableData(styleVariableData)
|
| - , m_cycleDetected(false)
|
| -{
|
| -}
|
| -
|
| -CSSVariableResolver::CSSVariableResolver(StyleVariableData* styleVariableData, AtomicString& variable)
|
| - : m_styleVariableData(styleVariableData)
|
| - , m_cycleDetected(false)
|
| -{
|
| - m_variablesSeen.add(variable);
|
| -}
|
| -
|
| -} // namespace blink
|
|
|