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