15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 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 CSSParserValues_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CSSParserValues_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h"
2593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/css/CSSPrimitiveValue.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSSelector.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValueList.h"
285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/AtomicString.h"
295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/WTFString.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class QualifiedName;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserString {
3693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void init(const LChar* characters, unsigned length)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_data.characters8 = characters;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_length = length;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_is8Bit = true;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void init(const UChar* characters, unsigned length)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_data.characters16 = characters;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_length = length;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_is8Bit = false;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void init(const String& string)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        init(string, 0, string.length());
5393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
5493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
5593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void init(const String& string, unsigned startOffset, unsigned length)
5693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
5793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        m_length = length;
58fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        if (!m_length) {
59fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            m_data.characters8 = 0;
60fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            m_is8Bit = true;
61fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            return;
62fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        }
63fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        if (string.is8Bit()) {
6493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            m_data.characters8 = const_cast<LChar*>(string.characters8()) + startOffset;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_is8Bit = true;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            m_data.characters16 = const_cast<UChar*>(string.characters16()) + startOffset;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_is8Bit = false;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clear()
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_data.characters8 = 0;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_length = 0;
76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_is8Bit = true;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() const { return m_is8Bit; }
8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    const LChar* characters8() const { ASSERT(is8Bit()); return m_data.characters8; }
8193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    const UChar* characters16() const { ASSERT(!is8Bit()); return m_data.characters16; }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename CharacterType>
8393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    const CharacterType* characters() const;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() const { return m_length; }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setLength(unsigned length) { m_length = length; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    UChar operator[](unsigned i) const
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT_WITH_SECURITY_IMPLICATION(i < m_length);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (is8Bit())
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return m_data.characters8[i];
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_data.characters16[i];
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool equalIgnoringCase(const char* str) const
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool match = is8Bit() ? WTF::equalIgnoringCase(str, characters8(), length()) : WTF::equalIgnoringCase(str, characters16(), length());
99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!match)
100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT(strlen(str) >= length());
102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return str[length()] == '\0';
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    template <size_t strLength>
10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool startsWithIgnoringCase(const char (&str)[strLength]) const
10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
10893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return startsWithIgnoringCase(str, strLength - 1);
10993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool startsWithIgnoringCase(const char* str, size_t strLength) const
11293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
11393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (length() < strLength)
11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            return false;
11593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return is8Bit() ? WTF::equalIgnoringCase(str, characters8(), strLength) : WTF::equalIgnoringCase(str, characters16(), strLength);
11693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
118591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    operator String() const { return is8Bit() ? String(m_data.characters8, m_length) : StringImpl::create8BitIfPossible(m_data.characters16, m_length); }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    operator AtomicString() const { return is8Bit() ? AtomicString(m_data.characters8, m_length) : AtomicString(m_data.characters16, m_length); }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool isFunction() const { return length() > 0 && (*this)[length() - 1] == '('; }
1229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    union {
12493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        const LChar* characters8;
12593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        const UChar* characters16;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } m_data;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_length;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_is8Bit;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template <>
13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline const LChar* CSSParserString::characters<LChar>() const { return characters8(); }
13351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template <>
13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline const UChar* CSSParserString::characters<UChar>() const { return characters16(); }
13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserFunction;
138e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class CSSParserValueList;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserValue {
1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSValueID id;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isInt;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    union {
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double fValue;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int iValue;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSSParserString string;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CSSParserFunction* function;
14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        CSSParserValueList* valueList;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum {
15151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Operator  = 0x100000,
15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Function  = 0x100001,
15351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ValueList = 0x100002,
15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Q_EMS     = 0x100003,
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int unit;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    inline void setFromNumber(double value, int unit = CSSPrimitiveValue::CSS_NUMBER);
159521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    inline void setFromFunction(CSSParserFunction*);
16051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    inline void setFromValueList(PassOwnPtr<CSSParserValueList>);
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSParserValueList {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserValueList()
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_current(0)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~CSSParserValueList();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addValue(const CSSParserValue&);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void insertValueAt(unsigned, const CSSParserValue&);
17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void stealValues(CSSParserValueList&);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned size() const { return m_values.size(); }
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned currentIndex() { return m_current; }
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserValue* current() { return m_current < m_values.size() ? &m_values[m_current] : 0; }
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserValue* next() { ++m_current; return current(); }
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserValue* previous()
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_current)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        --m_current;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return current();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
187aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    void setCurrentIndex(unsigned index)
188aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    {
189aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        ASSERT(index < m_values.size());
190aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (index < m_values.size())
191aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            m_current = index;
192aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserValue* valueAt(unsigned i) { return i < m_values.size() ? &m_values[i] : 0; }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void clearAndLeakValues() { m_values.clear(); m_current = 0;}
197323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void destroyAndClear();
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_current;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<CSSParserValue, 4> m_values;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CSSParserFunction {
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserString name;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<CSSParserValueList> args;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSParserSelector {
21293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(CSSParserSelector); WTF_MAKE_FAST_ALLOCATED;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserSelector();
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    explicit CSSParserSelector(const QualifiedName&);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~CSSParserSelector();
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassOwnPtr<CSSSelector> releaseSelector() { return m_selector.release(); }
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    CSSSelector::Relation relation() const { return m_selector->relation(); }
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setValue(const AtomicString& value) { m_selector->setValue(value); }
222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void setAttribute(const QualifiedName& value, CSSSelector::AttributeMatchType matchType) { m_selector->setAttribute(value, matchType); }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setArgument(const AtomicString& value) { m_selector->setArgument(value); }
2245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void setMatch(CSSSelector::Match value) { m_selector->setMatch(value); }
2255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void setRelation(CSSSelector::Relation value) { m_selector->setRelation(value); }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setForPage() { m_selector->setForPage(); }
227df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setRelationIsAffectedByPseudoContent() { m_selector->setRelationIsAffectedByPseudoContent(); }
228df95704c49daea886ddad70775bda23618d6274dBen Murdoch    bool relationIsAffectedByPseudoContent() const { return m_selector->relationIsAffectedByPseudoContent(); }
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void adoptSelectorVector(Vector<OwnPtr<CSSParserSelector> >& selectorVector);
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
23207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool hasHostPseudoSelector() const;
23307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool isContentPseudoElement() const { return m_selector->isContentPseudoElement(); }
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSSelector::PseudoType pseudoType() const { return m_selector->pseudoType(); }
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCustomPseudoElement() const { return m_selector->isCustomPseudoElement(); }
23707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool crossesTreeScopes() const { return isCustomPseudoElement() || pseudoType() == CSSSelector::PseudoCue || pseudoType() == CSSSelector::PseudoShadow; }
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isSimple() const;
24093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool hasShadowPseudo() const;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSParserSelector* tagHistory() const { return m_tagHistory.get(); }
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setTagHistory(PassOwnPtr<CSSParserSelector> selector) { m_tagHistory = selector; }
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void clearTagHistory() { m_tagHistory.clear(); }
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void insertTagHistory(CSSSelector::Relation before, PassOwnPtr<CSSParserSelector>, CSSSelector::Relation after);
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void appendTagHistory(CSSSelector::Relation, PassOwnPtr<CSSParserSelector>);
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void prependTagSelector(const QualifiedName&, bool tagIsForNamespaceRule = false);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<CSSSelector> m_selector;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<CSSParserSelector> m_tagHistory;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline bool CSSParserSelector::hasShadowPseudo() const
25593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
25693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return m_selector->relation() == CSSSelector::ShadowPseudo;
25793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
25893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
25993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline void CSSParserValue::setFromNumber(double value, int unit)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    id = CSSValueInvalid;
26293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    isInt = false;
26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (std::isfinite(value))
26409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        fValue = value;
26509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    else
26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        fValue = 0;
26793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    this->unit = unit;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
270521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)inline void CSSParserValue::setFromFunction(CSSParserFunction* function)
271521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
272521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    id = CSSValueInvalid;
273521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this->function = function;
274521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    unit = Function;
2755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    isInt = false;
276521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
277521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
27851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline void CSSParserValue::setFromValueList(PassOwnPtr<CSSParserValueList> valueList)
27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
28051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    id = CSSValueInvalid;
28151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this->valueList = valueList.leakPtr();
28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    unit = ValueList;
2835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    isInt = false;
28451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
28551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
289