15267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/*
25267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
45267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * modification, are permitted provided that the following conditions are
65267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * met:
75267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
85267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * in the documentation and/or other materials provided with the
135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * distribution.
145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * this software without specific prior written permission.
175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */
305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#ifndef WebNode_h
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#define WebNode_h
335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "../platform/WebCommon.h"
355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "../platform/WebPrivatePtr.h"
365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "../platform/WebString.h"
375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "WebExceptionCode.h"
385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)namespace WebCore { class Node; }
405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebDOMEvent;
435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebDOMEventListener;
445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebDOMEventListenerPrivate;
455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebDocument;
465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebElement;
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebFrame;
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebNodeList;
495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebPluginContainer;
505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Provides access to some properties of a DOM node.
52c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)// Note that the class design requires that neither this class nor any of its subclasses have any virtual
53c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)// methods (other than the destructor), so that it is possible to safely static_cast an instance of one
54c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)// class to the appropriate subclass based on the actual type of the wrapped WebCore::Node. For the same
55c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)// reason, subclasses must not add any additional data members.
565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class WebNode {
575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)public:
585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    virtual ~WebNode() { reset(); }
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebNode() { }
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebNode(const WebNode& n) { assign(n); }
625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebNode& operator=(const WebNode& n)
635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        assign(n);
655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return *this;
665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
6806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT void reset();
6906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT void assign(const WebNode&);
705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
7106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool equals(const WebNode&) const;
725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Required for using WebNodes in std maps.  Note the order used is
735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // arbitrary and should not be expected to have any specific meaning.
7406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool lessThan(const WebNode&) const;
755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isNull() const { return m_private.isNull(); }
775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    enum NodeType {
795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        ElementNode = 1,
805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        AttributeNode = 2,
815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        TextNode = 3,
825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CDataSectionNode = 4,
835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        // EntityReferenceNodes are deprecated and impossible to create in WebKit.
845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        EntityNode = 6,
855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        ProcessingInstructionsNode = 7,
865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        CommentNode = 8,
875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        DocumentNode = 9,
885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        DocumentTypeNode = 10,
895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        DocumentFragmentNode = 11,
905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        NotationNode = 12,
915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        XPathNamespaceNode = 13,
925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        ShadowRootNode = 14
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    };
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
9506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT NodeType nodeType() const;
9606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNode parentNode() const;
9706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebString nodeName() const;
9806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebString nodeValue() const;
9906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebDocument document() const;
10006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNode firstChild() const;
10106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNode lastChild() const;
10206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNode previousSibling() const;
10306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNode nextSibling() const;
10406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool hasChildNodes() const;
10506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNodeList childNodes();
10606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebString createMarkup() const;
10706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool isLink() const;
10806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool isTextNode() const;
10906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool isFocusable() const;
11006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool isContentEditable() const;
11106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool isElementNode() const;
1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // addEventListener only works with a small set of eventTypes.
11306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT void addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture);
11406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool dispatchEvent(const WebDOMEvent&);
11506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT void simulateClick();
11606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebNodeList getElementsByTagName(const WebString&) const;
11706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebElement querySelector(const WebString&, WebExceptionCode&) const;
11806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebElement rootEditableElement() const;
11906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool focused() const;
12006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool remove();
1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Returns true if the node has a non-empty bounding box in layout.
1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // This does not 100% guarantee the user can see it, but is pretty close.
1245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Note: This method only works properly after layout has occurred.
12506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT bool hasNonEmptyBoundingBox() const;
12606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebPluginContainer* pluginContainer() const;
12706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    BLINK_EXPORT WebElement shadowHost() const;
1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    template<typename T> T to()
1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        T res;
1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        res.WebNode::assign(*this);
1335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return res;
1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    template<typename T> const T toConst() const
1375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        T res;
1395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        res.WebNode::assign(*this);
1405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return res;
1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
14306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#if BLINK_IMPLEMENTATION
1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebNode(const WTF::PassRefPtr<WebCore::Node>&);
1455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebNode& operator=(const WTF::PassRefPtr<WebCore::Node>&);
1465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    operator WTF::PassRefPtr<WebCore::Node>() const;
1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#endif
1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
14906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#if BLINK_IMPLEMENTATION
1505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    template<typename T> T* unwrap()
1515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
1525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return static_cast<T*>(m_private.get());
1535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
1545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    template<typename T> const T* constUnwrap() const
1565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
1575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return static_cast<const T*>(m_private.get());
1585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
1595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#endif
1605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)protected:
1625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPrivatePtr<WebCore::Node> m_private;
1635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)};
1645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)inline bool operator==(const WebNode& a, const WebNode& b)
1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return a.equals(b);
1685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)inline bool operator!=(const WebNode& a, const WebNode& b)
1715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return !(a == b);
1735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)inline bool operator<(const WebNode& a, const WebNode& b)
1765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return a.lessThan(b);
1785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
18051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
1815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#endif
183