webengine/osswebengine/WebCore/css/CSSSelector.h
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/css/CSSSelector.h	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,184 @@
+/*
+ * This file is part of the CSS implementation for KDE.
+ *
+ * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
+ *               1999 Waldo Bastian (bastian@kde.org)
+ * Copyright (C) 2004, 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef CSSSelector_h
+#define CSSSelector_h
+
+#include "QualifiedName.h"
+
+namespace WebCore {
+
+    // this class represents a selector for a StyleRule
+    class CSSSelector {
+    public:
+        CSSSelector()
+            : m_tagHistory(0)
+            , m_simpleSelector(0)
+            , m_nextSelector(0)
+            , m_argument(nullAtom)
+            , m_attr(anyQName())
+            , m_tag(anyQName())
+            , m_relation(Descendant)
+            , m_match(None)
+            , m_pseudoType(PseudoNotParsed)
+        {
+        }
+
+        CSSSelector(const QualifiedName& qName)
+            : m_tagHistory(0)
+            , m_simpleSelector(0)
+            , m_nextSelector(0)
+            , m_argument(nullAtom)
+            , m_attr(anyQName())
+            , m_tag(qName)
+            , m_relation(Descendant)
+            , m_match(None)
+            , m_pseudoType(PseudoNotParsed)
+        {
+        }
+
+        ~CSSSelector()
+        {
+            delete m_tagHistory;
+            delete m_simpleSelector;
+            delete m_nextSelector;
+        }
+
+        void append(CSSSelector* n)
+        {
+            CSSSelector* end = this;
+            while (end->m_nextSelector)
+                end = end->m_nextSelector;
+            end->m_nextSelector = n;
+        }
+
+        CSSSelector* next() { return m_nextSelector; }
+
+        /**
+         * Print debug output for this selector
+         */
+        void print();
+
+        /**
+         * Re-create selector text from selector's data
+         */
+        String selectorText() const;
+
+        // checks if the 2 selectors (including sub selectors) agree.
+        bool operator==(const CSSSelector&);
+
+        // tag == -1 means apply to all elements (Selector = *)
+
+        unsigned specificity();
+
+        /* how the attribute value has to match.... Default is Exact */
+        enum Match {
+            None = 0,
+            Id,
+            Class,
+            Exact,
+            Set,
+            List,
+            Hyphen,
+            PseudoClass,
+            PseudoElement,
+            Contain,   // css3: E[foo*="bar"]
+            Begin,     // css3: E[foo^="bar"]
+            End        // css3: E[foo$="bar"]
+        };
+
+        enum Relation {
+            Descendant = 0,
+            Child,
+            DirectAdjacent,
+            IndirectAdjacent,
+            SubSelector
+        };
+
+        enum PseudoType {
+            PseudoNotParsed = 0,
+            PseudoUnknown,
+            PseudoEmpty,
+            PseudoFirstChild,
+            PseudoFirstOfType,
+            PseudoFirstLine,
+            PseudoFirstLetter,
+            PseudoLink,
+            PseudoVisited,
+            PseudoAnyLink,
+            PseudoAutofill,
+            PseudoHover,
+            PseudoDrag,
+            PseudoFocus,
+            PseudoActive,
+            PseudoChecked,
+            PseudoEnabled,
+            PseudoDisabled,
+            PseudoIndeterminate,
+            PseudoTarget,
+            PseudoBefore,
+            PseudoAfter,
+            PseudoLang,
+            PseudoNot,
+            PseudoRoot,
+            PseudoSelection,
+            PseudoFileUploadButton,
+            PseudoSliderThumb,
+            PseudoSearchCancelButton,
+            PseudoSearchDecoration,
+            PseudoSearchResultsDecoration,
+            PseudoSearchResultsButton
+        };
+
+        PseudoType pseudoType() const
+        {
+            if (m_pseudoType == PseudoNotParsed)
+                extractPseudoType();
+            return static_cast<PseudoType>(m_pseudoType);
+        }
+
+        bool hasTag() const { return m_tag != anyQName(); }
+        bool hasAttribute() const { return m_attr != anyQName(); }
+
+        Relation relation() const { return static_cast<Relation>(m_relation); }
+
+        mutable AtomicString m_value;
+        CSSSelector* m_tagHistory;
+        CSSSelector* m_simpleSelector; // Used for :not.
+        CSSSelector* m_nextSelector; // used for ,-chained selectors
+        AtomicString m_argument; // Used for :contains, :lang and :nth-*
+
+        QualifiedName m_attr;
+        QualifiedName m_tag;
+
+        unsigned m_relation           : 3; // enum Relation
+        mutable unsigned m_match      : 4; // enum Match
+        mutable unsigned m_pseudoType : 6; // PseudoType
+
+    private:
+        void extractPseudoType() const;
+    };
+
+} // namespace WebCore
+
+#endif // CSSSelector_h