#include "core/MediaTypeNames.h"
#include "core/css/MediaQueryEvaluator.h"
-#include "core/css/parser/MediaQueryTokenizer.h"
+#include "core/css/parser/CSSTokenizer.h"
#include "core/css/parser/SizesCalcParser.h"
namespace blink {
: m_mediaValues(mediaValues)
, m_length(0)
, m_lengthWasSet(false)
- , m_viewportDependant(false)
{
- MediaQueryTokenizer::tokenize(attribute, m_tokens);
+ CSSTokenizer::tokenize(attribute, m_tokens);
m_isValid = parse(m_tokens);
}
-unsigned SizesAttributeParser::length()
+float SizesAttributeParser::length()
{
if (m_isValid)
return effectiveSize();
return effectiveSizeDefaultValue();
}
-bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator startToken, MediaQueryTokenIterator endToken, unsigned& result)
+bool SizesAttributeParser::calculateLengthInPixels(CSSParserTokenIterator startToken, CSSParserTokenIterator endToken, float& result)
{
if (startToken == endToken)
return false;
- MediaQueryTokenType type = startToken->type();
+ CSSParserTokenType type = startToken->type();
if (type == DimensionToken) {
- int length;
+ double length;
if (!CSSPrimitiveValue::isLength(startToken->unitType()))
return false;
- m_viewportDependant = CSSPrimitiveValue::isViewportPercentageLength(startToken->unitType());
- if ((m_mediaValues->computeLength(startToken->numericValue(), startToken->unitType(), length)) && (length > 0)) {
- result = (unsigned)length;
+ if ((m_mediaValues->computeLength(startToken->numericValue(), startToken->unitType(), length)) && (length >= 0)) {
+ result = clampTo<float>(length);
return true;
}
} else if (type == FunctionToken) {
SizesCalcParser calcParser(startToken, endToken, m_mediaValues);
if (!calcParser.isValid())
return false;
- m_viewportDependant = calcParser.viewportDependant();
result = calcParser.result();
return true;
} else if (type == NumberToken && !startToken->numericValue()) {
return false;
}
-static void reverseSkipIrrelevantTokens(MediaQueryTokenIterator& token, MediaQueryTokenIterator startToken)
+static void reverseSkipIrrelevantTokens(CSSParserTokenIterator& token, CSSParserTokenIterator startToken)
{
- MediaQueryTokenIterator endToken = token;
+ CSSParserTokenIterator endToken = token;
while (token != startToken && (token->type() == WhitespaceToken || token->type() == CommentToken || token->type() == EOFToken))
--token;
if (token != endToken)
++token;
}
-static void reverseSkipUntilComponentStart(MediaQueryTokenIterator& token, MediaQueryTokenIterator startToken)
+static void reverseSkipUntilComponentStart(CSSParserTokenIterator& token, CSSParserTokenIterator startToken)
{
if (token == startToken)
return;
--token;
- if (token->blockType() != MediaQueryToken::BlockEnd)
+ if (token->blockType() != CSSParserToken::BlockEnd)
return;
unsigned blockLevel = 0;
while (token != startToken) {
- if (token->blockType() == MediaQueryToken::BlockEnd) {
+ if (token->blockType() == CSSParserToken::BlockEnd) {
++blockLevel;
- } else if (token->blockType() == MediaQueryToken::BlockStart) {
+ } else if (token->blockType() == CSSParserToken::BlockStart) {
--blockLevel;
if (!blockLevel)
break;
return mediaQueryEvaluator.eval(mediaCondition.get());
}
-bool SizesAttributeParser::parseMediaConditionAndLength(MediaQueryTokenIterator startToken, MediaQueryTokenIterator endToken)
+bool SizesAttributeParser::parseMediaConditionAndLength(CSSParserTokenIterator startToken, CSSParserTokenIterator endToken)
{
- MediaQueryTokenIterator lengthTokenStart;
- MediaQueryTokenIterator lengthTokenEnd;
+ CSSParserTokenIterator lengthTokenStart;
+ CSSParserTokenIterator lengthTokenEnd;
reverseSkipIrrelevantTokens(endToken, startToken);
lengthTokenEnd = endToken;
reverseSkipUntilComponentStart(endToken, startToken);
lengthTokenStart = endToken;
- unsigned length;
+ float length;
if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length))
return false;
RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMediaCondition(startToken, endToken);
return false;
}
-bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens)
+bool SizesAttributeParser::parse(Vector<CSSParserToken>& tokens)
{
if (tokens.isEmpty())
return false;
- MediaQueryTokenIterator startToken = tokens.begin();
- MediaQueryTokenIterator endToken;
+ CSSParserTokenIterator startToken = tokens.begin();
+ CSSParserTokenIterator endToken;
// Split on a comma token, and send the result tokens to be parsed as (media-condition, length) pairs
- for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end(); ++token) {
- if (token->type() == CommaToken) {
- endToken = token;
+ for (auto& token : tokens) {
+ m_blockWatcher.handleToken(token);
+ if (token.type() == CommaToken && !m_blockWatcher.blockLevel()) {
+ endToken = &token;
if (parseMediaConditionAndLength(startToken, endToken))
return true;
- startToken = token;
+ startToken = &token;
++startToken;
}
}
return parseMediaConditionAndLength(startToken, --endToken);
}
-unsigned SizesAttributeParser::effectiveSize()
+float SizesAttributeParser::effectiveSize()
{
if (m_lengthWasSet)
return m_length;
unsigned SizesAttributeParser::effectiveSizeDefaultValue()
{
// Returning the equivalent of "100vw"
- m_viewportDependant = true;
return m_mediaValues->viewportWidth();
}
} // namespace
-