⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 node.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 1999 Lars Knoll (knoll@kde.org) *           (C) 1999 Antti Koivisto (koivisto@kde.org) *           (C) 2001 Dirk Mueller (mueller@kde.org) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * 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 Node_h#define Node_h#include "DocPtr.h"#include "EventTarget.h"#include "KURLHash.h"#include "PlatformString.h"#include "TreeShared.h"#include "FloatPoint.h"#include <wtf/Assertions.h>#include <wtf/ListHashSet.h>#include <wtf/OwnPtr.h>#include <wtf/PassRefPtr.h>namespace WebCore {class AtomicString;class Attribute;class ContainerNode;class Document;class DynamicNodeList;class Element;class Event;class EventListener;class Frame;class IntRect;class KeyboardEvent;class NSResolver;class NamedAttrMap;class NodeList;class NodeRareData;class PlatformKeyboardEvent;class PlatformMouseEvent;class PlatformWheelEvent;class QualifiedName;class RegisteredEventListener;class RenderArena;class RenderBox;class RenderBoxModelObject;class RenderObject;class RenderStyle;class StringBuilder;typedef int ExceptionCode;typedef Vector<RefPtr<RegisteredEventListener> > RegisteredEventListenerVector;enum StyleChangeType { NoStyleChange, InlineStyleChange, FullStyleChange, AnimationStyleChange };const unsigned short DOCUMENT_POSITION_EQUIVALENT = 0x00;const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;// this class implements nodes, which can have a parent but no children:class Node : public EventTarget, public TreeShared<Node> {    friend class Document;public:    enum NodeType {        ELEMENT_NODE = 1,        ATTRIBUTE_NODE = 2,        TEXT_NODE = 3,        CDATA_SECTION_NODE = 4,        ENTITY_REFERENCE_NODE = 5,        ENTITY_NODE = 6,        PROCESSING_INSTRUCTION_NODE = 7,        COMMENT_NODE = 8,        DOCUMENT_NODE = 9,        DOCUMENT_TYPE_NODE = 10,        DOCUMENT_FRAGMENT_NODE = 11,        NOTATION_NODE = 12,        XPATH_NAMESPACE_NODE = 13    };        static bool isSupported(const String& feature, const String& version);    static void startIgnoringLeaks();    static void stopIgnoringLeaks();    static void dumpStatistics();    enum StyleChange { NoChange, NoInherit, Inherit, Detach, Force };        static StyleChange diff(RenderStyle*, RenderStyle*);    Node(Document*, bool isElement = false, bool isContainer = false, bool isText = false);    virtual ~Node();    // DOM methods & attributes for Node    bool hasTagName(const QualifiedName&) const;    virtual String nodeName() const = 0;    virtual String nodeValue() const;    virtual void setNodeValue(const String&, ExceptionCode&);    virtual NodeType nodeType() const = 0;    Node* parentNode() const { return parent(); }    Element* parentElement() const;    Node* previousSibling() const { return m_previous; }    Node* nextSibling() const { return m_next; }    PassRefPtr<NodeList> childNodes();    Node* firstChild() const { return isContainerNode() ? containerFirstChild() : 0; }    Node* lastChild() const { return isContainerNode() ? containerLastChild() : 0; }    bool hasAttributes() const;    NamedAttrMap* attributes() const;    virtual KURL baseURI() const;        void getSubresourceURLs(ListHashSet<KURL>&) const;    // These should all actually return a node, but this is only important for language bindings,    // which will already know and hold a ref on the right node to return. Returning bool allows    // these methods to be more efficient since they don't need to return a ref    virtual bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode&, bool shouldLazyAttach = false);    virtual bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode&, bool shouldLazyAttach = false);    virtual bool removeChild(Node* child, ExceptionCode&);    virtual bool appendChild(PassRefPtr<Node> newChild, ExceptionCode&, bool shouldLazyAttach = false);    void remove(ExceptionCode&);    bool hasChildNodes() const { return firstChild(); }    virtual PassRefPtr<Node> cloneNode(bool deep) = 0;    const AtomicString& localName() const { return virtualLocalName(); }    const AtomicString& namespaceURI() const { return virtualNamespaceURI(); }    const AtomicString& prefix() const { return virtualPrefix(); }    virtual void setPrefix(const AtomicString&, ExceptionCode&);    void normalize();    bool isSameNode(Node* other) const { return this == other; }    bool isEqualNode(Node*) const;    bool isDefaultNamespace(const AtomicString& namespaceURI) const;    String lookupPrefix(const AtomicString& namespaceURI) const;    String lookupNamespaceURI(const String& prefix) const;    String lookupNamespacePrefix(const AtomicString& namespaceURI, const Element* originalElement) const;        String textContent(bool convertBRsToNewlines = false) const;    void setTextContent(const String&, ExceptionCode&);        Node* lastDescendant() const;    Node* firstDescendant() const;        // Other methods (not part of DOM)    bool isElementNode() const { return m_isElement; }    bool isContainerNode() const { return m_isContainer; }    bool isTextNode() const { return m_isText; }    virtual bool isHTMLElement() const { return false; }#if ENABLE(SVG)    virtual bool isSVGElement() const { return false; }#else    static bool isSVGElement() { return false; }#endif#if ENABLE(WML)    virtual bool isWMLElement() const { return false; }#else    static bool isWMLElement() { return false; }#endif    virtual bool isStyledElement() const { return false; }    virtual bool isFrameOwnerElement() const { return false; }    virtual bool isAttributeNode() const { return false; }    virtual bool isCommentNode() const { return false; }    virtual bool isCharacterDataNode() const { return false; }    bool isDocumentNode() const;    virtual bool isShadowNode() const { return false; }    virtual Node* shadowParentNode() { return 0; }    Node* shadowAncestorNode();    Node* shadowTreeRootNode();    bool isInShadowTree();    // The node's parent for the purpose of event capture and bubbling.    virtual ContainerNode* eventParentNode();    bool isBlockFlow() const;    bool isBlockFlowOrBlockTable() const;        // These low-level calls give the caller responsibility for maintaining the integrity of the tree.    void setPreviousSibling(Node* previous) { m_previous = previous; }    void setNextSibling(Node* next) { m_next = next; }    // FIXME: These two functions belong in editing -- "atomic node" is an editing concept.    Node* previousNodeConsideringAtomicNodes() const;    Node* nextNodeConsideringAtomicNodes() const;        /** (Not part of the official DOM)     * Returns the next leaf node.     *     * Using this function delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes.     * @return next leaf node or 0 if there are no more.     */    Node* nextLeafNode() const;    /** (Not part of the official DOM)     * Returns the previous leaf node.     *     * Using this function delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes.     * @return previous leaf node or 0 if there are no more.     */    Node* previousLeafNode() const;    bool isEditableBlock() const;        // enclosingBlockFlowElement() is deprecated.  Use enclosingBlock instead.    Element* enclosingBlockFlowElement() const;        Element* enclosingInlineElement() const;    Element* rootEditableElement() const;        bool inSameContainingBlockFlowElement(Node*);        // Used by the parser. Checks against the DTD, unlike DOM operations like appendChild().    // Also does not dispatch DOM mutation events.    // Returns the appropriate container node for future insertions as you parse, or 0 for failure.    virtual ContainerNode* addChild(PassRefPtr<Node>);    // Called by the parser when this element's close tag is reached,    // signalling that all child tags have been parsed and added.    // This is needed for <applet> and <object> elements, which can't lay themselves out    // until they know all of their nested <param>s. [Radar 3603191, 4040848].    // Also used for script elements and some SVG elements for similar purposes,    // but making parsing a special case in this respect should be avoided if possible.    virtual void finishParsingChildren() { }    virtual void beginParsingChildren() { }    // Called by the frame right before dispatching an unloadEvent. [Radar 4532113]    // This is needed for HTMLInputElements to tell the frame that it is done editing     // (sends textFieldDidEndEditing notification)    virtual void aboutToUnload() { }    // For <link> and <style> elements.    virtual bool sheetLoaded() { return true; }    bool hasID() const { return m_hasId; }    bool hasClass() const { return m_hasClass; }    bool active() const { return m_active; }    bool inActiveChain() const { return m_inActiveChain; }    bool inDetach() const { return m_inDetach; }    bool hovered() const { return m_hovered; }    bool focused() const { return hasRareData() ? rareDataFocused() : false; }    bool attached() const { return m_attached; }    void setAttached(bool b = true) { m_attached = b; }    bool changed() const { return m_styleChange != NoStyleChange; }    StyleChangeType styleChangeType() const { return static_cast<StyleChangeType>(m_styleChange); }    bool hasChangedChild() const { return m_hasChangedChild; }    bool isLink() const { return m_isLink; }    void setHasID(bool b = true) { m_hasId = b; }    void setHasClass(bool b = true) { m_hasClass = b; }    void setHasChangedChild( bool b = true ) { m_hasChangedChild = b; }    void setInDocument(bool b = true) { m_inDocument = b; }    void setInActiveChain(bool b = true) { m_inActiveChain = b; }    void setChanged(StyleChangeType changeType = FullStyleChange);    void setIsLink(bool b = true) { m_isLink = b; }    bool inSubtreeMark() const { return m_inSubtreeMark; }    void setInSubtreeMark(bool b = true) { m_inSubtreeMark = b; }    void lazyAttach();    virtual bool canLazyAttach();    virtual void setFocus(bool b = true);    virtual void setActive(bool b = true, bool /*pause*/ = false) { m_active = b; }    virtual void setHovered(bool b = true) { m_hovered = b; }    virtual short tabIndex() const;    /**     * Whether this node can receive the keyboard focus.     */    virtual bool supportsFocus() const { return isFocusable(); }    virtual bool isFocusable() const;    virtual bool isKeyboardFocusable(KeyboardEvent*) const;    virtual bool isMouseFocusable() const;    virtual bool isContentEditable() const;    virtual bool isContentRichlyEditable() const;    virtual bool shouldUseInputMethod() const;    virtual IntRect getRect() const;    virtual void recalcStyle(StyleChange = NoChange) { }    unsigned nodeIndex() const;    // Returns the DOM ownerDocument attribute. This method never returns NULL, except in the case     // of (1) a Document node or (2) a DocumentType node that is not used with any Document yet.     virtual Document* ownerDocument() const;    // Returns the document associated with this node. This method never returns NULL, except in the case     // of a DocumentType node that is not used with any Document yet. A Document node returns itself.    Document* document() const    {        ASSERT(this);        ASSERT(m_document || nodeType() == DOCUMENT_TYPE_NODE && !inDocument());        return m_document.get();    }    void setDocument(Document*);    // Returns true if this node is associated with a document and is in its associated document's    // node tree, false otherwise.    bool inDocument() const     {         ASSERT(m_document || !m_inDocument);        return m_inDocument;     }    bool isReadOnlyNode() const { return nodeType() == ENTITY_REFERENCE_NODE; }    virtual bool childTypeAllowed(NodeType) { return false; }    unsigned childNodeCount() const { return isContainerNode() ? containerChildNodeCount() : 0; }    Node* childNode(unsigned index) const { return isContainerNode() ? containerChildNode(index) : 0; }    /**     * Does a pre-order traversal of the tree to find the node next node after this one. This uses the same order that     * the tags appear in the source file.     *     * @param stayWithin If not null, the traversal will stop once the specified node is reached. This can be used to     * restrict traversal to a particular sub-tree.     *     * @return The next node, in document order     *     * see @ref traversePreviousNode()     */    Node* traverseNextNode(const Node* stayWithin = 0) const;        // Like traverseNextNode, but skips children and starts with the next sibling.    Node* traverseNextSibling(const Node* stayWithin = 0) const;    /**     * Does a reverse pre-order traversal to find the node that comes before the current one in document order     *     * see @ref traverseNextNode()     */    Node* traversePreviousNode(const Node * stayWithin = 0) const;    // Like traverseNextNode, but visits parents after their children.    Node* traverseNextNodePostOrder() const;    // Like traversePreviousNode, but visits parents before their children.    Node* traversePreviousNodePostOrder(const Node *stayWithin = 0) const;    Node* traversePreviousSiblingPostOrder(const Node *stayWithin = 0) const;    /**     * Finds previous or next editable leaf node.     */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -