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.
4
5#include "config.h"
6#include "core/css/parser/MediaQueryToken.h"
7
8#include "wtf/HashMap.h"
9#include "wtf/text/StringHash.h"
10#include <limits.h>
11
12namespace blink {
13
14
15MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, BlockType blockType)
16    : m_type(type)
17    , m_delimiter(0)
18    , m_numericValue(0)
19    , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
20    , m_blockType(blockType)
21{
22}
23
24// Just a helper used for Delimiter tokens.
25MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, UChar c)
26    : m_type(type)
27    , m_delimiter(c)
28    , m_numericValue(0)
29    , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
30    , m_blockType(NotBlock)
31{
32    ASSERT(m_type == DelimiterToken);
33}
34
35MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, String value, BlockType blockType)
36    : m_type(type)
37    , m_value(value)
38    , m_delimiter(0)
39    , m_numericValue(0)
40    , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
41    , m_blockType(blockType)
42{
43}
44
45MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, double numericValue, NumericValueType numericValueType)
46    : m_type(type)
47    , m_delimiter(0)
48    , m_numericValueType(numericValueType)
49    , m_numericValue(numericValue)
50    , m_unit(CSSPrimitiveValue::CSS_NUMBER)
51    , m_blockType(NotBlock)
52{
53    ASSERT(type == NumberToken);
54}
55
56void MediaQueryToken::convertToDimensionWithUnit(String unit)
57{
58    ASSERT(m_type == NumberToken);
59    m_type = DimensionToken;
60    m_unit = CSSPrimitiveValue::fromName(unit);
61}
62
63void MediaQueryToken::convertToPercentage()
64{
65    ASSERT(m_type == NumberToken);
66    m_type = PercentageToken;
67    m_unit = CSSPrimitiveValue::CSS_PERCENTAGE;
68}
69
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.
72String MediaQueryToken::textForUnitTests() const
73{
74    char buffer[std::numeric_limits<float>::digits];
75    if (!m_value.isNull())
76        return m_value;
77    if (m_type == LeftParenthesisToken)
78        return String("(");
79    if (m_type == RightParenthesisToken)
80        return String(")");
81    if (m_type == ColonToken)
82        return String(":");
83    if (m_type == WhitespaceToken)
84        return String(" ");
85
86    if (m_delimiter) {
87        sprintf(buffer, "'%c'", m_delimiter);
88        return String(buffer, strlen(buffer));
89    }
90    if (m_numericValue) {
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);
103        else
104            sprintf(buffer, "%f%s", m_numericValue, unitBuffer);
105
106        return String(buffer, strlen(buffer));
107    }
108    return String();
109}
110
111UChar MediaQueryToken::delimiter() const
112{
113    ASSERT(m_type == DelimiterToken);
114    return m_delimiter;
115}
116
117NumericValueType MediaQueryToken::numericValueType() const
118{
119    ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
120    return m_numericValueType;
121}
122
123double MediaQueryToken::numericValue() const
124{
125    ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
126    return m_numericValue;
127}
128
129} // namespace blink
130