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

Unified Diff: Source/core/css/parser/SizesAttributeParser.cpp

Issue 224733011: A sizes attribute parser (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 6 years, 8 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: 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
+

Powered by Google App Engine
This is Rietveld 408576698