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)
24c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ScriptWrappable.h"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
26f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h"
2751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURL.h"
28a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "wtf/HashMap.h"
29521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/ListHashSet.h"
30521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/RefCounted.h"
31521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/RefPtr.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)enum CSSTextFormattingFlags { QuoteCSSStringIfNeeded, AlwaysQuoteCSSString };
38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue).
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function.
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// They should be handled by separate wrapper classes.
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Please don't expose more CSSValue types to the web.
44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class CSSValue : public RefCountedWillBeGarbageCollectedFinalized<CSSValue>, public ScriptWrappableBase {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Type {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_INHERIT = 0,
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_PRIMITIVE_VALUE = 1,
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_VALUE_LIST = 2,
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_CUSTOM = 3,
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSS_INITIAL = 4
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Override RefCounted's deref() to ensure operator delete is called on
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the appropriate subclass type.
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // When oilpan is enabled the finalize method is called by the garbage
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // collector and not immediately when deref reached zero.
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#if !ENABLE(OILPAN)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void deref()
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (derefBase())
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            destroy();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif // !ENABLE(OILPAN)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Type cssValueType() const;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String cssText() const;
70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void setCSSText(const String&, ExceptionState&) { } // FIXME: Not implemented.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isValueList() const { return m_classType >= ValueListClass; }
7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBaseValueList() const { return m_classType == ValueListClass; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isCanvasValue() const { return m_classType == CanvasClass; }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCursorImageValue() const { return m_classType == CursorImageClass; }
811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isCrossfadeValue() const { return m_classType == CrossfadeClass; }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFontValue() const { return m_classType == FontClass; }
849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool isFontFaceSrcValue() const { return m_classType == FontFaceSrcClass; }
85c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    bool isFunctionValue() const { return m_classType == FunctionClass; }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isImageSetValue() const { return m_classType == ImageSetClass; }
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isImageValue() const { return m_classType == ImageClass; }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isImplicitInitialValue() const;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isInheritedValue() const { return m_classType == InheritedClass; }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isInitialValue() const { return m_classType == InitialClass; }
931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isLinearGradientValue() const { return m_classType == LinearGradientClass; }
941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isRadialGradientValue() const { return m_classType == RadialGradientClass; }
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isReflectValue() const { return m_classType == ReflectClass; }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isShadowValue() const { return m_classType == ShadowClass; }
97bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    bool isTextCloneCSSValue() const { return m_isTextClone; }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isTransformValue() const { return m_classType == CSSTransformClass; }
1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
1021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isCalcValue() const {return m_classType == CalculationClass; }
1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isFilterValue() const { return m_classType == CSSFilterClass; }
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; }
1051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isSVGDocumentValue() const { return m_classType == CSSSVGDocumentClass; }
1061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; }
10802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCSSOMSafe() const { return m_isCSSOMSafe; }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSubtypeExposedToCSSOM() const
11102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return isPrimitiveValue() || isValueList();
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    PassRefPtrWillBeRawPtr<CSSValue> cloneForCSSOM() const;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasFailedOrCanceledSubresources() const;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool equals(const CSSValue&) const;
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
12143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void finalizeGarbageCollectedObject();
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void traceAfterDispatch(Visitor*) { }
12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void trace(Visitor*);
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const size_t ClassTypeBits = 6;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum ClassType {
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PrimitiveClass,
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Image classes.
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ImageClass,
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CursorImageClass,
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Image generator classes.
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CanvasClass,
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CrossfadeClass,
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LinearGradientClass,
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RadialGradientClass,
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Timing function classes.
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CubicBezierTimingFunctionClass,
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StepsTimingFunctionClass,
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Other class types.
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AspectRatioClass,
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BorderImageSliceClass,
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FontFeatureClass,
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FontClass,
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FontFaceSrcClass,
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FunctionClass,
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InheritedClass,
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InitialClass,
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ReflectClass,
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ShadowClass,
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UnicodeRangeClass,
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LineBoxContainClass,
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CalculationClass,
16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        GridTemplateAreasClass,
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
16393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        // SVG classes.
1645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSSVGDocumentClass,
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // List class types must appear after ValueListClass.
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ValueListClass,
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ImageSetClass,
1695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSFilterClass,
1705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CSSTransformClass,
17151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        GridLineNamesClass,
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Do not append non-list class types here.
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const size_t ValueListSeparatorBits = 2;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum ValueListSeparator {
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SpaceSeparator,
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CommaSeparator,
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SlashSeparator
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ClassType classType() const { return static_cast<ClassType>(m_classType); }
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_isCSSOMSafe(isCSSOMSafe)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_isTextClone(false)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_primitiveUnitType(0)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasCachedCSSText(false)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_isQuirkValue(false)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_valueListSeparator(SpaceSeparator)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_classType(classType)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NOTE: This class is non-virtual for memory and performance reasons.
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't go making it virtual again unless you know exactly what you're doing!
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~CSSValue() { }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void destroy();
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_isCSSOMSafe : 1;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_isTextClone : 1;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The bits in this section are only used by specific subclasses but kept here
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to maximize struct packing.
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // CSSPrimitiveValue bits:
210d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitType
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable unsigned m_hasCachedCSSText : 1;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_isQuirkValue : 1;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_valueListSeparator : ValueListSeparatorBits;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_classType : ClassTypeBits; // ClassType
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<typename CSSValueType, size_t inlineCapacity>
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)inline bool compareCSSValueVector(const WillBeHeapVector<RefPtrWillBeMember<CSSValueType>, inlineCapacity>& firstVector, const WillBeHeapVector<RefPtrWillBeMember<CSSValueType>, inlineCapacity>& secondVector)
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t size = firstVector.size();
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (size != secondVector.size())
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < size; i++) {
228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const RefPtrWillBeMember<CSSValueType>& firstPtr = firstVector[i];
229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const RefPtrWillBeMember<CSSValueType>& secondPtr = secondVector[i];
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (firstPtr == secondPtr || (firstPtr && secondPtr && firstPtr->equals(*secondPtr)))
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename CSSValueType>
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline bool compareCSSValuePtr(const RefPtr<CSSValueType>& first, const RefPtr<CSSValueType>& second)
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return first ? second && first->equals(*second) : !second;
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
24309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)template<typename CSSValueType>
24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)inline bool compareCSSValuePtr(const RawPtr<CSSValueType>& first, const RawPtr<CSSValueType>& second)
24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return first ? second && first->equals(*second) : !second;
24709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
24809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
24909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)template<typename CSSValueType>
25009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)inline bool compareCSSValuePtr(const Member<CSSValueType>& first, const Member<CSSValueType>& second)
25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return first ? second && first->equals(*second) : !second;
25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
255bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#define DEFINE_CSS_VALUE_TYPE_CASTS(thisType, predicate) \
256bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    DEFINE_TYPE_CASTS(thisType, CSSValue, value, value->predicate, value.predicate)
25706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
258c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // CSSValue_h
261