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

Unified Diff: Source/core/css/parser/MediaQueryParser.h

Issue 171383002: A thread-safe Media Query Parser (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Refactored and passes tests Created 6 years, 10 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/MediaQueryParser.h
diff --git a/Source/core/css/parser/MediaQueryParser.h b/Source/core/css/parser/MediaQueryParser.h
new file mode 100644
index 0000000000000000000000000000000000000000..9f31ef61e32990c47a9fe1039f8ffc8d0457a797
--- /dev/null
+++ b/Source/core/css/parser/MediaQueryParser.h
@@ -0,0 +1,97 @@
+// 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.
+
+#ifndef MediaQueryParser_h
+#define MediaQueryParser_h
+
+#include "core/css/CSSParserValues.h"
+#include "core/css/MediaList.h"
+#include "core/css/MediaQuery.h"
+#include "core/css/MediaQueryExp.h"
+#include "core/css/parser/CSSToken.h"
+#include "wtf/Vector.h"
+#include "wtf/text/WTFString.h"
+
+namespace WebCore {
+
+class MediaQuerySet;
+
+class MediaQueryData {
+private:
+ RefPtr<MediaQuerySet> m_querySet;
+ MediaQuery::Restrictor m_restrictor;
+ String m_mediaType;
+ OwnPtr<ExpressionVector> m_expressions;
+ String m_mediaFeature;
+ CSSParserValueList m_valueList;
+ bool m_mediaTypeSet;
+
+public:
+ MediaQueryData();
+ void resetCurrentQuery();
+ void addCurrentMediaQuery();
+ bool addExpression();
+ void addParserValue(CSSTokenType, CSSToken*);
+ void setMediaType(const String&);
+
+ inline PassRefPtr<MediaQuerySet> querySet()
+ {
+ return m_querySet;
+ }
+
+ inline unsigned querySetSize()
+ {
+ return m_querySet->queryVector().size();
+ }
+
+ inline bool currentMediaQueryChanged()
+ {
+ return (m_restrictor != MediaQuery::None || m_mediaTypeSet || m_expressions->size() > 0);
+ }
+
+ inline void addNotAllMediaQuery()
+ {
+ m_querySet->addMediaQuery(adoptPtr(new MediaQuery(MediaQuery::Not, "all", nullptr)));
+ }
+
+ inline void setRestrictor(MediaQuery::Restrictor restrictor) { m_restrictor = restrictor; }
+
+ inline void setMediaFeature(const String& str) { m_mediaFeature = str; }
+};
+
+class MediaQueryParser {
+public:
+ static PassRefPtr<MediaQuerySet> parse(String);
+
+private:
+ MediaQueryParser(String);
+ virtual ~MediaQueryParser() { };
+
+ PassRefPtr<MediaQuerySet> parseImpl();
+
+
+ typedef Vector<CSSToken>::iterator TokenIterator;
+
+ void readRestrictor(CSSTokenType, TokenIterator&);
+ void readMediaType(CSSTokenType, TokenIterator&);
+ void readAnd(CSSTokenType, TokenIterator&);
+ void readFeatureStart(CSSTokenType, TokenIterator&);
+ void readFeature(CSSTokenType, TokenIterator&);
+ void readFeatureColon(CSSTokenType, TokenIterator&);
+ void readFeatureValue(CSSTokenType, TokenIterator&);
+ void readFeatureEnd(CSSTokenType, TokenIterator&);
+ void skipTillComma(CSSTokenType, TokenIterator&);
+ void skipTillParen(CSSTokenType, TokenIterator&);
+ void done(CSSTokenType, TokenIterator&);
+
+ typedef void (MediaQueryParser::*State)(CSSTokenType, TokenIterator&);
+
+ State m_state;
+ Vector<CSSToken> m_tokens;
+ MediaQueryData m_mediaQueryData;
+};
+
+} // namespace WebCore
+
+#endif // MediaQueryParser_h

Powered by Google App Engine
This is Rietveld 408576698