1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h"
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/parser/MediaQueryToken.h"
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/HashMap.h"
9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/text/StringHash.h"
1007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include <limits.h>
11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
156f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochMediaQueryToken::MediaQueryToken(MediaQueryTokenType type, BlockType blockType)
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_type(type)
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_delimiter(0)
1807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    , m_numericValue(0)
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    , m_blockType(blockType)
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Just a helper used for Delimiter tokens.
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, UChar c)
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_type(type)
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_delimiter(c)
2807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    , m_numericValue(0)
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    , m_blockType(NotBlock)
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(m_type == DelimiterToken);
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
356f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochMediaQueryToken::MediaQueryToken(MediaQueryTokenType type, String value, BlockType blockType)
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_type(type)
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_value(value)
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_delimiter(0)
3907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    , m_numericValue(0)
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    , m_blockType(blockType)
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, double numericValue, NumericValueType numericValueType)
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_type(type)
47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_delimiter(0)
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_numericValueType(numericValueType)
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_numericValue(numericValue)
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_unit(CSSPrimitiveValue::CSS_NUMBER)
516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    , m_blockType(NotBlock)
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(type == NumberToken);
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void MediaQueryToken::convertToDimensionWithUnit(String unit)
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(m_type == NumberToken);
59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_type = DimensionToken;
6007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_unit = CSSPrimitiveValue::fromName(unit);
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void MediaQueryToken::convertToPercentage()
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(m_type == NumberToken);
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_type = PercentageToken;
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_unit = CSSPrimitiveValue::CSS_PERCENTAGE;
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// This function is used only for testing
7107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// FIXME - This doesn't cover all possible Token types, but it's enough for current testing.
7207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochString MediaQueryToken::textForUnitTests() const
7307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
74f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    char buffer[std::numeric_limits<float>::digits];
7507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!m_value.isNull())
7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_value;
7707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_type == LeftParenthesisToken)
7807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String("(");
7907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_type == RightParenthesisToken)
8007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String(")");
8107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_type == ColonToken)
8207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String(":");
8307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_type == WhitespaceToken)
8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String(" ");
8507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
8607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_delimiter) {
87d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        sprintf(buffer, "'%c'", m_delimiter);
8807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String(buffer, strlen(buffer));
8907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
9007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_numericValue) {
91d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        static const unsigned maxUnitBufferLength = 6;
9207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        char unitBuffer[maxUnitBufferLength] = {0};
9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (m_unit == CSSPrimitiveValue::CSS_PERCENTAGE)
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            sprintf(unitBuffer, "%s", "%");
9507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        else if (m_unit == CSSPrimitiveValue::CSS_PX)
9607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            sprintf(unitBuffer, "%s", "px");
9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        else if (m_unit == CSSPrimitiveValue::CSS_EMS)
9807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            sprintf(unitBuffer, "%s", "em");
99d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        else if (m_unit != CSSPrimitiveValue::CSS_NUMBER)
100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            sprintf(unitBuffer, "%s", "other");
10107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (m_numericValueType == IntegerValueType)
10207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            sprintf(buffer, "%d%s", static_cast<int>(m_numericValue), unitBuffer);
10307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        else
10407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            sprintf(buffer, "%f%s", m_numericValue, unitBuffer);
10507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String(buffer, strlen(buffer));
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return String();
10907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
111f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuUChar MediaQueryToken::delimiter() const
112f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
113f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(m_type == DelimiterToken);
114f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return m_delimiter;
115f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
116f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
117f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuNumericValueType MediaQueryToken::numericValueType() const
118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
119f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
120f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return m_numericValueType;
121f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
122f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
123f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liudouble MediaQueryToken::numericValue() const
124f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
125f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
126f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return m_numericValue;
127f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
130