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