190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (C) 2005 Frerich Raabe <raabe@kde.org>
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Copyright (C) 2006, 2009 Apple Inc.
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *
5f71323e297a928af368937089d3ed71239786f86Andreas Huber * Redistribution and use in source and binary forms, with or without
6f71323e297a928af368937089d3ed71239786f86Andreas Huber * modification, are permitted provided that the following conditions
7f71323e297a928af368937089d3ed71239786f86Andreas Huber * are met:
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1. Redistributions of source code must retain the above copyright
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *    notice, this list of conditions and the following disclaimer.
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2. Redistributions in binary form must reproduce the above copyright
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *    notice, this list of conditions and the following disclaimer in the
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *    documentation and/or other materials provided with the distribution.
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef XPathStep_h
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define XPathStep_h
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if ENABLE(XPATH)
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "Node.h"
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "XPathExpressionNode.h"
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "XPathNodeSet.h"
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubernamespace WebCore {
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    namespace XPath {
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        class Predicate;
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        class Step : public ParseNode, public Noncopyable {
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        public:
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            enum Axis {
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                AncestorAxis, AncestorOrSelfAxis, AttributeAxis,
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ChildAxis, DescendantAxis, DescendantOrSelfAxis,
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                FollowingAxis, FollowingSiblingAxis, NamespaceAxis,
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ParentAxis, PrecedingAxis, PrecedingSiblingAxis,
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                SelfAxis
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            };
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            class NodeTest : public FastAllocBase {
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            public:
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                enum Kind {
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    TextNodeTest, CommentNodeTest, ProcessingInstructionNodeTest, AnyNodeTest, NameTest
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                };
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                NodeTest(Kind kind) : m_kind(kind) {}
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                NodeTest(Kind kind, const String& data) : m_kind(kind), m_data(data) {}
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                NodeTest(Kind kind, const String& data, const String& namespaceURI) : m_kind(kind), m_data(data), m_namespaceURI(namespaceURI) {}
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Kind kind() const { return m_kind; }
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                const AtomicString& data() const { return m_data; }
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                const AtomicString& namespaceURI() const { return m_namespaceURI; }
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Vector<Predicate*>& mergedPredicates() { return m_mergedPredicates; }
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                const Vector<Predicate*>& mergedPredicates() const { return m_mergedPredicates; }
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            private:
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Kind m_kind;
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                AtomicString m_data;
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                AtomicString m_namespaceURI;
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // When possible, we merge some or all predicates with node test for better performance.
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Vector<Predicate*> m_mergedPredicates;
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            };
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Step(Axis, const NodeTest& nodeTest, const Vector<Predicate*>& predicates = Vector<Predicate*>());
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ~Step();
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            void optimize();
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            void evaluate(Node* context, NodeSet&) const;
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Axis axis() const { return m_axis; }
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const NodeTest& nodeTest() const { return m_nodeTest; }
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        private:
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            friend void optimizeStepPair(Step*, Step*, bool&);
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            bool predicatesAreContextListInsensitive() const;
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            void parseNodeTest(const String&);
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            void nodesInAxis(Node* context, NodeSet&) const;
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            String namespaceFromNodetest(const String& nodeTest) const;
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Axis m_axis;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            NodeTest m_nodeTest;
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Vector<Predicate*> m_predicates;
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        };
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        void optimizeStepPair(Step*, Step*, bool& dropSecondStep);
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif // ENABLE(XPATH)
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif // XPathStep_h
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber