18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CSSParserValues_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CSSParserValues_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "CSSSelector.h"
25f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicString.h>
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CSSValue;
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass QualifiedName;
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct CSSParserString {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar* characters;
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void lower();
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    operator String() const { return String(characters, length); }
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    operator AtomicString() const { return AtomicString(characters, length); }
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct CSSParserFunction;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct CSSParserValue {
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int id;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInt;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    union {
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        double fValue;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int iValue;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserString string;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSParserFunction* function;
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum {
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Operator = 0x100000,
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Function = 0x100001,
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Q_EMS    = 0x100002
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int unit;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PassRefPtr<CSSValue> createCSSValue();
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass CSSParserValueList {
65ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_FAST_ALLOCATED;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValueList()
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        : m_current(0)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~CSSParserValueList();
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addValue(const CSSParserValue&);
742bde8e466a4451c7319e3a072d118917957d6554Steve Block    void insertValueAt(unsigned, const CSSParserValue&);
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void deleteValueAt(unsigned);
762bde8e466a4451c7319e3a072d118917957d6554Steve Block    void extend(CSSParserValueList&);
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned size() const { return m_values.size(); }
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* current() { return m_current < m_values.size() ? &m_values[m_current] : 0; }
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* next() { ++m_current; return current(); }
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserValue* valueAt(unsigned i) { return i < m_values.size() ? &m_values[i] : 0; }
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void clear() { m_values.clear(); }
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned m_current;
886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Vector<CSSParserValue, 4> m_values;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
91ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstruct CSSParserFunction {
92ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_FAST_ALLOCATED;
93ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochpublic:
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSParserString name;
955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    OwnPtr<CSSParserValueList> args;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass CSSParserSelector {
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WTF_MAKE_FAST_ALLOCATED;
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic:
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserSelector();
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ~CSSParserSelector();
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    PassOwnPtr<CSSSelector> releaseSelector() { return m_selector.release(); }
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setTag(const QualifiedName& value) { m_selector->setTag(value); }
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setValue(const AtomicString& value) { m_selector->setValue(value); }
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setAttribute(const QualifiedName& value) { m_selector->setAttribute(value); }
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setArgument(const AtomicString& value) { m_selector->setArgument(value); }
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setMatch(CSSSelector::Match value) { m_selector->m_match = value; }
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setRelation(CSSSelector::Relation value) { m_selector->m_relation = value; }
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setForPage() { m_selector->setForPage(); }
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block    void adoptSelectorVector(Vector<OwnPtr<CSSParserSelector> >& selectorVector);
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSSelector::PseudoType pseudoType() const { return m_selector->pseudoType(); }
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool isUnknownPseudoElement() const { return m_selector->isUnknownPseudoElement(); }
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool isSimple() const { return !m_tagHistory && m_selector->isSimple(); }
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSParserSelector* tagHistory() const { return m_tagHistory.get(); }
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setTagHistory(PassOwnPtr<CSSParserSelector> selector) { m_tagHistory = selector; }
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    OwnPtr<CSSSelector> m_selector;
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    OwnPtr<CSSParserSelector> m_tagHistory;
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
131