Chromium Code Reviews| Index: Source/core/css/parser/SizesAttributeParser.cpp |
| diff --git a/Source/core/css/parser/SizesAttributeParser.cpp b/Source/core/css/parser/SizesAttributeParser.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d254583e3615b807fb4e29502117ba9adb2ce8d7 |
| --- /dev/null |
| +++ b/Source/core/css/parser/SizesAttributeParser.cpp |
| @@ -0,0 +1,98 @@ |
| +// Copyright 2014 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 "SizesAttributeParser.h" |
| + |
| +#include "core/css/MediaQueryEvaluator.h" |
| +#include "core/css/parser/MediaQueryTokenizer.h" |
| + |
| +namespace WebCore { |
| + |
| +enum { EffectiveSizeDefaultValue = 300 }; |
|
eseidel
2014/04/08 06:02:14
I know you were encouraged to do these as Enums be
rune
2014/04/08 10:34:42
That would have been me. I based it on how it's mo
|
| + |
| +int SizesAttributeParser::findEffectiveSize(const String& attribute, PassRefPtr<MediaValues> mediaValues) |
| +{ |
| + Vector<MediaQueryToken> tokens; |
| + SizesAttributeParser parser(mediaValues); |
| + |
| + MediaQueryTokenizer::tokenize(attribute, tokens); |
| + if (!parser.parseImpl(tokens)) |
|
eseidel
2014/04/08 06:02:14
Why parseImpl and not just parse?
|
| + return EffectiveSizeDefaultValue; |
| + return parser.effectiveSize(); |
| +} |
| + |
| +int SizesAttributeParser::calculateLengthInPixels(TokenIterator startToken, TokenIterator endToken) |
| +{ |
| + // FIXME - make this actually do something! |
| + return 0; |
| +} |
| + |
| +static void goBackWhileWhitespaceToken(TokenIterator& token, TokenIterator startToken) |
|
eseidel
2014/04/08 06:02:14
Other parser have used:
template<type UntilFuncti
|
| +{ |
| + while (token != startToken && token->type() == WhitespaceToken) |
| + --token; |
| +} |
| + |
| +static void goBackUntilWhitespaceToken(TokenIterator& token, TokenIterator startToken) |
| +{ |
| + while (token != startToken && token->type() != WhitespaceToken) |
| + --token; |
| +} |
| + |
| +bool SizesAttributeParser::mediaConditionMatches(PassRefPtr<MediaQuerySet> mediaCondition) |
| +{ |
| + // FIXME: How do I handle non-screen media types here? |
| + // FIXME2: Replaces "screen" with a static string |
| + MediaQueryEvaluator mediaQueryEvaluator("screen", m_mediaValues); |
|
eseidel
2014/04/08 06:02:14
IIRC you have some StaticStrings for media types,
|
| + return mediaQueryEvaluator.eval(mediaCondition.get()); |
| +} |
| + |
| +bool SizesAttributeParser::parseMediaConditionAndLength(TokenIterator startToken, TokenIterator endToken) |
| +{ |
| + TokenIterator lengthTokenStart; |
| + TokenIterator lengthTokenEnd; |
| + |
| + goBackWhileWhitespaceToken(endToken, startToken); |
|
eseidel
2014/04/08 06:02:14
I see, so these would be "reverseFind" in a string
|
| + lengthTokenEnd = endToken; |
| + goBackUntilWhitespaceToken(endToken, startToken); |
| + lengthTokenStart = endToken; |
| + ++lengthTokenStart; |
| + int length = calculateLengthInPixels(lengthTokenStart, lengthTokenEnd); |
| + RefPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMediaCondition(startToken, endToken); |
| + if (!mediaCondition || mediaCondition->queryVector().isEmpty()) |
| + m_defaultLength = length; |
| + else if (mediaConditionMatches(mediaCondition)) |
| + m_length = length; |
| + else |
| + return false; |
| + return true; |
| +} |
| + |
| +bool SizesAttributeParser::parseImpl(Vector<MediaQueryToken>& tokens) |
| +{ |
| + TokenIterator startToken = tokens.begin(); |
| + TokenIterator endToken; |
| + // Split on a comma token, and send the result tokens to be parsed as (media-condition, length) pairs |
| + for (TokenIterator token = tokens.begin(); token != tokens.end(); ++token) { |
| + if (token->type() == CommaToken) { |
| + endToken = token; |
| + --endToken; |
| + if (parseMediaConditionAndLength(startToken, endToken)) |
| + return true; |
| + startToken = token; |
| + ++startToken; |
| + } |
| + } |
| + return parseMediaConditionAndLength(startToken, tokens.end()); |
| +} |
| + |
| +int SizesAttributeParser::effectiveSize() |
| +{ |
| + // FIXME - implement the "find effective size" algorithm! |
| + return 0; |
| +} |
| + |
| +} // namespace |
| + |