15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Frerich Raabe <raabe@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2009 Apple Inc.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
1402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef XPathStep_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define XPathStep_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathExpressionNode.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathNodeSet.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Node;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace XPath {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Predicate;
4002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class Step FINAL : public ParseNode {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(Step);
43d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Axis {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AncestorAxis, AncestorOrSelfAxis, AttributeAxis,
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ChildAxis, DescendantAxis, DescendantOrSelfAxis,
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FollowingAxis, FollowingSiblingAxis, NamespaceAxis,
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ParentAxis, PrecedingAxis, PrecedingSiblingAxis,
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SelfAxis
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
5202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    class NodeTest : public NoBaseWillBeGarbageCollectedFinalized<NodeTest> {
54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        enum Kind {
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            TextNodeTest, CommentNodeTest, ProcessingInstructionNodeTest, AnyNodeTest, NameTest
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeTest(Kind kind) : m_kind(kind) { }
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeTest(Kind kind, const String& data) : m_kind(kind), m_data(data) { }
62a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        NodeTest(Kind kind, const AtomicString& data, const AtomicString& namespaceURI) : m_kind(kind), m_data(data), m_namespaceURI(namespaceURI) { }
6302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
64bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        NodeTest(const NodeTest& o)
65bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            : m_kind(o.m_kind)
66bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            , m_data(o.m_data)
67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            , m_namespaceURI(o.m_namespaceURI)
68bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        {
69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            ASSERT(o.m_mergedPredicates.isEmpty());
70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        }
71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        NodeTest& operator=(const NodeTest& o)
72bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        {
73bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            m_kind = o.m_kind;
74bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            m_data = o.m_data;
75bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            m_namespaceURI = o.m_namespaceURI;
76bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            ASSERT(o.m_mergedPredicates.isEmpty());
77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            return *this;
78bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        }
79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        void trace(Visitor* visitor) { visitor->trace(m_mergedPredicates); }
80bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Kind kind() const { return m_kind; }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const AtomicString& data() const { return m_data; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const AtomicString& namespaceURI() const { return m_namespaceURI; }
84d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        WillBeHeapVector<OwnPtrWillBeMember<Predicate> >& mergedPredicates() { return m_mergedPredicates; }
85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        const WillBeHeapVector<OwnPtrWillBeMember<Predicate> >& mergedPredicates() const { return m_mergedPredicates; }
8602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Kind m_kind;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AtomicString m_data;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AtomicString m_namespaceURI;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // When possible, we merge some or all predicates with node test for better performance.
93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        WillBeHeapVector<OwnPtrWillBeMember<Predicate> > m_mergedPredicates;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Step(Axis, const NodeTest&);
97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Step(Axis, const NodeTest&, WillBeHeapVector<OwnPtrWillBeMember<Predicate> >&);
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual ~Step();
99d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void optimize();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void evaluate(EvaluationContext&, Node* context, NodeSet&) const;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Axis axis() const { return m_axis; }
106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const NodeTest& nodeTest() const { return *m_nodeTest; }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend void optimizeStepPair(Step*, Step*, bool&);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool predicatesAreContextListInsensitive() const;
111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    NodeTest& nodeTest() { return *m_nodeTest; }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void parseNodeTest(const String&);
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void nodesInAxis(EvaluationContext&, Node* context, NodeSet&) const;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String namespaceFromNodetest(const String& nodeTest) const;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Axis m_axis;
118d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    OwnPtrWillBeMember<NodeTest> m_nodeTest;
119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WillBeHeapVector<OwnPtrWillBeMember<Predicate> > m_predicates;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void optimizeStepPair(Step*, Step*, bool& dropSecondStep);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace XPath
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // XPathStep_h
129