Home | History | Annotate | Download | only in parser
      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
    130