HELLO·Android
系统源代码
IT资讯
技术文章
我的收藏
注册
登录
-
我收藏的文章
创建代码块
我的代码块
我的账号
Gingerbread MR1
|
2.3.7_r1
下载
查看原文件
收藏
根目录
external
webkit
WebCore
dom
Node.h
/* * 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. * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) * * 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 "EventTarget.h" #include "KURLHash.h" #include "ScriptWrappable.h" #include "TreeShared.h" #include
namespace WebCore { class AtomicString; class Attribute; class ContainerNode; class Document; class DynamicNodeList; class Element; class Event; class EventListener; class FloatPoint; class Frame; class IntRect; class KeyboardEvent; class NSResolver; class NamedNodeMap; 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; // SyntheticStyleChange means that we need to go through the entire style change logic even though // no style property has actually changed. It is used to restructure the tree when, for instance, // RenderLayers are created or destroyed due to animation changes. enum StyleChangeType { NoStyleChange, InlineStyleChange, FullStyleChange, SyntheticStyleChange }; 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
, public ScriptWrappable { 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(const RenderStyle*, const RenderStyle*); 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
childNodes(); Node* firstChild() const { return isContainerNode() ? containerFirstChild() : 0; } Node* lastChild() const { return isContainerNode() ? containerLastChild() : 0; } bool hasAttributes() const; NamedNodeMap* attributes() const; virtual KURL baseURI() const; void getSubresourceURLs(ListHashSet
&) 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&, bool shouldLazyAttach = false); virtual bool replaceChild(PassRefPtr
newChild, Node* oldChild, ExceptionCode&, bool shouldLazyAttach = false); virtual bool removeChild(Node* child, ExceptionCode&); virtual bool appendChild(PassRefPtr
newChild, ExceptionCode&, bool shouldLazyAttach = false); void remove(ExceptionCode&); bool hasChildNodes() const { return firstChild(); } virtual PassRefPtr
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 #if ENABLE(MATHML) virtual bool isMathMLElement() const { return false; } #else static bool isMathMLElement() { return false; } #endif virtual bool isMediaControlElement() const { return false; } 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(); // Returns the enclosing event parent node (or self) that, when clicked, would trigger a navigation. Node* enclosingLinkEventParentOrSelf(); // Node ancestors when concerned about event flow void eventAncestors(Vector
> &ancestors); 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
); // Called by the parser when this element's close tag is reached, // signaling 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 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
and