18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2005 Frerich Raabe <raabe@kde.org>
35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2006, 2009 Apple Inc.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef XPathStep_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define XPathStep_h
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XPATH)
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XPathExpressionNode.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XPathNodeSet.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    namespace XPath {
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        class Predicate;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        class Step : public ParseNode {
43ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            WTF_MAKE_NONCOPYABLE(Step); WTF_MAKE_FAST_ALLOCATED;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        public:
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            enum Axis {
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                AncestorAxis, AncestorOrSelfAxis, AttributeAxis,
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ChildAxis, DescendantAxis, DescendantOrSelfAxis,
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                FollowingAxis, FollowingSiblingAxis, NamespaceAxis,
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ParentAxis, PrecedingAxis, PrecedingSiblingAxis,
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SelfAxis
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            };
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            class NodeTest {
54ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                WTF_MAKE_FAST_ALLOCATED;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            public:
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                enum Kind {
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    TextNodeTest, CommentNodeTest, ProcessingInstructionNodeTest, AnyNodeTest, NameTest
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                };
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NodeTest(Kind kind) : m_kind(kind) {}
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NodeTest(Kind kind, const String& data) : m_kind(kind), m_data(data) {}
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NodeTest(Kind kind, const String& data, const String& namespaceURI) : m_kind(kind), m_data(data), m_namespaceURI(namespaceURI) {}
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Kind kind() const { return m_kind; }
655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                const AtomicString& data() const { return m_data; }
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                const AtomicString& namespaceURI() const { return m_namespaceURI; }
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Vector<Predicate*>& mergedPredicates() { return m_mergedPredicates; }
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                const Vector<Predicate*>& mergedPredicates() const { return m_mergedPredicates; }
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            private:
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Kind m_kind;
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                AtomicString m_data;
735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                AtomicString m_namespaceURI;
745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                // When possible, we merge some or all predicates with node test for better performance.
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Vector<Predicate*> m_mergedPredicates;
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            };
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Step(Axis, const NodeTest& nodeTest, const Vector<Predicate*>& predicates = Vector<Predicate*>());
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ~Step();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            void optimize();
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            void evaluate(Node* context, NodeSet&) const;
855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Axis axis() const { return m_axis; }
875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            const NodeTest& nodeTest() const { return m_nodeTest; }
885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        private:
905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            friend void optimizeStepPair(Step*, Step*, bool&);
915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            bool predicatesAreContextListInsensitive() const;
925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            void parseNodeTest(const String&);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            void nodesInAxis(Node* context, NodeSet&) const;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String namespaceFromNodetest(const String& nodeTest) const;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Axis m_axis;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NodeTest m_nodeTest;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Vector<Predicate*> m_predicates;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void optimizeStepPair(Step*, Step*, bool& dropSecondStep);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(XPATH)
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif // XPathStep_h
110