Upstream version 11.39.266.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / parser / MediaQueryToken.cpp
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
12 namespace blink {
13
14
15 MediaQueryToken::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.
25 MediaQueryToken::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
35 MediaQueryToken::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
45 MediaQueryToken::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
56 void MediaQueryToken::convertToDimensionWithUnit(String unit)
57 {
58     ASSERT(m_type == NumberToken);
59     m_type = DimensionToken;
60     m_unit = CSSPrimitiveValue::fromName(unit);
61 }
62
63 void 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.
72 String 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
111 UChar MediaQueryToken::delimiter() const
112 {
113     ASSERT(m_type == DelimiterToken);
114     return m_delimiter;
115 }
116
117 NumericValueType MediaQueryToken::numericValueType() const
118 {
119     ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
120     return m_numericValueType;
121 }
122
123 double MediaQueryToken::numericValue() const
124 {
125     ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
126     return m_numericValue;
127 }
128
129 } // namespace blink