18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999-2003 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPrimitiveValue.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSHelper.h"
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "CSSParser.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CSSStyleSheet.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueKeywords.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Color.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Counter.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Node.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Pair.h"
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RGBColor.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Rect.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderStyle.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/ASCIICType.h>
38a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/DecimalNumber.h>
396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include <wtf/MathExtras.h>
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/text/StringBuffer.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DashboardRegion.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic CSSPrimitiveValue::UnitCategory unitCategory(CSSPrimitiveValue::UnitTypes type)
526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Here we violate the spec (http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue) and allow conversions
546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // between CSS_PX and relative lengths (see cssPixelsPerInch comment in CSSHelper.h for the topic treatment).
556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    switch (type) {
566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_NUMBER:
576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::UNumber;
586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_PERCENTAGE:
596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::UPercent;
606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_PX:
616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_CM:
626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_MM:
636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_IN:
646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_PT:
656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_PC:
666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::ULength;
676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_MS:
686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_S:
696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::UTime;
706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_DEG:
716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_RAD:
726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_GRAD:
736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_TURN:
746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::UAngle;
756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_HZ:
766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CSSPrimitiveValue::CSS_KHZ:
776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::UFrequency;
786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    default:
796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSSPrimitiveValue::UOther;
806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsentypedef HashMap<const CSSPrimitiveValue*, String> CSSTextCache;
846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic CSSTextCache& cssTextCache()
856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    DEFINE_STATIC_LOCAL(CSSTextCache, cache, ());
876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return cache;
886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const AtomicString& valueOrPropertyName(int valueOrPropertyID)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT_ARG(valueOrPropertyID, valueOrPropertyID >= 0);
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT_ARG(valueOrPropertyID, valueOrPropertyID < numCSSValueKeywords || (valueOrPropertyID >= firstCSSProperty && valueOrPropertyID < firstCSSProperty + numCSSProperties));
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (valueOrPropertyID < 0)
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return nullAtom;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (valueOrPropertyID < numCSSValueKeywords) {
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static AtomicString* cssValueKeywordStrings[numCSSValueKeywords];
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!cssValueKeywordStrings[valueOrPropertyID])
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            cssValueKeywordStrings[valueOrPropertyID] = new AtomicString(getValueName(valueOrPropertyID));
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return *cssValueKeywordStrings[valueOrPropertyID];
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (valueOrPropertyID >= firstCSSProperty && valueOrPropertyID < firstCSSProperty + numCSSProperties) {
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static AtomicString* cssPropertyStrings[numCSSProperties];
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int propertyIndex = valueOrPropertyID - firstCSSProperty;
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!cssPropertyStrings[propertyIndex])
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            cssPropertyStrings[propertyIndex] = new AtomicString(getPropertyName(static_cast<CSSPropertyID>(valueOrPropertyID)));
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return *cssPropertyStrings[propertyIndex];
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return nullAtom;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::CSSPrimitiveValue()
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(0)
1186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_hasCachedCSSText(false)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::CSSPrimitiveValue(int ident)
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(CSS_IDENT)
1246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_hasCachedCSSText(false)
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.ident = ident;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::CSSPrimitiveValue(double num, UnitTypes type)
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(type)
1316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_hasCachedCSSText(false)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.num = num;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitTypes type)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(type)
1386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_hasCachedCSSText(false)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((m_value.string = str.impl()))
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_value.string->ref();
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::CSSPrimitiveValue(RGBA32 color)
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(CSS_RGBCOLOR)
1466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_hasCachedCSSText(false)
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.rgbcolor = color;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::CSSPrimitiveValue(const Length& length)
1526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    : m_hasCachedCSSText(false)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (length.type()) {
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case Auto:
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = CSS_IDENT;
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.ident = CSSValueAuto;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebCore::Fixed:
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = CSS_PX;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.num = length.value();
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case Intrinsic:
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = CSS_IDENT;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.ident = CSSValueIntrinsic;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case MinIntrinsic:
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = CSS_IDENT;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.ident = CSSValueMinIntrinsic;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case Percent:
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_type = CSS_PERCENTAGE;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.num = length.percent();
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case Relative:
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT_NOT_REACHED();
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSPrimitiveValue::init(PassRefPtr<Counter> c)
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_type = CSS_COUNTER;
1846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_hasCachedCSSText = false;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.counter = c.releaseRef();
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSPrimitiveValue::init(PassRefPtr<Rect> r)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_type = CSS_RECT;
1916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_hasCachedCSSText = false;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.rect = r.releaseRef();
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSPrimitiveValue::init(PassRefPtr<DashboardRegion> r)
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_type = CSS_DASHBOARD_REGION;
1996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_hasCachedCSSText = false;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.region = r.releaseRef();
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSPrimitiveValue::init(PassRefPtr<Pair> p)
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_type = CSS_PAIR;
2076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_hasCachedCSSText = false;
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_value.pair = p.releaseRef();
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSPrimitiveValue::~CSSPrimitiveValue()
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cleanup();
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSPrimitiveValue::cleanup()
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_type) {
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_STRING:
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_URI:
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_ATTR:
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PARSER_HEXCOLOR:
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_value.string)
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_value.string->deref();
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_COUNTER:
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.counter->deref();
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_RECT:
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.rect->deref();
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PAIR:
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_value.pair->deref();
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_DASHBOARD_REGION:
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_value.region)
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_value.region->deref();
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_type = 0;
2466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_hasCachedCSSText) {
2476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        cssTextCache().remove(this);
2486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_hasCachedCSSText = false;
2496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochint CSSPrimitiveValue::computeLengthInt(RenderStyle* style, RenderStyle* rootStyle)
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return roundForImpreciseConversion<int, INT_MAX, INT_MIN>(computeLengthDouble(style, rootStyle));
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochint CSSPrimitiveValue::computeLengthInt(RenderStyle* style, RenderStyle* rootStyle, double multiplier)
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return roundForImpreciseConversion<int, INT_MAX, INT_MIN>(computeLengthDouble(style, rootStyle, multiplier));
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Lengths expect an int that is only 28-bits, so we have to check for a
2635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// different overflow.
2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochint CSSPrimitiveValue::computeLengthIntForLength(RenderStyle* style, RenderStyle* rootStyle)
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return roundForImpreciseConversion<int, intMaxForLength, intMinForLength>(computeLengthDouble(style, rootStyle));
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochint CSSPrimitiveValue::computeLengthIntForLength(RenderStyle* style, RenderStyle* rootStyle, double multiplier)
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return roundForImpreciseConversion<int, intMaxForLength, intMinForLength>(computeLengthDouble(style, rootStyle, multiplier));
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochshort CSSPrimitiveValue::computeLengthShort(RenderStyle* style, RenderStyle* rootStyle)
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return roundForImpreciseConversion<short, SHRT_MAX, SHRT_MIN>(computeLengthDouble(style, rootStyle));
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochshort CSSPrimitiveValue::computeLengthShort(RenderStyle* style, RenderStyle* rootStyle, double multiplier)
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return roundForImpreciseConversion<short, SHRT_MAX, SHRT_MIN>(computeLengthDouble(style, rootStyle, multiplier));
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochfloat CSSPrimitiveValue::computeLengthFloat(RenderStyle* style, RenderStyle* rootStyle, bool computingFontSize)
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<float>(computeLengthDouble(style, rootStyle, 1.0, computingFontSize));
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochfloat CSSPrimitiveValue::computeLengthFloat(RenderStyle* style, RenderStyle* rootStyle, double multiplier, bool computingFontSize)
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<float>(computeLengthDouble(style, rootStyle, multiplier, computingFontSize));
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochdouble CSSPrimitiveValue::computeLengthDouble(RenderStyle* style, RenderStyle* rootStyle, double multiplier, bool computingFontSize)
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned short type = primitiveType();
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We do not apply the zoom factor when we are computing the value of the font-size property.  The zooming
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // for font sizes is much more complicated, since we have to worry about enforcing the minimum font size preference
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as well as enforcing the implicit "smart minimum."  In addition the CSS property text-size-adjust is used to
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // prevent text from zooming at all.  Therefore we will not apply the zoom here if we are computing font-size.
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool applyZoomMultiplier = !computingFontSize;
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double factor = 1.0;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (type) {
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_EMS:
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyZoomMultiplier = false;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = computingFontSize ? style->fontDescription().specifiedSize() : style->fontDescription().computedSize();
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_EXS:
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME: We have a bug right now where the zoom will be applied twice to EX units.
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We really need to compute EX using fontMetrics for the original specifiedSize and not use
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // our actual constructed rendering font.
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyZoomMultiplier = false;
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            factor = style->fontMetrics().xHeight();
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case CSS_REMS:
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            applyZoomMultiplier = false;
319e2b458f91171bbf19531e243652a88cfa8539658Steve Block            if (rootStyle)
320e2b458f91171bbf19531e243652a88cfa8539658Steve Block                factor = computingFontSize ? rootStyle->fontDescription().specifiedSize() : rootStyle->fontDescription().computedSize();
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PX:
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_CM:
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch / 2.54; // (2.54 cm/in)
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_MM:
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch / 25.4;
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_IN:
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PT:
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch / 72.0;
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PC:
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // 1 pc == 12 pt
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch * 12.0 / 72.0;
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return -1.0;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double result = getDoubleValue() * factor;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!applyZoomMultiplier || multiplier == 1.0)
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return result;
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Any original result that was >= 1 should not be allowed to fall below 1.  This keeps border lines from
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // vanishing.
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double zoomedResult = result * multiplier;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result >= 1.0)
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedResult = max(1.0, zoomedResult);
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return zoomedResult;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionCode& ec)
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Keeping values immutable makes optimizations easier and allows sharing of the primitive value objects.
3596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // No other engine supports mutating style through this API. Computed style is always read-only anyway.
3606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Supporting setter would require making primitive value copy-on-write and taking care of style invalidation.
3616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ec = NO_MODIFICATION_ALLOWED_ERR;
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic double conversionToCanonicalUnitsScaleFactor(unsigned short unitType)
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double factor = 1.0;
3676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // FIXME: the switch can be replaced by an array of scale factors.
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (unitType) {
3696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // These are "canonical" units in their respective categories.
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPrimitiveValue::CSS_PX:
3716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_DEG:
3726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_MS:
3736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_HZ:
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPrimitiveValue::CSS_CM:
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch / 2.54; // (2.54 cm/in)
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPrimitiveValue::CSS_MM:
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch / 25.4;
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPrimitiveValue::CSS_IN:
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch;
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPrimitiveValue::CSS_PT:
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch / 72.0;
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPrimitiveValue::CSS_PC:
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            factor = cssPixelsPerInch * 12.0 / 72.0; // 1 pc == 12 pt
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_RAD:
3916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            factor = 180 / piDouble;
3926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            break;
3936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_GRAD:
3946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            factor = 0.9;
3956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            break;
3966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_TURN:
3976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            factor = 360;
3986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            break;
3996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_S:
4006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        case CSSPrimitiveValue::CSS_KHZ:
4016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            factor = 1000;
4026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            break;
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return factor;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerdouble CSSPrimitiveValue::getDoubleValue(unsigned short unitType, ExceptionCode& ec) const
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    double result = 0;
4136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    bool success = getDoubleValueInternal(static_cast<UnitTypes>(unitType), &result);
4146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!success) {
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INVALID_ACCESS_ERR;
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0.0;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ec = 0;
4206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return result;
4216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
4226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerdouble CSSPrimitiveValue::getDoubleValue(unsigned short unitType) const
4246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
4256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    double result = 0;
4266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    getDoubleValueInternal(static_cast<UnitTypes>(unitType), &result);
4276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return result;
4286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
4296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerCSSPrimitiveValue::UnitTypes CSSPrimitiveValue::canonicalUnitTypeForCategory(UnitCategory category)
4316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
4326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // The canonical unit type is chosen according to the way CSSParser::validUnit() chooses the default unit
4336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // in each category (based on unitflags).
4346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    switch (category) {
4356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case UNumber:
4366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_NUMBER;
4376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case ULength:
4386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_PX;
4396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case UPercent:
4406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_UNKNOWN; // Cannot convert between numbers and percent.
4416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case UTime:
4426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_MS;
4436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case UAngle:
4446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_DEG;
4456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case UFrequency:
4466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_HZ;
4476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    default:
4486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return CSS_UNKNOWN;
4496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool CSSPrimitiveValue::getDoubleValueInternal(UnitTypes requestedUnitType, double* result) const
4536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
4546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_type < CSS_NUMBER || (m_type > CSS_DIMENSION && m_type < CSS_TURN) || requestedUnitType < CSS_NUMBER || (requestedUnitType > CSS_DIMENSION && requestedUnitType < CSS_TURN))
4556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return false;
4566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (requestedUnitType == m_type || requestedUnitType == CSS_DIMENSION) {
4576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        *result = m_value.num;
4586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return true;
4596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UnitTypes sourceUnitType = static_cast<UnitTypes>(m_type);
4626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UnitCategory sourceCategory = unitCategory(sourceUnitType);
4636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ASSERT(sourceCategory != UOther);
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UnitTypes targetUnitType = requestedUnitType;
4666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UnitCategory targetCategory = unitCategory(targetUnitType);
4676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ASSERT(targetCategory != UOther);
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Cannot convert between unrelated unit categories if one of them is not UNumber.
4706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (sourceCategory != targetCategory && sourceCategory != UNumber && targetCategory != UNumber)
4716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return false;
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (targetCategory == UNumber) {
4746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // We interpret conversion to CSS_NUMBER as conversion to a canonical unit in this value's category.
4756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        targetUnitType = canonicalUnitTypeForCategory(sourceCategory);
4766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (targetUnitType == CSS_UNKNOWN)
4776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return false;
4786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (sourceUnitType == CSS_NUMBER) {
4816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // We interpret conversion from CSS_NUMBER in the same way as CSSParser::validUnit() while using non-strict mode.
4826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        sourceUnitType = canonicalUnitTypeForCategory(targetCategory);
4836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (sourceUnitType == CSS_UNKNOWN)
4846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return false;
4856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double convertedValue = m_value.num;
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // First convert the value from m_type to canonical type.
4906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    double factor = conversionToCanonicalUnitsScaleFactor(sourceUnitType);
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    convertedValue *= factor;
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Now convert from canonical type to the target unitType.
4946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    factor = conversionToCanonicalUnitsScaleFactor(targetUnitType);
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    convertedValue /= factor;
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    *result = convertedValue;
4986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return true;
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid CSSPrimitiveValue::setStringValue(unsigned short, const String&, ExceptionCode& ec)
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Keeping values immutable makes optimizations easier and allows sharing of the primitive value objects.
5046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // No other engine supports mutating style through this API. Computed style is always read-only anyway.
5056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Supporting setter would require making primitive value copy-on-write and taking care of style invalidation.
5066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ec = NO_MODIFICATION_ALLOWED_ERR;
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CSSPrimitiveValue::getStringValue(ExceptionCode& ec) const
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_type) {
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_STRING:
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_ATTR:
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_URI:
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_value.string;
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_IDENT:
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return valueOrPropertyName(m_value.ident);
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ec = INVALID_ACCESS_ERR;
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CSSPrimitiveValue::getStringValue() const
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_type) {
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_STRING:
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_ATTR:
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_URI:
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             return m_value.string;
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_IDENT:
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return valueOrPropertyName(m_value.ident);
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCounter* CSSPrimitiveValue::getCounterValue(ExceptionCode& ec) const
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_type != CSS_COUNTER) {
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INVALID_ACCESS_ERR;
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_value.counter;
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRect* CSSPrimitiveValue::getRectValue(ExceptionCode& ec) const
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_type != CSS_RECT) {
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INVALID_ACCESS_ERR;
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_value.rect;
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<RGBColor> CSSPrimitiveValue::getRGBColorValue(ExceptionCode& ec) const
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_type != CSS_RGBCOLOR) {
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INVALID_ACCESS_ERR;
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIMXE: This should not return a new object for each invocation.
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return RGBColor::create(m_value.rgbcolor);
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPair* CSSPrimitiveValue::getPairValue(ExceptionCode& ec) const
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_type != CSS_PAIR) {
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INVALID_ACCESS_ERR;
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_value.pair;
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned short CSSPrimitiveValue::cssValueType() const
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CSS_PRIMITIVE_VALUE;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSPrimitiveValue::parseString(const String& /*string*/, bool /*strict*/)
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerint CSSPrimitiveValue::getIdent() const
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_type != CSS_IDENT)
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_value.ident;
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
606a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic String formatNumber(double number)
607a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
608a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DecimalNumber decimal(number);
609a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
610a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    StringBuffer buffer(decimal.bufferLengthForStringDecimal());
611a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    unsigned length = decimal.toStringDecimal(buffer.characters(), buffer.length());
612a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT_UNUSED(length, length == buffer.length());
613a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
614a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return String::adopt(buffer);
615a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
616a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CSSPrimitiveValue::cssText() const
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: return the original value instead of a generated one (e.g. color
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // name if it was specified) - check what spec says about this
6216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
6226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_hasCachedCSSText) {
6236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        ASSERT(cssTextCache().contains(this));
6246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return cssTextCache().get(this);
6256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String text;
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_type) {
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_UNKNOWN:
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_NUMBER:
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PARSER_INTEGER:
634a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num);
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PERCENTAGE:
637a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "%";
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_EMS:
640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "em";
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_EXS:
643a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "ex";
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case CSS_REMS:
646a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "rem";
6470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PX:
649a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "px";
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_CM:
652a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "cm";
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_MM:
655a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "mm";
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_IN:
658a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "in";
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PT:
661a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "pt";
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PC:
664a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "pc";
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_DEG:
667a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "deg";
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_RAD:
670a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "rad";
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_GRAD:
673a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "grad";
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_MS:
676a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "ms";
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_S:
679a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "s";
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_HZ:
682a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "hz";
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_KHZ:
685a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "khz";
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case CSS_TURN:
688a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text = formatNumber(m_value.num) + "turn";
689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_DIMENSION:
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_STRING:
694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            text = quoteCSSStringIfNeeded(m_value.string);
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_URI:
697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            text = "url(" + quoteCSSURLIfNeeded(m_value.string) + ")";
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_IDENT:
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text = valueOrPropertyName(m_value.ident);
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
7025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        case CSS_ATTR: {
7035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            DEFINE_STATIC_LOCAL(const String, attrParen, ("attr("));
7045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            Vector<UChar> result;
7065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            result.reserveInitialCapacity(6 + m_value.string->length());
7075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            append(result, attrParen);
7095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            append(result, m_value.string);
7105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            result.uncheckedAppend(')');
7115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            text = String::adopt(result);
713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
7145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
71581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case CSS_COUNTER_NAME:
71681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            text = "counter(";
71781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            text += m_value.string;
71881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            text += ")";
71981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            break;
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_COUNTER:
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text = "counter(";
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text += String::number(m_value.num);
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text += ")";
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME: Add list-style and separator
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_RECT: {
727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            DEFINE_STATIC_LOCAL(const String, rectParen, ("rect("));
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Rect* rectVal = getRectValue();
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Vector<UChar> result;
7318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            result.reserveInitialCapacity(32);
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, rectParen);
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, rectVal->top()->cssText());
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.append(' ');
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, rectVal->right()->cssText());
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.append(' ');
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, rectVal->bottom()->cssText());
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.append(' ');
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, rectVal->left()->cssText());
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.append(')');
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            text = String::adopt(result);
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_RGBCOLOR:
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PARSER_HEXCOLOR: {
751635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            DEFINE_STATIC_LOCAL(const String, commaSpace, (", "));
752635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            DEFINE_STATIC_LOCAL(const String, rgbParen, ("rgb("));
753635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            DEFINE_STATIC_LOCAL(const String, rgbaParen, ("rgba("));
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RGBA32 rgbColor = m_value.rgbcolor;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_type == CSS_PARSER_HEXCOLOR)
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Color::parseHexColor(m_value.string, rgbColor);
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Color color(rgbColor);
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Vector<UChar> result;
7618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            result.reserveInitialCapacity(32);
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (color.hasAlpha())
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                append(result, rgbaParen);
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                append(result, rgbParen);
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            appendNumber(result, static_cast<unsigned char>(color.red()));
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, commaSpace);
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            appendNumber(result, static_cast<unsigned char>(color.green()));
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            append(result, commaSpace);
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            appendNumber(result, static_cast<unsigned char>(color.blue()));
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (color.hasAlpha()) {
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                append(result, commaSpace);
776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                append(result, String::number(color.alpha() / 256.0f));
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.append(')');
780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            text = String::adopt(result);
781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PAIR:
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text = m_value.pair->first()->cssText();
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text += " ";
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text += m_value.pair->second()->cssText();
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_DASHBOARD_REGION:
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (DashboardRegion* region = getDashboardRegionValue(); region; region = region->m_next.get()) {
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!text.isEmpty())
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text.append(' ');
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                text += "dashboard-region(";
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                text += region->m_label;
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (region->m_isCircle)
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text += " circle";
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (region->m_isRectangle)
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text += " rectangle";
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (region->top()->m_type == CSS_IDENT && region->top()->getIdent() == CSSValueInvalid) {
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ASSERT(region->right()->m_type == CSS_IDENT);
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ASSERT(region->bottom()->m_type == CSS_IDENT);
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ASSERT(region->left()->m_type == CSS_IDENT);
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ASSERT(region->right()->getIdent() == CSSValueInvalid);
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ASSERT(region->bottom()->getIdent() == CSSValueInvalid);
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ASSERT(region->left()->getIdent() == CSSValueInvalid);
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else {
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text.append(' ');
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text += region->top()->cssText() + " ";
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text += region->right()->cssText() + " ";
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text += region->bottom()->cssText() + " ";
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    text += region->left()->cssText();
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                text += ")";
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PARSER_OPERATOR: {
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            char c = static_cast<char>(m_value.ident);
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            text = String(&c, 1U);
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSS_PARSER_IDENTIFIER:
825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            text = quoteCSSStringIfNeeded(m_value.string);
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ASSERT(!cssTextCache().contains(this));
8306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    cssTextCache().set(this, text);
8316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_hasCachedCSSText = true;
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return text;
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
835635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSPrimitiveValue::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const CSSStyleSheet* styleSheet)
836635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
837635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_type == CSS_URI)
838635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        addSubresourceURL(urls, styleSheet->completeURL(m_value.string));
839635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
840635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
842