15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999-2003 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSPrimitiveValue.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSBasicShapes.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSCalculationValue.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSHelper.h"
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/CSSMarkup.h"
29a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/css/CSSToLengthConversionData.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/Counter.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/Pair.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/RGBColor.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/Rect.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetContents.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyle.h"
38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "platform/Decimal.h"
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/LayoutUnit.h"
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/fonts/FontMetrics.h"
41591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/StdLibExtras.h"
42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuffer.h"
43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h"
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
48e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Max/min values for CSS, needs to slightly smaller/larger than the true max/min values to allow for rounding without overflowing.
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Subtract two (rather than one) to allow for values to be converted to float and back without exceeding the LayoutUnit::max.
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const int maxValueForCssLength = INT_MAX / kFixedPointDenominator - 2;
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const int minValueForCssLength = INT_MIN / kFixedPointDenominator + 2;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static inline bool isValidCSSUnitTypeForDoubleConversion(CSSPrimitiveValue::UnitType unitType)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (unitType) {
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_CALC:
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER:
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH:
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_CM:
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_DEG:
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_DIMENSION:
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_DPPX:
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_DPI:
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_DPCM:
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_EMS:
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_EXS:
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_GRAD:
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_HZ:
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_IN:
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_KHZ:
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_MM:
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_MS:
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_NUMBER:
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PERCENTAGE:
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PC:
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PT:
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PX:
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_RAD:
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_REMS:
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSSPrimitiveValue::CSS_CHS:
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_S:
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_TURN:
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_VW:
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_VH:
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_VMIN:
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSSPrimitiveValue::CSS_VMAX:
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case CSSPrimitiveValue::CSS_FR:
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_ATTR:
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_COUNTER:
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_COUNTER_NAME:
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_IDENT:
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSSPrimitiveValue::CSS_PROPERTY_ID:
955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSSPrimitiveValue::CSS_VALUE_ID:
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PAIR:
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR:
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_RECT:
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_QUAD:
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_RGBCOLOR:
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_SHAPE:
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_STRING:
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_UNICODE_RANGE:
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_UNKNOWN:
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_URI:
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)typedef HashMap<String, CSSPrimitiveValue::UnitType> StringToUnitTable;
114f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
115f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuStringToUnitTable createStringToUnitTable()
116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
117f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    StringToUnitTable table;
118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("em"), CSSPrimitiveValue::CSS_EMS);
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("ex"), CSSPrimitiveValue::CSS_EXS);
120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("px"), CSSPrimitiveValue::CSS_PX);
121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("cm"), CSSPrimitiveValue::CSS_CM);
122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("mm"), CSSPrimitiveValue::CSS_MM);
123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("in"), CSSPrimitiveValue::CSS_IN);
124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("pt"), CSSPrimitiveValue::CSS_PT);
125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("pc"), CSSPrimitiveValue::CSS_PC);
126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("deg"), CSSPrimitiveValue::CSS_DEG);
127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("rad"), CSSPrimitiveValue::CSS_RAD);
128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("grad"), CSSPrimitiveValue::CSS_GRAD);
129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("ms"), CSSPrimitiveValue::CSS_MS);
130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("s"), CSSPrimitiveValue::CSS_S);
131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("hz"), CSSPrimitiveValue::CSS_HZ);
132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("khz"), CSSPrimitiveValue::CSS_KHZ);
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("dpi"), CSSPrimitiveValue::CSS_DPI);
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("dpcm"), CSSPrimitiveValue::CSS_DPCM);
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("dppx"), CSSPrimitiveValue::CSS_DPPX);
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("vw"), CSSPrimitiveValue::CSS_VW);
137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("vh"), CSSPrimitiveValue::CSS_VH);
138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("vmax"), CSSPrimitiveValue::CSS_VMIN);
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    table.set(String("vmin"), CSSPrimitiveValue::CSS_VMAX);
140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    table.set(String("rem"), CSSPrimitiveValue::CSS_REMS);
141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    table.set(String("fr"), CSSPrimitiveValue::CSS_FR);
142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    table.set(String("turn"), CSSPrimitiveValue::CSS_TURN);
143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    table.set(String("ch"), CSSPrimitiveValue::CSS_CHS);
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return table;
145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
147d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::UnitType CSSPrimitiveValue::fromName(const String& unit)
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
149f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    DEFINE_STATIC_LOCAL(StringToUnitTable, unitTable, (createStringToUnitTable()));
15007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return unitTable.get(unit.lower());
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::UnitCategory CSSPrimitiveValue::unitCategory(UnitType type)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Here we violate the spec (http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue) and allow conversions
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // between CSS_PX and relative lengths (see cssPixelsPerInch comment in core/css/CSSHelper.h for the topic treatment).
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
158e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_NUMBER:
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UNumber;
160e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PERCENTAGE:
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UPercent;
162e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PX:
163e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_CM:
164e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_MM:
165e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_IN:
166e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PT:
167e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PC:
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::ULength;
169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_MS:
170e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_S:
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UTime;
172e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DEG:
173e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_RAD:
174e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_GRAD:
175e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_TURN:
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UAngle;
177e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_HZ:
178e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_KHZ:
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UFrequency;
180e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DPPX:
181e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DPI:
182e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DPCM:
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UResolution;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSSPrimitiveValue::UOther;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
189591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool CSSPrimitiveValue::colorIsDerivedFromElement() const
190591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
191591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    int valueID = getValueID();
192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    switch (valueID) {
193591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSValueWebkitText:
194591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSValueWebkitLink:
195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSValueWebkitActivelink:
196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case CSSValueCurrentcolor:
197591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return true;
198591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    default:
199591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return false;
200591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
201591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
202591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<const CSSPrimitiveValue*, String> CSSTextCache;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static CSSTextCache& cssTextCache()
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(CSSTextCache, cache, ());
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return cache;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
210d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::UnitType CSSPrimitiveValue::primitiveType() const
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (m_primitiveUnitType == CSS_PROPERTY_ID || m_primitiveUnitType == CSS_VALUE_ID)
2135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return CSS_IDENT;
2145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
215e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (m_primitiveUnitType != CSS_CALC)
216d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return static_cast<UnitType>(m_primitiveUnitType);
21702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_value.calc->category()) {
219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    case CalcAngle:
220c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return CSS_DEG;
221c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    case CalcFrequency:
222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return CSS_HZ;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CalcNumber:
224e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSS_NUMBER;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CalcPercent:
226e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSS_PERCENTAGE;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CalcLength:
228e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSS_PX;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CalcPercentNumber:
230e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSS_CALC_PERCENTAGE_WITH_NUMBER;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CalcPercentLength:
232e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSS_CALC_PERCENTAGE_WITH_LENGTH;
233c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    case CalcTime:
234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return CSS_MS;
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CalcOther:
236e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSS_UNKNOWN;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
238e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return CSS_UNKNOWN;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)static const AtomicString& propertyName(CSSPropertyID propertyID)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT_ARG(propertyID, propertyID >= 0);
2445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT_ARG(propertyID, (propertyID >= firstCSSProperty && propertyID < firstCSSProperty + numCSSProperties));
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (propertyID < 0)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nullAtom;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return getPropertyNameAtomicString(propertyID);
2505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)static const AtomicString& valueName(CSSValueID valueID)
2535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
2545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT_ARG(valueID, valueID >= 0);
2555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT_ARG(valueID, valueID < numCSSValueKeywords);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (valueID < 0)
2585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return nullAtom;
2595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    static AtomicString* keywordStrings = new AtomicString[numCSSValueKeywords]; // Leaked intentionally.
2615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    AtomicString& keywordString = keywordStrings[valueID];
2625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (keywordString.isNull())
2635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        keywordString = getValueName(valueID);
2645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return keywordString;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)CSSPrimitiveValue::CSSPrimitiveValue(CSSValueID valueID)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : CSSValue(PrimitiveClass)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_primitiveUnitType = CSS_VALUE_ID;
2715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_value.valueID = valueID;
2725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)CSSPrimitiveValue::CSSPrimitiveValue(CSSPropertyID propertyID)
2755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    : CSSValue(PrimitiveClass)
2765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
2775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_primitiveUnitType = CSS_PROPERTY_ID;
2785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_value.propertyID = propertyID;
2795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::CSSPrimitiveValue(double num, UnitType type)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : CSSValue(PrimitiveClass)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = type;
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(std::isfinite(num));
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.num = num;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
289d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitType type)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : CSSValue(PrimitiveClass)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = type;
293197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_value.string = str.impl();
294197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_value.string)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.string->ref();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
298f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuCSSPrimitiveValue::CSSPrimitiveValue(const LengthSize& lengthSize, const RenderStyle& style)
29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : CSSValue(PrimitiveClass)
30009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
301f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    init(lengthSize, style);
30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::CSSPrimitiveValue(RGBA32 color, UnitType type)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : CSSValue(PrimitiveClass)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(type == CSS_RGBCOLOR);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_RGBCOLOR;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.rgbcolor = color;
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)CSSPrimitiveValue::CSSPrimitiveValue(const Length& length, float zoom)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : CSSValue(PrimitiveClass)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (length.type()) {
316c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case Auto:
317d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
318d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueAuto;
319d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
320c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case Intrinsic:
321d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
322d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueIntrinsic;
323d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
324c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case MinIntrinsic:
325d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
326d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueMinIntrinsic;
327d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
328c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case MinContent:
329d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
330d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueMinContent;
331d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
332c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case MaxContent:
333d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
334d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueMaxContent;
335d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
336c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case FillAvailable:
337d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
338d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueWebkitFillAvailable;
339d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
340c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case FitContent:
341d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
342d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueWebkitFitContent;
343d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
344c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case ExtendToZoom:
345d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_VALUE_ID;
346d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.valueID = CSSValueInternalExtendToZoom;
347d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        break;
348c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case Percent:
349d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_primitiveUnitType = CSS_PERCENTAGE;
350d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        ASSERT(std::isfinite(length.percent()));
351d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_value.num = length.percent();
35210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
353c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case Fixed:
354c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_primitiveUnitType = CSS_PX;
3551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_value.num = length.value() / zoom;
35610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
35710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case Calculated: {
35810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        const CalculationValue& calc = length.calculationValue();
35910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (calc.pixels() && calc.percent()) {
36010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            init(CSSCalcValue::create(
36110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch                CSSCalcValue::createExpressionNode(calc.pixels() / zoom, calc.percent()),
36210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch                calc.isNonNegative() ? ValueRangeNonNegative : ValueRangeAll));
36310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            break;
36410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        }
36510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (calc.percent()) {
36610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            m_primitiveUnitType = CSS_PERCENTAGE;
36710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            m_value.num = calc.percent();
36810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        } else {
36910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            m_primitiveUnitType = CSS_PX;
37010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            m_value.num = calc.pixels() / zoom;
37110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        }
37210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (m_value.num < 0 && calc.isNonNegative())
37310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            m_value.num = 0;
37410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
37510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceWidth:
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceHeight:
3789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case MaxSizeNone:
379c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        ASSERT_NOT_REACHED();
380c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        break;
381c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
382c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
383c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
384f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid CSSPrimitiveValue::init(const LengthSize& lengthSize, const RenderStyle& style)
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
38609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_primitiveUnitType = CSS_PAIR;
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasCachedCSSText = false;
388f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_value.pair = Pair::create(create(lengthSize.width(), style.effectiveZoom()), create(lengthSize.height(), style.effectiveZoom()), Pair::KeepIdenticalValues).leakRef();
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSPrimitiveValue::init(PassRefPtrWillBeRawPtr<Counter> c)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_COUNTER;
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = false;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.counter = c.leakRef();
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void CSSPrimitiveValue::init(PassRefPtrWillBeRawPtr<Rect> r)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_RECT;
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = false;
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.rect = r.leakRef();
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void CSSPrimitiveValue::init(PassRefPtrWillBeRawPtr<Quad> quad)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_QUAD;
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = false;
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.quad = quad.leakRef();
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSPrimitiveValue::init(PassRefPtrWillBeRawPtr<Pair> p)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_PAIR;
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = false;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.pair = p.leakRef();
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSPrimitiveValue::init(PassRefPtrWillBeRawPtr<CSSCalcValue> c)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_CALC;
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = false;
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.calc = c.leakRef();
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void CSSPrimitiveValue::init(PassRefPtrWillBeRawPtr<CSSBasicShape> shape)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = CSS_SHAPE;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = false;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_value.shape = shape.leakRef();
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSPrimitiveValue::~CSSPrimitiveValue()
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cleanup();
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CSSPrimitiveValue::cleanup()
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
440d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    switch (static_cast<UnitType>(m_primitiveUnitType)) {
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_STRING:
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_URI:
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_ATTR:
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_COUNTER_NAME:
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PARSER_HEXCOLOR:
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_value.string)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_value.string->deref();
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_COUNTER:
45009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // We must not call deref() when oilpan is enabled because m_value.counter is traced.
45109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#if !ENABLE(OILPAN)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.counter->deref();
45309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RECT:
456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // We must not call deref() when oilpan is enabled because m_value.rect is traced.
457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if !ENABLE(OILPAN)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.rect->deref();
459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_QUAD:
462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // We must not call deref() when oilpan is enabled because m_value.quad is traced.
463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if !ENABLE(OILPAN)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.quad->deref();
465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PAIR:
46809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // We must not call deref() when oilpan is enabled because m_value.pair is traced.
46909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#if !ENABLE(OILPAN)
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.pair->deref();
47109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_CALC:
47409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // We must not call deref() when oilpan is enabled because m_value.calc is traced.
47509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#if !ENABLE(OILPAN)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.calc->deref();
47709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_CALC_PERCENTAGE_WITH_NUMBER:
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_CALC_PERCENTAGE_WITH_LENGTH:
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_SHAPE:
484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // We must not call deref() when oilpan is enabled because m_value.shape is traced.
485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if !ENABLE(OILPAN)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value.shape->deref();
487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_NUMBER:
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PERCENTAGE:
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_EMS:
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_EXS:
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_REMS:
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_CHS:
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PX:
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_CM:
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_MM:
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_IN:
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PT:
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PC:
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DEG:
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RAD:
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_GRAD:
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_MS:
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_S:
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_HZ:
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_KHZ:
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_TURN:
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_VW:
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_VH:
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_VMIN:
512926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_VMAX:
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DPPX:
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DPI:
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DPCM:
51653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case CSS_FR:
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_IDENT:
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RGBCOLOR:
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DIMENSION:
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_UNKNOWN:
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_UNICODE_RANGE:
5225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSS_PROPERTY_ID:
5235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSS_VALUE_ID:
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_primitiveUnitType = 0;
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_hasCachedCSSText) {
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssTextCache().remove(this);
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hasCachedCSSText = false;
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
533c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)double CSSPrimitiveValue::computeSeconds()
534c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(isTime() || (isCalculated() && cssCalcValue()->category() == CalcTime));
536c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnitType currentType = isCalculated() ? cssCalcValue()->expressionNode()->primitiveType() : static_cast<UnitType>(m_primitiveUnitType);
537c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (currentType == CSS_S)
538c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return getDoubleValue();
539c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (currentType == CSS_MS)
540c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return getDoubleValue() / 1000;
541c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT_NOT_REACHED();
542c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return 0;
543c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
544c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double CSSPrimitiveValue::computeDegrees()
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
547c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(isAngle() || (isCalculated() && cssCalcValue()->category() == CalcAngle));
548c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnitType currentType = isCalculated() ? cssCalcValue()->expressionNode()->primitiveType() : static_cast<UnitType>(m_primitiveUnitType);
549c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    switch (currentType) {
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DEG:
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getDoubleValue();
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RAD:
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return rad2deg(getDoubleValue());
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_GRAD:
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return grad2deg(getDoubleValue());
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_TURN:
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return turn2deg(getDoubleValue());
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
564a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> int CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
566a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return roundForImpreciseConversion<int>(computeLengthDouble(conversionData));
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
569a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> unsigned CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
571a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return roundForImpreciseConversion<unsigned>(computeLengthDouble(conversionData));
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
574a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> Length CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
576a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return Length(clampTo<float>(computeLengthDouble(conversionData), minValueForCssLength, maxValueForCssLength), Fixed);
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
579a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> short CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
581a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return roundForImpreciseConversion<short>(computeLengthDouble(conversionData));
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
584a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> unsigned short CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
586a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return roundForImpreciseConversion<unsigned short>(computeLengthDouble(conversionData));
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
589a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> float CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
591a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return static_cast<float>(computeLengthDouble(conversionData));
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
594a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)template<> double CSSPrimitiveValue::computeLength(const CSSToLengthConversionData& conversionData)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
596a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return computeLengthDouble(conversionData);
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
599a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)double CSSPrimitiveValue::computeLengthDouble(const CSSToLengthConversionData& conversionData)
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // The logic in this function is duplicated in MediaValues::computeLength
60210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // because MediaValues::computeLength needs nearly identical logic, but we haven't found a way to make
60310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // CSSPrimitiveValue::computeLengthDouble more generic (to solve both cases) without hurting performance.
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_primitiveUnitType == CSS_CALC)
605a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return m_value.calc->computeLengthPx(conversionData);
606a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
607a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    const RenderStyle& style = conversionData.style();
608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const RenderStyle* rootStyle = conversionData.rootStyle();
609a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool computingFontSize = conversionData.computingFontSize();
61002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double factor;
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (primitiveType()) {
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_EMS:
615a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            factor = computingFontSize ? style.fontDescription().specifiedSize() : style.fontDescription().computedSize();
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_EXS:
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // FIXME: We have a bug right now where the zoom will be applied twice to EX units.
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // We really need to compute EX using fontMetrics for the original specifiedSize and not use
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // our actual constructed rendering font.
621a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (style.fontMetrics().hasXHeight())
622a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                factor = style.fontMetrics().xHeight();
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
624a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                factor = (computingFontSize ? style.fontDescription().specifiedSize() : style.fontDescription().computedSize()) / 2.0;
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_REMS:
627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (rootStyle)
628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                factor = computingFontSize ? rootStyle->fontDescription().specifiedSize() : rootStyle->fontDescription().computedSize();
629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            else
630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                factor = 1.0;
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case CSS_CHS:
633a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            factor = style.fontMetrics().zeroWidth();
634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PX:
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            factor = 1.0;
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_CM:
639a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            factor = cssPixelsPerCentimeter;
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_MM:
642a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            factor = cssPixelsPerMillimeter;
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_IN:
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            factor = cssPixelsPerInch;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PT:
648a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            factor = cssPixelsPerPoint;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PC:
651a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            factor = cssPixelsPerPica;
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
65309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case CSS_VW:
65409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            factor = conversionData.viewportWidthPercent();
65509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            break;
65609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case CSS_VH:
65709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            factor = conversionData.viewportHeightPercent();
65809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            break;
65909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case CSS_VMIN:
66009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            factor = conversionData.viewportMinPercent();
66109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            break;
66209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case CSS_VMAX:
66309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            factor = conversionData.viewportMaxPercent();
66409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            break;
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_CALC_PERCENTAGE_WITH_LENGTH:
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_CALC_PERCENTAGE_WITH_NUMBER:
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return -1.0;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return -1.0;
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We do not apply the zoom factor when we are computing the value of the font-size property. The zooming
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // for font sizes is much more complicated, since we have to worry about enforcing the minimum font size preference
676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // as well as enforcing the implicit "smart minimum."
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double result = getDoubleValue() * factor;
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (computingFontSize || isFontRelativeLength())
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
681a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return result * conversionData.zoom();
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
684a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid CSSPrimitiveValue::accumulateLengthArray(CSSLengthArray& lengthArray, double multiplier) const
685a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
686a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(lengthArray.size() == LengthUnitTypeCount);
687a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
688a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_primitiveUnitType == CSS_CALC) {
689a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        cssCalcValue()->accumulateLengthArray(lengthArray, multiplier);
690a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
691a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
692a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
693a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LengthUnitType lengthType;
694d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (unitTypeToLengthUnitType(static_cast<UnitType>(m_primitiveUnitType), lengthType))
695d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        lengthArray.at(lengthType) += m_value.num * conversionToCanonicalUnitsScaleFactor(static_cast<UnitType>(m_primitiveUnitType)) * multiplier;
696a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
697a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
69851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionState& exceptionState)
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Keeping values immutable makes optimizations easier and allows sharing of the primitive value objects.
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No other engine supports mutating style through this API. Computed style is always read-only anyway.
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Supporting setter would require making primitive value copy-on-write and taking care of style invalidation.
70309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    exceptionState.throwDOMException(NoModificationAllowedError, "CSSPrimitiveValue objects are read-only.");
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
706d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)double CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor(UnitType unitType)
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double factor = 1.0;
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: the switch can be replaced by an array of scale factors.
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (unitType) {
711e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // These are "canonical" units in their respective categories.
712e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PX:
713e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DEG:
714e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_MS:
715e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_HZ:
716e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
717e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_CM:
718a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        factor = cssPixelsPerCentimeter;
719e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
720e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DPCM:
721a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        factor = 1 / cssPixelsPerCentimeter;
722e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
723e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_MM:
724a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        factor = cssPixelsPerMillimeter;
725e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
726e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_IN:
727e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        factor = cssPixelsPerInch;
728e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
729e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_DPI:
730e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        factor = 1 / cssPixelsPerInch;
731e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
732e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PT:
733a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        factor = cssPixelsPerPoint;
734e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
735e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_PC:
736a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        factor = cssPixelsPerPica;
737e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
738e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_RAD:
739e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        factor = 180 / piDouble;
740e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
741e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_GRAD:
742e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        factor = 0.9;
743e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
744e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_TURN:
745e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        factor = 360;
746e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
747e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_S:
748e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSS_KHZ:
749e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        factor = 1000;
750e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
751e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    default:
752e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return factor;
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
758d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)double CSSPrimitiveValue::getDoubleValue(UnitType unitType, ExceptionState& exceptionState) const
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double result = 0;
761d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool success = getDoubleValueInternal(unitType, &result);
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!success) {
76309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "Failed to obtain a double value.");
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0.0;
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
770d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)double CSSPrimitiveValue::getDoubleValue(UnitType unitType) const
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double result = 0;
773d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    getDoubleValueInternal(unitType, &result);
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double CSSPrimitiveValue::getDoubleValue() const
77802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_primitiveUnitType != CSS_CALC ? m_value.num : m_value.calc->doubleValue();
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
782d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::UnitType CSSPrimitiveValue::canonicalUnitTypeForCategory(UnitCategory category)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
78409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // The canonical unit type is chosen according to the way BisonCSSParser::validUnit() chooses the default unit
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in each category (based on unitflags).
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (category) {
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case UNumber:
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_NUMBER;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ULength:
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_PX;
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case UPercent:
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_UNKNOWN; // Cannot convert between numbers and percent.
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case UTime:
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_MS;
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case UAngle:
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_DEG;
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case UFrequency:
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_HZ;
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case UResolution:
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_DPPX;
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return CSS_UNKNOWN;
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
806d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool CSSPrimitiveValue::getDoubleValueInternal(UnitType requestedUnitType, double* result) const
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
808d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!isValidCSSUnitTypeForDoubleConversion(static_cast<UnitType>(m_primitiveUnitType)) || !isValidCSSUnitTypeForDoubleConversion(requestedUnitType))
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
811d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    UnitType sourceUnitType = primitiveType();
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (requestedUnitType == sourceUnitType || requestedUnitType == CSS_DIMENSION) {
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *result = getDoubleValue();
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UnitCategory sourceCategory = unitCategory(sourceUnitType);
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(sourceCategory != UOther);
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
820d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    UnitType targetUnitType = requestedUnitType;
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UnitCategory targetCategory = unitCategory(targetUnitType);
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(targetCategory != UOther);
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Cannot convert between unrelated unit categories if one of them is not UNumber.
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (sourceCategory != targetCategory && sourceCategory != UNumber && targetCategory != UNumber)
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (targetCategory == UNumber) {
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We interpret conversion to CSS_NUMBER as conversion to a canonical unit in this value's category.
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        targetUnitType = canonicalUnitTypeForCategory(sourceCategory);
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetUnitType == CSS_UNKNOWN)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (sourceUnitType == CSS_NUMBER) {
83609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // We interpret conversion from CSS_NUMBER in the same way as BisonCSSParser::validUnit() while using non-strict mode.
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sourceUnitType = canonicalUnitTypeForCategory(targetCategory);
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (sourceUnitType == CSS_UNKNOWN)
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double convertedValue = getDoubleValue();
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First convert the value from m_primitiveUnitType to canonical type.
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double factor = conversionToCanonicalUnitsScaleFactor(sourceUnitType);
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    convertedValue *= factor;
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now convert from canonical type to the target unitType.
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    factor = conversionToCanonicalUnitsScaleFactor(targetUnitType);
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    convertedValue /= factor;
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *result = convertedValue;
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
856d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool CSSPrimitiveValue::unitTypeToLengthUnitType(UnitType unitType, LengthUnitType& lengthType)
857a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
858a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    switch (unitType) {
859a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_PX:
860a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_CM:
861a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_MM:
862a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_IN:
863a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_PT:
864a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_PC:
865a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypePixels;
866a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
867a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_EMS:
868a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeFontSize;
869a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
870a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_EXS:
871a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeFontXSize;
872a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
873a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_REMS:
874a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeRootFontSize;
875a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
876a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_CHS:
877a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeZeroCharacterWidth;
878a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
879a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_PERCENTAGE:
880a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypePercentage;
881a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
882a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_VW:
883a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeViewportWidth;
884a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
885a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_VH:
886a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeViewportHeight;
887a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
888a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_VMIN:
889a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeViewportMin;
890a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
891a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case CSSPrimitiveValue::CSS_VMAX:
892a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        lengthType = UnitTypeViewportMax;
893a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return true;
894a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    default:
895a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return false;
896a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
897a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
898a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
899d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSPrimitiveValue::UnitType CSSPrimitiveValue::lengthUnitTypeToUnitType(LengthUnitType type)
900a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
901a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    switch (type) {
902a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypePixels:
903a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_PX;
904a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeFontSize:
905a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_EMS;
906a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeFontXSize:
907a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_EXS;
908a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeRootFontSize:
909a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_REMS;
910a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeZeroCharacterWidth:
911a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_CHS;
912a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypePercentage:
913a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_PERCENTAGE;
914a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeViewportWidth:
915a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_VW;
916a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeViewportHeight:
917a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_VH;
918a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeViewportMin:
919a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_VMIN;
920a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case UnitTypeViewportMax:
921a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return CSSPrimitiveValue::CSS_VMAX;
922a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case LengthUnitTypeCount:
923a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        break;
924a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
925a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT_NOT_REACHED();
926a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return CSSPrimitiveValue::CSS_UNKNOWN;
927a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
928a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
92951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void CSSPrimitiveValue::setStringValue(unsigned short, const String&, ExceptionState& exceptionState)
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Keeping values immutable makes optimizations easier and allows sharing of the primitive value objects.
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No other engine supports mutating style through this API. Computed style is always read-only anyway.
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Supporting setter would require making primitive value copy-on-write and taking care of style invalidation.
93409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    exceptionState.throwDOMException(NoModificationAllowedError, "CSSPrimitiveValue objects are read-only.");
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String CSSPrimitiveValue::getStringValue(ExceptionState& exceptionState) const
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_primitiveUnitType) {
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_STRING:
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_ATTR:
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_URI:
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return m_value.string;
9445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        case CSS_VALUE_ID:
9455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return valueName(m_value.valueID);
9465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        case CSS_PROPERTY_ID:
9475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return propertyName(m_value.propertyID);
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
94909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            exceptionState.throwDOMException(InvalidAccessError, "This object's value cannot be represented as a string.");
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String CSSPrimitiveValue::getStringValue() const
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_primitiveUnitType) {
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_STRING:
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_ATTR:
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_URI:
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return m_value.string;
9635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        case CSS_VALUE_ID:
9645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return valueName(m_value.valueID);
9655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        case CSS_PROPERTY_ID:
9665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return propertyName(m_value.propertyID);
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Counter* CSSPrimitiveValue::getCounterValue(ExceptionState& exceptionState) const
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_primitiveUnitType != CSS_COUNTER) {
97709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "This object is not a counter value.");
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.counter;
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Rect* CSSPrimitiveValue::getRectValue(ExceptionState& exceptionState) const
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_primitiveUnitType != CSS_RECT) {
98709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "This object is not a rect value.");
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.rect;
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Quad* CSSPrimitiveValue::getQuadValue(ExceptionState& exceptionState) const
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_primitiveUnitType != CSS_QUAD) {
99709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "This object is not a quad value.");
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.quad;
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1004d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<RGBColor> CSSPrimitiveValue::getRGBColorValue(ExceptionState& exceptionState) const
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_primitiveUnitType != CSS_RGBCOLOR) {
100709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "This object is not an RGB color value.");
1008d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIMXE: This should not return a new object for each invocation.
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return RGBColor::create(m_value.rgbcolor);
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
101551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Pair* CSSPrimitiveValue::getPairValue(ExceptionState& exceptionState) const
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_primitiveUnitType != CSS_PAIR) {
101809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "This object is not a pair value.");
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.pair;
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static String formatNumber(double number, const char* suffix, unsigned suffixLength)
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1027d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Decimal decimal = Decimal::fromDouble(number);
1028d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    String result = decimal.toString();
1029d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    result.append(suffix, suffixLength);
1030d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return result;
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <unsigned characterCount>
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE static String formatNumber(double number, const char (&characters)[characterCount])
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return formatNumber(number, characters, characterCount - 1);
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1039f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liustatic String formatNumber(double number, const char* characters)
1040f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
1041f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return formatNumber(number, characters, strlen(characters));
1042f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
1043f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1044d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)const char* CSSPrimitiveValue::unitTypeToString(UnitType type)
1045f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
1046f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    switch (type) {
1047f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_NUMBER:
1048f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "";
1049f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PERCENTAGE:
1050f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "%";
1051f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_EMS:
1052f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "em";
1053f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_EXS:
1054f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "ex";
1055f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_REMS:
1056f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "rem";
1057f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_CHS:
1058f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "ch";
1059f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PX:
1060f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "px";
1061f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_CM:
1062f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "cm";
1063f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_DPPX:
1064f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "dppx";
1065f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_DPI:
1066f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "dpi";
1067f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_DPCM:
1068f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "dpcm";
1069f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_MM:
1070f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "mm";
1071f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_IN:
1072f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "in";
1073f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PT:
1074f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "pt";
1075f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PC:
1076f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "pc";
1077f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_DEG:
1078f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "deg";
1079f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_RAD:
1080f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "rad";
1081f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_GRAD:
1082f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "grad";
1083f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_MS:
1084f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "ms";
1085f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_S:
1086f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "s";
1087f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_HZ:
1088f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "hz";
1089f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_KHZ:
1090f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "khz";
1091f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_TURN:
1092f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "turn";
1093f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_FR:
1094f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "fr";
1095f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_VW:
1096f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "vw";
1097f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_VH:
1098f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "vh";
1099f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_VMIN:
1100f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "vmin";
1101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_VMAX:
1102f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return "vmax";
1103f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_UNKNOWN:
1104f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_DIMENSION:
1105f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_STRING:
1106f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_URI:
1107f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_VALUE_ID:
1108f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PROPERTY_ID:
1109f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_ATTR:
1110f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_COUNTER_NAME:
1111f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_COUNTER:
1112f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_RECT:
1113f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_QUAD:
1114f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_RGBCOLOR:
1115f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PARSER_HEXCOLOR:
1116f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_PAIR:
1117f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_CALC:
1118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_SHAPE:
1119f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_IDENT:
1120f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_UNICODE_RANGE:
1121f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_CALC_PERCENTAGE_WITH_NUMBER:
1122f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case CSS_CALC_PERCENTAGE_WITH_LENGTH:
1123f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        break;
1124f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    };
1125f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT_NOT_REACHED();
1126f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return "";
1127f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
1128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1129bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)String CSSPrimitiveValue::customCSSText(CSSTextFormattingFlags formattingFlag) const
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: return the original value instead of a generated one (e.g. color
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // name if it was specified) - check what spec says about this
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_hasCachedCSSText) {
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(cssTextCache().contains(this));
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return cssTextCache().get(this);
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String text;
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_primitiveUnitType) {
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_UNKNOWN:
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // FIXME
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_NUMBER:
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PERCENTAGE:
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_EMS:
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_EXS:
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_REMS:
1149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case CSS_CHS:
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PX:
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_CM:
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_DPPX:
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_DPI:
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_DPCM:
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_MM:
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_IN:
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PT:
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PC:
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_DEG:
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_RAD:
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_GRAD:
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_MS:
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_S:
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_HZ:
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_KHZ:
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_TURN:
1167f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        case CSS_FR:
1168f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        case CSS_VW:
1169f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        case CSS_VH:
1170f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        case CSS_VMIN:
1171f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        case CSS_VMAX:
1172d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            text = formatNumber(m_value.num, unitTypeToString((UnitType)m_primitiveUnitType));
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_DIMENSION:
11749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            // FIXME: We currently don't handle CSS_DIMENSION properly as we don't store
11759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            // the actual dimension, just the numeric value as a string.
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_STRING:
1178591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            text = formattingFlag == AlwaysQuoteCSSString ? quoteCSSString(m_value.string) : quoteCSSStringIfNeeded(m_value.string);
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_URI:
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = "url(" + quoteCSSURLIfNeeded(m_value.string) + ")";
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        case CSS_VALUE_ID:
11845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            text = valueName(m_value.valueID);
11855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            break;
11865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        case CSS_PROPERTY_ID:
11875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            text = propertyName(m_value.propertyID);
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_ATTR: {
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            StringBuilder result;
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.reserveCapacity(6 + m_value.string->length());
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.appendLiteral("attr(");
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(m_value.string);
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(')');
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = result.toString();
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_COUNTER_NAME:
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = "counter(" + String(m_value.string) + ')';
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_COUNTER: {
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            StringBuilder result;
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            String separator = m_value.counter->separator();
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (separator.isEmpty())
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.appendLiteral("counter(");
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.appendLiteral("counters(");
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(m_value.counter->identifier());
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!separator.isEmpty()) {
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.appendLiteral(", ");
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.append(quoteCSSStringIfNeeded(separator));
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            String listStyle = m_value.counter->listStyle();
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!listStyle.isEmpty()) {
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.appendLiteral(", ");
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.append(listStyle);
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(')');
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = result.toString();
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_RECT:
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = getRectValue()->cssText();
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_QUAD:
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = getQuadValue()->cssText();
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_RGBCOLOR:
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PARSER_HEXCOLOR: {
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RGBA32 rgbColor = m_value.rgbcolor;
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (m_primitiveUnitType == CSS_PARSER_HEXCOLOR)
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Color::parseHexColor(m_value.string, rgbColor);
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Color color(rgbColor);
123709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            text = color.serializedAsCSSComponentValue();
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_PAIR:
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = getPairValue()->cssText();
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_CALC:
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = m_value.calc->cssText();
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CSS_SHAPE:
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text = m_value.shape->cssText();
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!cssTextCache().contains(this));
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssTextCache().set(this, text);
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasCachedCSSText = true;
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return text;
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPrimitiveValue::cloneForCSSOM() const
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
125907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtrWillBeRawPtr<CSSPrimitiveValue> result = nullptr;
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_primitiveUnitType) {
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_STRING:
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_URI:
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_ATTR:
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_COUNTER_NAME:
1266d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.string, static_cast<UnitType>(m_primitiveUnitType));
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_COUNTER:
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.counter->cloneForCSSOM());
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RECT:
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.rect->cloneForCSSOM());
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_QUAD:
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.quad->cloneForCSSOM());
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PAIR:
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Pair is not exposed to the CSSOM, no need for a deep clone.
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.pair);
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_CALC:
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // CSSCalcValue is not exposed to the CSSOM, no need for a deep clone.
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.calc);
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_SHAPE:
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // CSSShapeValue is not exposed to the CSSOM, no need for a deep clone.
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.shape);
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_NUMBER:
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PERCENTAGE:
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_EMS:
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_EXS:
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_REMS:
1294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_CHS:
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PX:
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_CM:
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_MM:
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_IN:
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PT:
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PC:
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DEG:
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RAD:
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_GRAD:
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_MS:
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_S:
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_HZ:
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_KHZ:
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_TURN:
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_VW:
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_VH:
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_VMIN:
1312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_VMAX:
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DPPX:
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DPI:
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DPCM:
1316c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case CSS_FR:
1317d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        result = CSSPrimitiveValue::create(m_value.num, static_cast<UnitType>(m_primitiveUnitType));
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
13195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSS_PROPERTY_ID:
13205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        result = CSSPrimitiveValue::createIdentifier(m_value.propertyID);
13215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        break;
13225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSS_VALUE_ID:
13235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        result = CSSPrimitiveValue::createIdentifier(m_value.valueID);
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_RGBCOLOR:
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = CSSPrimitiveValue::createColor(m_value.rgbcolor);
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_DIMENSION:
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_UNKNOWN:
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSS_PARSER_HEXCOLOR:
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result)
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->setCSSOMSafe();
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool CSSPrimitiveValue::equals(const CSSPrimitiveValue& other) const
1341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_primitiveUnitType != other.m_primitiveUnitType)
1343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
1344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    switch (m_primitiveUnitType) {
1346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_UNKNOWN:
1347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
1348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_NUMBER:
1349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_PERCENTAGE:
1350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_EMS:
1351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_EXS:
1352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_REMS:
1353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_PX:
1354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_CM:
1355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_DPPX:
1356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_DPI:
1357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_DPCM:
1358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_MM:
1359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_IN:
1360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_PT:
1361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_PC:
1362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_DEG:
1363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_RAD:
1364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_GRAD:
1365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_MS:
1366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_S:
1367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_HZ:
1368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_KHZ:
1369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_TURN:
1370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_VW:
1371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_VH:
1372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_VMIN:
137353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case CSS_VMAX:
1374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_DIMENSION:
1375c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    case CSS_FR:
1376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.num == other.m_value.num;
13775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSS_PROPERTY_ID:
13785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return propertyName(m_value.propertyID) == propertyName(other.m_value.propertyID);
13795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    case CSS_VALUE_ID:
13805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return valueName(m_value.valueID) == valueName(other.m_value.valueID);
1381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_STRING:
1382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_URI:
1383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_ATTR:
1384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_COUNTER_NAME:
1385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_PARSER_HEXCOLOR:
1386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return equal(m_value.string, other.m_value.string);
1387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_COUNTER:
1388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.counter && other.m_value.counter && m_value.counter->equals(*other.m_value.counter);
1389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_RECT:
1390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.rect && other.m_value.rect && m_value.rect->equals(*other.m_value.rect);
1391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_QUAD:
1392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.quad && other.m_value.quad && m_value.quad->equals(*other.m_value.quad);
1393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_RGBCOLOR:
1394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.rgbcolor == other.m_value.rgbcolor;
1395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_PAIR:
1396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.pair && other.m_value.pair && m_value.pair->equals(*other.m_value.pair);
1397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_CALC:
1398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.calc && other.m_value.calc && m_value.calc->equals(*other.m_value.calc);
1399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSS_SHAPE:
1400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_value.shape && other.m_value.shape && m_value.shape->equals(*other.m_value.shape);
1401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
1403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
140509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSPrimitiveValue::traceAfterDispatch(Visitor* visitor)
140609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
1407197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(OILPAN)
140809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    switch (m_primitiveUnitType) {
140909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSS_COUNTER:
141009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        visitor->trace(m_value.counter);
141109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        break;
1412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case CSS_RECT:
1413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        visitor->trace(m_value.rect);
1414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
1415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case CSS_QUAD:
1416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        visitor->trace(m_value.quad);
1417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
141809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSS_PAIR:
141909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        visitor->trace(m_value.pair);
142009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        break;
142109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case CSS_CALC:
142209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        visitor->trace(m_value.calc);
142309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        break;
1424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case CSS_SHAPE:
1425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        visitor->trace(m_value.shape);
1426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
142709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    default:
142809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        break;
142909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
1430197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif
143109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    CSSValue::traceAfterDispatch(visitor);
143209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
143309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1434c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1435