summaryrefslogtreecommitdiff
path: root/Source/WebCore/css/parser/MediaQueryParser.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/css/parser/MediaQueryParser.h')
-rw-r--r--Source/WebCore/css/parser/MediaQueryParser.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/Source/WebCore/css/parser/MediaQueryParser.h b/Source/WebCore/css/parser/MediaQueryParser.h
new file mode 100644
index 000000000..e51d6c32a
--- /dev/null
+++ b/Source/WebCore/css/parser/MediaQueryParser.h
@@ -0,0 +1,136 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright (C) 2016 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "CSSParserToken.h"
+#include "CSSParserTokenRange.h"
+#include "MediaList.h"
+#include "MediaQuery.h"
+#include "MediaQueryBlockWatcher.h"
+#include "MediaQueryExpression.h"
+#include <wtf/text/WTFString.h>
+
+namespace WebCore {
+
+class MediaQuerySet;
+
+class MediaQueryData {
+ WTF_MAKE_NONCOPYABLE(MediaQueryData);
+public:
+ MediaQueryData();
+ void clear();
+ bool addExpression();
+ bool tryAddParserToken(CSSParserTokenType, const CSSParserToken&);
+ void setMediaType(const String&);
+
+ MediaQuery::Restrictor restrictor() const { return m_restrictor; };
+ Vector<MediaQueryExpression>& expressions() { return m_expressions; }
+ String mediaType() const { return m_mediaType; }
+
+ inline bool currentMediaQueryChanged() const
+ {
+ return (m_restrictor != MediaQuery::None || m_mediaTypeSet || m_expressions.size() > 0);
+ }
+ inline MediaQuery::Restrictor restrictor() { return m_restrictor; }
+
+ inline void setRestrictor(MediaQuery::Restrictor restrictor) { m_restrictor = restrictor; }
+
+ inline void setMediaFeature(const String& str) { m_mediaFeature = str; }
+
+private:
+ MediaQuery::Restrictor m_restrictor;
+ String m_mediaType;
+ Vector<MediaQueryExpression> m_expressions;
+ String m_mediaFeature;
+ Vector<CSSParserToken, 4> m_valueList;
+ bool m_mediaTypeSet;
+};
+
+class MediaQueryParser {
+ WTF_MAKE_NONCOPYABLE(MediaQueryParser);
+public:
+ static RefPtr<MediaQuerySet> parseMediaQuerySet(const String&);
+ static RefPtr<MediaQuerySet> parseMediaQuerySet(CSSParserTokenRange);
+ static RefPtr<MediaQuerySet> parseMediaCondition(CSSParserTokenRange);
+
+private:
+ enum ParserType {
+ MediaQuerySetParser,
+ MediaConditionParser,
+ };
+
+ MediaQueryParser(ParserType);
+ virtual ~MediaQueryParser();
+
+ RefPtr<MediaQuerySet> parseInternal(CSSParserTokenRange);
+
+ void processToken(const CSSParserToken&);
+
+ void readRestrictor(CSSParserTokenType, const CSSParserToken&);
+ void readMediaNot(CSSParserTokenType, const CSSParserToken&);
+ void readMediaType(CSSParserTokenType, const CSSParserToken&);
+ void readAnd(CSSParserTokenType, const CSSParserToken&);
+ void readFeatureStart(CSSParserTokenType, const CSSParserToken&);
+ void readFeature(CSSParserTokenType, const CSSParserToken&);
+ void readFeatureColon(CSSParserTokenType, const CSSParserToken&);
+ void readFeatureValue(CSSParserTokenType, const CSSParserToken&);
+ void readFeatureEnd(CSSParserTokenType, const CSSParserToken&);
+ void skipUntilComma(CSSParserTokenType, const CSSParserToken&);
+ void skipUntilBlockEnd(CSSParserTokenType, const CSSParserToken&);
+ void done(CSSParserTokenType, const CSSParserToken&);
+
+ using State = void (MediaQueryParser::*)(CSSParserTokenType, const CSSParserToken&);
+
+ void setStateAndRestrict(State, MediaQuery::Restrictor);
+ void handleBlocks(const CSSParserToken&);
+
+ void commitMediaQuery();
+
+ State m_state;
+ ParserType m_parserType;
+ MediaQueryData m_mediaQueryData;
+ RefPtr<MediaQuerySet> m_querySet;
+ MediaQueryBlockWatcher m_blockWatcher;
+
+ const static State ReadRestrictor;
+ const static State ReadMediaNot;
+ const static State ReadMediaType;
+ const static State ReadAnd;
+ const static State ReadFeatureStart;
+ const static State ReadFeature;
+ const static State ReadFeatureColon;
+ const static State ReadFeatureValue;
+ const static State ReadFeatureEnd;
+ const static State SkipUntilComma;
+ const static State SkipUntilBlockEnd;
+ const static State Done;
+};
+
+} // namespace WebCore