blob: 9780c02760f32d32021c4f61eb92289409bda169 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/css/parser/MediaQueryToken.h"
#include "wtf/HashMap.h"
#include "wtf/text/StringHash.h"
#include <limits.h>
namespace blink {
MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, BlockType blockType)
: m_type(type)
, m_delimiter(0)
, m_numericValue(0)
, m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
, m_blockType(blockType)
{
}
// Just a helper used for Delimiter tokens.
MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, UChar c)
: m_type(type)
, m_delimiter(c)
, m_numericValue(0)
, m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
, m_blockType(NotBlock)
{
ASSERT(m_type == DelimiterToken);
}
MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, String value, BlockType blockType)
: m_type(type)
, m_value(value)
, m_delimiter(0)
, m_numericValue(0)
, m_unit(CSSPrimitiveValue::CSS_UNKNOWN)
, m_blockType(blockType)
{
}
MediaQueryToken::MediaQueryToken(MediaQueryTokenType type, double numericValue, NumericValueType numericValueType)
: m_type(type)
, m_delimiter(0)
, m_numericValueType(numericValueType)
, m_numericValue(numericValue)
, m_unit(CSSPrimitiveValue::CSS_NUMBER)
, m_blockType(NotBlock)
{
ASSERT(type == NumberToken);
}
void MediaQueryToken::convertToDimensionWithUnit(String unit)
{
ASSERT(m_type == NumberToken);
m_type = DimensionToken;
m_unit = CSSPrimitiveValue::fromName(unit);
}
void MediaQueryToken::convertToPercentage()
{
ASSERT(m_type == NumberToken);
m_type = PercentageToken;
m_unit = CSSPrimitiveValue::CSS_PERCENTAGE;
}
// This function is used only for testing
// FIXME - This doesn't cover all possible Token types, but it's enough for current testing.
String MediaQueryToken::textForUnitTests() const
{
char buffer[std::numeric_limits<float>::digits];
if (!m_value.isNull())
return m_value;
if (m_type == LeftParenthesisToken)
return String("(");
if (m_type == RightParenthesisToken)
return String(")");
if (m_type == ColonToken)
return String(":");
if (m_type == WhitespaceToken)
return String(" ");
if (m_delimiter) {
sprintf(buffer, "'%c'", m_delimiter);
return String(buffer, strlen(buffer));
}
if (m_numericValue) {
static const unsigned maxUnitBufferLength = 6;
char unitBuffer[maxUnitBufferLength] = {0};
if (m_unit == CSSPrimitiveValue::CSS_PERCENTAGE)
sprintf(unitBuffer, "%s", "%");
else if (m_unit == CSSPrimitiveValue::CSS_PX)
sprintf(unitBuffer, "%s", "px");
else if (m_unit == CSSPrimitiveValue::CSS_EMS)
sprintf(unitBuffer, "%s", "em");
else if (m_unit != CSSPrimitiveValue::CSS_NUMBER)
sprintf(unitBuffer, "%s", "other");
if (m_numericValueType == IntegerValueType)
sprintf(buffer, "%d%s", static_cast<int>(m_numericValue), unitBuffer);
else
sprintf(buffer, "%f%s", m_numericValue, unitBuffer);
return String(buffer, strlen(buffer));
}
return String();
}
UChar MediaQueryToken::delimiter() const
{
ASSERT(m_type == DelimiterToken);
return m_delimiter;
}
NumericValueType MediaQueryToken::numericValueType() const
{
ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
return m_numericValueType;
}
double MediaQueryToken::numericValue() const
{
ASSERT(m_type == NumberToken || m_type == PercentageToken || m_type == DimensionToken);
return m_numericValue;
}
} // namespace blink