1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// 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 "core/css/CSSVariableData.h"
#include "core/css/CSSSyntaxDescriptor.h"
#include "core/css/parser/CSSParser.h"
#include "core/css/parser/CSSParserTokenRange.h"
#include "wtf/text/StringBuilder.h"
#include "wtf/text/StringView.h"
namespace blink {
StylePropertySet* CSSVariableData::propertySet() {
ASSERT(!m_needsVariableResolution);
if (!m_cachedPropertySet) {
m_propertySet = CSSParser::parseCustomPropertySet(m_tokens);
m_cachedPropertySet = true;
}
return m_propertySet.get();
}
template <typename CharacterType>
void CSSVariableData::updateTokens(const CSSParserTokenRange& range) {
const CharacterType* currentOffset =
m_backingString.getCharacters<CharacterType>();
for (const CSSParserToken& token : range) {
if (token.hasStringBacking()) {
unsigned length = token.value().length();
StringView string(currentOffset, length);
m_tokens.push_back(token.copyWithUpdatedString(string));
currentOffset += length;
} else {
m_tokens.push_back(token);
}
}
ASSERT(currentOffset ==
m_backingString.getCharacters<CharacterType>() +
m_backingString.length());
}
bool CSSVariableData::operator==(const CSSVariableData& other) const {
return tokens() == other.tokens();
}
void CSSVariableData::consumeAndUpdateTokens(const CSSParserTokenRange& range) {
StringBuilder stringBuilder;
CSSParserTokenRange localRange = range;
while (!localRange.atEnd()) {
CSSParserToken token = localRange.consume();
if (token.hasStringBacking())
stringBuilder.append(token.value());
}
m_backingString = stringBuilder.toString();
if (m_backingString.is8Bit())
updateTokens<LChar>(range);
else
updateTokens<UChar>(range);
}
CSSVariableData::CSSVariableData(const CSSParserTokenRange& range,
bool isAnimationTainted,
bool needsVariableResolution)
: m_isAnimationTainted(isAnimationTainted),
m_needsVariableResolution(needsVariableResolution),
m_cachedPropertySet(false) {
ASSERT(!range.atEnd());
consumeAndUpdateTokens(range);
}
const CSSValue* CSSVariableData::parseForSyntax(
const CSSSyntaxDescriptor& syntax) const {
DCHECK(!needsVariableResolution());
// TODO(timloh): This probably needs a proper parser context for
// relative URL resolution.
return syntax.parse(tokenRange(), strictCSSParserContext(),
m_isAnimationTainted);
}
} // namespace blink
|