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