15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999-2003 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 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)#ifndef CSSValue_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CSSValue_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
25521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "weborigin/KURL.h"
26521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/ListHashSet.h"
27521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/RefCounted.h"
28521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/RefPtr.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StyleSheetContents;
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochenum CssTextFormattingFlags { QuoteCSSStringIfNeeded, AlwaysQuoteCSSString };
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue).
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function.
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// They should be handled by separate wrapper classes.
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Please don't expose more CSSValue types to the web.
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSValue : public RefCounted<CSSValue> {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Type {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_INHERIT = 0,
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_PRIMITIVE_VALUE = 1,
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_VALUE_LIST = 2,
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_CUSTOM = 3,
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_INITIAL = 4
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Override RefCounted's deref() to ensure operator delete is called on
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the appropriate subclass type.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void deref()
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (derefBase())
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            destroy();
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Type cssValueType() const;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String cssText() const;
64df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setCssText(const String&, ExceptionState&) { } // FIXME: Not implemented.
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isValueList() const { return m_classType >= ValueListClass; }
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBaseValueList() const { return m_classType == ValueListClass; }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCursorImageValue() const { return m_classType == CursorImageClass; }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFontValue() const { return m_classType == FontClass; }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isImageSetValue() const { return m_classType == ImageSetClass; }
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isImageValue() const { return m_classType == ImageClass; }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isImplicitInitialValue() const;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isInheritedValue() const { return m_classType == InheritedClass; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isInitialValue() const { return m_classType == InitialClass; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isReflectValue() const { return m_classType == ReflectClass; }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isShadowValue() const { return m_classType == ShadowClass; }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isLinearTimingFunctionValue() const { return m_classType == LinearTimingFunctionClass; }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isCSSTransformValue() const { return m_classType == CSSTransformClass; }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCSSLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCalculationValue() const {return m_classType == CalculationClass; }
925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isCSSFilterValue() const { return m_classType == CSSFilterClass; }
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isCSSArrayFunctionValue() const { return m_classType == CSSArrayFunctionValueClass; }
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isCSSMixFunctionValue() const { return m_classType == CSSMixFunctionValueClass; }
955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isCSSShaderValue() const { return m_classType == CSSShaderClass; }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isVariableValue() const { return m_classType == VariableClass; }
97f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool isGridTemplateValue() const { return m_classType == GridTemplateClass; }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSVGPaint() const { return m_classType == SVGPaintClass; }
1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isCSSSVGDocumentValue() const { return m_classType == CSSSVGDocumentClass; }
10102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCSSOMSafe() const { return m_isCSSOMSafe; }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSubtypeExposedToCSSOM() const
10402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return isPrimitiveValue() || isSVGColor() || isValueList();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<CSSValue> cloneForCSSOM() const;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addSubresourceStyleURLs(ListHashSet<KURL>&, const StyleSheetContents*) const;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasFailedOrCanceledSubresources() const;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool equals(const CSSValue&) const;
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const size_t ClassTypeBits = 6;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum ClassType {
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PrimitiveClass,
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Image classes.
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ImageClass,
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CursorImageClass,
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Image generator classes.
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CanvasClass,
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CrossfadeClass,
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LinearGradientClass,
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RadialGradientClass,
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Timing function classes.
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CubicBezierTimingFunctionClass,
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LinearTimingFunctionClass,
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StepsTimingFunctionClass,
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Other class types.
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AspectRatioClass,
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BorderImageSliceClass,
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FontFeatureClass,
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FontClass,
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FontFaceSrcClass,
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FunctionClass,
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InheritedClass,
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InitialClass,
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ReflectClass,
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ShadowClass,
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UnicodeRangeClass,
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LineBoxContainClass,
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CalculationClass,
1535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSShaderClass,
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VariableClass,
155f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        GridTemplateClass,
15693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        // SVG classes.
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGColorClass,
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGPaintClass,
1605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSSVGDocumentClass,
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // List class types must appear after ValueListClass.
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ValueListClass,
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ImageSetClass,
1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSFilterClass,
1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSArrayFunctionValueClass,
1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSMixFunctionValueClass,
1685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSTransformClass,
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Do not append non-list class types here.
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const size_t ValueListSeparatorBits = 2;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum ValueListSeparator {
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SpaceSeparator,
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CommaSeparator,
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SlashSeparator
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ClassType classType() const { return static_cast<ClassType>(m_classType); }
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_isCSSOMSafe(isCSSOMSafe)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_isTextClone(false)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_primitiveUnitType(0)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasCachedCSSText(false)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_isQuirkValue(false)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_valueListSeparator(SpaceSeparator)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_classType(classType)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NOTE: This class is non-virtual for memory and performance reasons.
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't go making it virtual again unless you know exactly what you're doing!
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~CSSValue() { }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void destroy();
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_isCSSOMSafe : 1;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_isTextClone : 1;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The bits in this section are only used by specific subclasses but kept here
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to maximize struct packing.
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // CSSPrimitiveValue bits:
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable unsigned m_hasCachedCSSText : 1;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_isQuirkValue : 1;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_valueListSeparator : ValueListSeparatorBits;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_classType : ClassTypeBits; // ClassType
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename CSSValueType>
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline bool compareCSSValueVector(const Vector<RefPtr<CSSValueType> >& firstVector, const Vector<RefPtr<CSSValueType> >& secondVector)
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t size = firstVector.size();
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (size != secondVector.size())
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < size; i++) {
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const RefPtr<CSSValueType>& firstPtr = firstVector[i];
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const RefPtr<CSSValueType>& secondPtr = secondVector[i];
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (firstPtr == secondPtr || (firstPtr && secondPtr && firstPtr->equals(*secondPtr)))
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename CSSValueType>
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline bool compareCSSValuePtr(const RefPtr<CSSValueType>& first, const RefPtr<CSSValueType>& second)
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return first ? second && first->equals(*second) : !second;
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // CSSValue_h
243