1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "core/css/parser/MediaQueryToken.h"
8 #include "wtf/HashMap.h"
9 #include "wtf/text/StringHash.h"
15 MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, BlockType blockType)
19 , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
20 , m_blockType(blockType)
24 // Just a helper used for Delimiter tokens.
25 MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, UChar c)
29 , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
30 , m_blockType(NotBlock)
32 ASSERT(m_type == DelimiterToken);
35 MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, String value, BlockType blockType)
40 , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
41 , m_blockType(blockType)
45 MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, double numericValue, NumericValueType numericValueType)
48 , m_numericValueType(numericValueType)
49 , m_numericValue(numericValue)
50 , m_unit(CSSPrimitiveValue::CSS_NUMBER)
51 , m_blockType(NotBlock)
53 ASSERT(type == NumberToken);
56 void MediaQueryToken::convertToDimensionWithUnit(String unit)
58 ASSERT(m_type == NumberToken);
59 m_type = DimensionToken;
60 m_unit = CSSPrimitiveValue::fromName(unit);
63 void MediaQueryToken::convertToPercentage()
65 ASSERT(m_type == NumberToken);
66 m_type = PercentageToken;
67 m_unit = CSSPrimitiveValue::CSS_PERCENTAGE;
70 // This function is used only for testing
71 // FIXME - This doesn't cover all possible Token types, but it's enough for current testing.
72 String MediaQueryToken::textForUnitTests() const
74 char buffer[std::numeric_limits<float>::digits];
75 if (!m_value.isNull())
77 if (m_type == LeftParenthesisToken)
79 if (m_type == RightParenthesisToken)
81 if (m_type == ColonToken)
83 if (m_type == WhitespaceToken)
87 sprintf(buffer, "'%c'", m_delimiter);
88 return String(buffer, strlen(buffer));
91 static const unsigned maxUnitBufferLength = 6;
92 char unitBuffer[maxUnitBufferLength] = {0};
93 if (m_unit == CSSPrimitiveValue::CSS_PERCENTAGE)
94 sprintf(unitBuffer, "%s", "%");
95 else if (m_unit == CSSPrimitiveValue::CSS_PX)
96 sprintf(unitBuffer, "%s", "px");
97 else if (m_unit == CSSPrimitiveValue::CSS_EMS)
98 sprintf(unitBuffer, "%s", "em");
99 else if (m_unit != CSSPrimitiveValue::CSS_NUMBER)
100 sprintf(unitBuffer, "%s", "other");
101 if (m_numericValueType == IntegerValueType)
102 sprintf(buffer, "%d%s", static_cast<int>(m_numericValue), unitBuffer);
104 sprintf(buffer, "%f%s", m_numericValue, unitBuffer);
106 return String(buffer, strlen(buffer));
111 UChar MediaQueryToken::delimiter() const
113 ASSERT(m_type == DelimiterToken);
117 NumericValueType MediaQueryToken::numericValueType() const
119 ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
120 return m_numericValueType;
123 double MediaQueryToken::numericValue() const
125 ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
126 return m_numericValue;