/* * 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 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ #ifndef Node_h #define Node_h #include "DocPtr.h" #include "PlatformString.h" #include "DeprecatedString.h" #include #include #include namespace WebCore { class AtomicString; class ContainerNode; class Document; class Element; class Event; class EventListener; class IntRect; class KeyboardEvent; class NamedAttrMap; class NodeList; struct NodeListsNodeData; class PlatformKeyboardEvent; class PlatformMouseEvent; class PlatformWheelEvent; class QualifiedName; class RegisteredEventListener; class RenderArena; class RenderObject; class RenderStyle; class TextStream; typedef int ExceptionCode; enum StyleChangeType { NoStyleChange, InlineStyleChange, FullStyleChange }; // this class implements nodes, which can have a parent but no children: class Node : public TreeShared { 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(); Node(Document*); virtual ~Node(); // DOM methods & attributes for Node virtual bool hasTagName(const QualifiedName&) const { return false; } 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(); } Node* parentElement() const { return parent(); } // IE extension Node* previousSibling() const { return m_previous; } Node* nextSibling() const { return m_next; } virtual PassRefPtr childNodes(); Node* firstChild() const { return virtualFirstChild(); } Node* lastChild() const { return virtualLastChild(); } virtual bool hasAttributes() const; virtual NamedAttrMap* attributes() const; virtual String baseURI() 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 newChild, Node* refChild, ExceptionCode&); virtual bool replaceChild(PassRefPtr newChild, Node* oldChild, ExceptionCode&); virtual bool removeChild(Node* child, ExceptionCode&); virtual bool appendChild(PassRefPtr newChild, ExceptionCode&); virtual void remove(ExceptionCode&); virtual bool hasChildNodes() const; virtual PassRefPtr cloneNode(bool deep) = 0; virtual const AtomicString& localName() const; virtual const AtomicString& namespaceURI() const; virtual const AtomicString& prefix() const; virtual void setPrefix(const AtomicString&, ExceptionCode&); void normalize(); bool isSameNode(Node* other) const { return this == other; } bool isEqualNode(Node*) const; bool isDefaultNamespace(const String& namespaceURI) const; String lookupPrefix(const String& namespaceURI) const; String lookupNamespaceURI(const String& prefix) const; String lookupNamespacePrefix(const String& 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) virtual bool isElementNode() const { return false; } virtual bool isHTMLElement() const { return false; } #if ENABLE(SVG) virtual bool isSVGElement() const { return false; } #endif virtual bool isStyledElement() const { return false; } virtual bool isFrameOwnerElement() const { return false; } virtual bool isAttributeNode() const { return false; } virtual bool isTextNode() const { return false; } virtual bool isCommentNode() const { return false; } virtual bool isCharacterDataNode() const { return false; } virtual bool isDocumentNode() const { return false; } virtual bool isEventTargetNode() const { return false; } virtual bool isShadowNode() const { return false; } virtual Node* shadowParentNode() { return 0; } Node* shadowAncestorNode(); // The node's parent for the purpose of event capture and bubbling. virtual Node* eventParentNode() { return parentNode(); } bool isBlockFlow() const; bool isBlockFlowOrBlockTable() const; // Used by
elements to indicate a malformed state of some kind, typically // used to keep from applying the bottom margin of the form. virtual bool isMalformed() { return false; } virtual void setMalformed(bool malformed) { } // 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; Element* enclosingBlockFlowElement() const; Element* enclosingBlockFlowOrTableElement() 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); // 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 and elements, which can't lay themselves out // until they know all of their nested 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 closeRenderer() { } // 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 and