Index: third_party/WebKit/WebCore/dom/Node.h |
=================================================================== |
--- third_party/WebKit/WebCore/dom/Node.h (revision 9383) |
+++ third_party/WebKit/WebCore/dom/Node.h (working copy) |
@@ -1,729 +1,580 @@ |
-/* |
- * 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 <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 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. |
- */ |
- Node* previousEditable() const; |
- Node* nextEditable() const; |
- |
- RenderObject* renderer() const { return m_renderer; } |
- RenderObject* nextRenderer(); |
- RenderObject* previousRenderer(); |
- void setRenderer(RenderObject* renderer) { m_renderer = renderer; } |
- |
- // Use with caution. Does no type checking. Mostly a convenience method for shadow nodes of form controls, where we know exactly |
- // what kind of renderer we made. |
- RenderBox* renderBox() const; |
- |
- void checkSetPrefix(const AtomicString& prefix, ExceptionCode&); |
- bool isDescendantOf(const Node*) const; |
- bool contains(const Node*) const; |
- |
- // These two methods are mutually exclusive. The former is used to do strict error-checking |
- // when adding children via the public DOM API (e.g., appendChild()). The latter is called only when parsing, |
- // to sanity-check against the DTD for error recovery. |
- void checkAddChild(Node* newChild, ExceptionCode&); // Error-checking when adding via the DOM API |
- virtual bool childAllowed(Node* newChild); // Error-checking during parsing that checks the DTD |
- |
- void checkReplaceChild(Node* newChild, Node* oldChild, ExceptionCode&); |
- virtual bool canReplaceChild(Node* newChild, Node* oldChild); |
- |
- // Used to determine whether range offsets use characters or node indices. |
- virtual bool offsetInCharacters() const; |
- // Number of DOM 16-bit units contained in node. Note that rendered text length can be different - e.g. because of |
- // css-transform:capitalize breaking up precomposed characters and ligatures. |
- virtual int maxCharacterOffset() const; |
- |
- // FIXME: We should try to find a better location for these methods. |
- virtual bool canSelectAll() const { return false; } |
- virtual void selectAll() { } |
- |
- // Whether or not a selection can be started in this object |
- virtual bool canStartSelection() const; |
- |
- // ----------------------------------------------------------------------------- |
- // Integration with rendering tree |
- |
- /** |
- * Attaches this node to the rendering tree. This calculates the style to be applied to the node and creates an |
- * appropriate RenderObject which will be inserted into the tree (except when the style has display: none). This |
- * makes the node visible in the FrameView. |
- */ |
- virtual void attach(); |
- |
- /** |
- * Detaches the node from the rendering tree, making it invisible in the rendered view. This method will remove |
- * the node's rendering object from the rendering tree and delete it. |
- */ |
- virtual void detach(); |
- |
- virtual void willRemove(); |
- void createRendererIfNeeded(); |
- PassRefPtr<RenderStyle> styleForRenderer(); |
- virtual bool rendererIsNeeded(RenderStyle*); |
-#if ENABLE(SVG) |
- virtual bool childShouldCreateRenderer(Node*) const { return true; } |
-#endif |
- virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); |
- |
- // Wrapper for nodes that don't have a renderer, but still cache the style (like HTMLOptionElement). |
- RenderStyle* renderStyle() const; |
- virtual void setRenderStyle(PassRefPtr<RenderStyle>); |
- |
- virtual RenderStyle* computedStyle(); |
- |
- // ----------------------------------------------------------------------------- |
- // Notification of document structure changes |
- |
- /** |
- * Notifies the node that it has been inserted into the document. This is called during document parsing, and also |
- * when a node is added through the DOM methods insertBefore(), appendChild() or replaceChild(). Note that this only |
- * happens when the node becomes part of the document tree, i.e. only when the document is actually an ancestor of |
- * the node. The call happens _after_ the node has been added to the tree. |
- * |
- * This is similar to the DOMNodeInsertedIntoDocument DOM event, but does not require the overhead of event |
- * dispatching. |
- */ |
- virtual void insertedIntoDocument(); |
- |
- /** |
- * Notifies the node that it is no longer part of the document tree, i.e. when the document is no longer an ancestor |
- * node. |
- * |
- * This is similar to the DOMNodeRemovedFromDocument DOM event, but does not require the overhead of event |
- * dispatching, and is called _after_ the node is removed from the tree. |
- */ |
- virtual void removedFromDocument(); |
- |
- // These functions are called whenever you are connected or disconnected from a tree. That tree may be the main |
- // document tree, or it could be another disconnected tree. Override these functions to do any work that depends |
- // on connectedness to some ancestor (e.g., an ancestor <form> for example). |
- virtual void insertedIntoTree(bool /*deep*/) { } |
- virtual void removedFromTree(bool /*deep*/) { } |
- |
- /** |
- * Notifies the node that it's list of children have changed (either by adding or removing child nodes), or a child |
- * node that is of the type CDATA_SECTION_NODE, TEXT_NODE or COMMENT_NODE has changed its value. |
- */ |
- virtual void childrenChanged(bool /*changedByParser*/ = false, Node* /*beforeChange*/ = 0, Node* /*afterChange*/ = 0, int /*childCountDelta*/ = 0) { } |
- |
-#ifndef NDEBUG |
- virtual void formatForDebugger(char* buffer, unsigned length) const; |
- |
- void showNode(const char* prefix = "") const; |
- void showTreeForThis() const; |
- void showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2 = 0, const char* markedLabel2 = 0) const; |
-#endif |
- |
- void registerDynamicNodeList(DynamicNodeList*); |
- void unregisterDynamicNodeList(DynamicNodeList*); |
- void notifyNodeListsChildrenChanged(); |
- void notifyLocalNodeListsChildrenChanged(); |
- void notifyNodeListsAttributeChanged(); |
- void notifyLocalNodeListsAttributeChanged(); |
- |
- PassRefPtr<NodeList> getElementsByTagName(const String&); |
- PassRefPtr<NodeList> getElementsByTagNameNS(const AtomicString& namespaceURI, const String& localName); |
- PassRefPtr<NodeList> getElementsByName(const String& elementName); |
- PassRefPtr<NodeList> getElementsByClassName(const String& classNames); |
- |
- PassRefPtr<Element> querySelector(const String& selectors, ExceptionCode&); |
- PassRefPtr<NodeList> querySelectorAll(const String& selectors, ExceptionCode&); |
- |
- unsigned short compareDocumentPosition(Node*); |
- |
-protected: |
- virtual void willMoveToNewOwnerDocument(); |
- virtual void didMoveToNewOwnerDocument(); |
- |
- virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const { } |
- void setTabIndexExplicitly(short); |
- |
- bool hasRareData() const { return m_hasRareData; } |
- |
- NodeRareData* rareData() const; |
- NodeRareData* ensureRareData(); |
- |
-public: |
- virtual Node* toNode() { return this; } |
- |
- virtual ScriptExecutionContext* scriptExecutionContext() const; |
- |
- virtual void addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture); |
- virtual void removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture); |
- virtual bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&); |
- void removeAllEventListeners() { if (hasRareData()) removeAllEventListenersSlowCase(); } |
- |
- void setInlineEventListenerForType(const AtomicString& eventType, PassRefPtr<EventListener>); |
- void setInlineEventListenerForTypeAndAttribute(const AtomicString& eventType, Attribute*); |
- void removeInlineEventListenerForType(const AtomicString& eventType); |
- bool dispatchEventForType(const AtomicString& eventType, bool canBubble, bool cancelable); |
- EventListener* inlineEventListenerForType(const AtomicString& eventType) const; |
- |
- bool dispatchSubtreeModifiedEvent(); |
- void dispatchWindowEvent(PassRefPtr<Event>); |
- void dispatchWindowEvent(const AtomicString& eventType, bool canBubble, bool cancelable); |
- bool dispatchUIEvent(const AtomicString& eventType, int detail = 0, PassRefPtr<Event> underlyingEvent = 0); |
- bool dispatchKeyEvent(const PlatformKeyboardEvent&); |
- void dispatchWheelEvent(PlatformWheelEvent&); |
- bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, |
- int clickCount = 0, Node* relatedTarget = 0); |
- bool dispatchMouseEvent(const AtomicString& eventType, int button, int clickCount, |
- int pageX, int pageY, int screenX, int screenY, |
- bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, |
- bool isSimulated = false, Node* relatedTarget = 0, PassRefPtr<Event> underlyingEvent = 0); |
- void dispatchSimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<Event> underlyingEvent = 0); |
- void dispatchSimulatedClick(PassRefPtr<Event> underlyingEvent, bool sendMouseEvents = false, bool showPressedLook = true); |
- bool dispatchProgressEvent(const AtomicString &eventType, bool lengthComputableArg, unsigned loadedArg, unsigned totalArg); |
- void dispatchStorageEvent(const AtomicString &eventType, const String& key, const String& oldValue, const String& newValue, Frame* source); |
- bool dispatchWebKitAnimationEvent(const AtomicString& eventType, const String& animationName, double elapsedTime); |
- bool dispatchWebKitTransitionEvent(const AtomicString& eventType, const String& propertyName, double elapsedTime); |
- bool dispatchGenericEvent(PassRefPtr<Event>); |
- |
- virtual void handleLocalEvents(Event*, bool useCapture); |
- |
- virtual void dispatchFocusEvent(); |
- virtual void dispatchBlurEvent(); |
- |
- /** |
- * Perform the default action for an event e.g. submitting a form |
- */ |
- virtual void defaultEventHandler(Event*); |
- |
- /** |
- * Used for disabled form elements; if true, prevents mouse events from being dispatched |
- * to event listeners, and prevents DOMActivate events from being sent at all. |
- */ |
- virtual bool disabled() const; |
- |
- const RegisteredEventListenerVector& eventListeners() const; |
- |
- EventListener* onabort() const; |
- void setOnabort(PassRefPtr<EventListener>); |
- EventListener* onblur() const; |
- void setOnblur(PassRefPtr<EventListener>); |
- EventListener* onchange() const; |
- void setOnchange(PassRefPtr<EventListener>); |
- EventListener* onclick() const; |
- void setOnclick(PassRefPtr<EventListener>); |
- EventListener* oncontextmenu() const; |
- void setOncontextmenu(PassRefPtr<EventListener>); |
- EventListener* ondblclick() const; |
- void setOndblclick(PassRefPtr<EventListener>); |
- EventListener* onerror() const; |
- void setOnerror(PassRefPtr<EventListener>); |
- EventListener* onfocus() const; |
- void setOnfocus(PassRefPtr<EventListener>); |
- EventListener* oninput() const; |
- void setOninput(PassRefPtr<EventListener>); |
- EventListener* onkeydown() const; |
- void setOnkeydown(PassRefPtr<EventListener>); |
- EventListener* onkeypress() const; |
- void setOnkeypress(PassRefPtr<EventListener>); |
- EventListener* onkeyup() const; |
- void setOnkeyup(PassRefPtr<EventListener>); |
- EventListener* onload() const; |
- void setOnload(PassRefPtr<EventListener>); |
- EventListener* onmousedown() const; |
- void setOnmousedown(PassRefPtr<EventListener>); |
- EventListener* onmousemove() const; |
- void setOnmousemove(PassRefPtr<EventListener>); |
- EventListener* onmouseout() const; |
- void setOnmouseout(PassRefPtr<EventListener>); |
- EventListener* onmouseover() const; |
- void setOnmouseover(PassRefPtr<EventListener>); |
- EventListener* onmouseup() const; |
- void setOnmouseup(PassRefPtr<EventListener>); |
- EventListener* onmousewheel() const; |
- void setOnmousewheel(PassRefPtr<EventListener>); |
- EventListener* onbeforecut() const; |
- void setOnbeforecut(PassRefPtr<EventListener>); |
- EventListener* oncut() const; |
- void setOncut(PassRefPtr<EventListener>); |
- EventListener* onbeforecopy() const; |
- void setOnbeforecopy(PassRefPtr<EventListener>); |
- EventListener* oncopy() const; |
- void setOncopy(PassRefPtr<EventListener>); |
- EventListener* onbeforepaste() const; |
- void setOnbeforepaste(PassRefPtr<EventListener>); |
- EventListener* onpaste() const; |
- void setOnpaste(PassRefPtr<EventListener>); |
- EventListener* ondragenter() const; |
- void setOndragenter(PassRefPtr<EventListener>); |
- EventListener* ondragover() const; |
- void setOndragover(PassRefPtr<EventListener>); |
- EventListener* ondragleave() const; |
- void setOndragleave(PassRefPtr<EventListener>); |
- EventListener* ondrop() const; |
- void setOndrop(PassRefPtr<EventListener>); |
- EventListener* ondragstart() const; |
- void setOndragstart(PassRefPtr<EventListener>); |
- EventListener* ondrag() const; |
- void setOndrag(PassRefPtr<EventListener>); |
- EventListener* ondragend() const; |
- void setOndragend(PassRefPtr<EventListener>); |
- EventListener* onreset() const; |
- void setOnreset(PassRefPtr<EventListener>); |
- EventListener* onresize() const; |
- void setOnresize(PassRefPtr<EventListener>); |
- EventListener* onscroll() const; |
- void setOnscroll(PassRefPtr<EventListener>); |
- EventListener* onsearch() const; |
- void setOnsearch(PassRefPtr<EventListener>); |
- EventListener* onselect() const; |
- void setOnselect(PassRefPtr<EventListener>); |
- EventListener* onselectstart() const; |
- void setOnselectstart(PassRefPtr<EventListener>); |
- EventListener* onsubmit() const; |
- void setOnsubmit(PassRefPtr<EventListener>); |
- EventListener* onunload() const; |
- void setOnunload(PassRefPtr<EventListener>); |
- |
- using TreeShared<Node>::ref; |
- using TreeShared<Node>::deref; |
- |
-private: |
- virtual void refEventTarget() { ref(); } |
- virtual void derefEventTarget() { deref(); } |
- |
- void removeAllEventListenersSlowCase(); |
- |
-private: |
- virtual NodeRareData* createRareData(); |
- Node* containerChildNode(unsigned index) const; |
- unsigned containerChildNodeCount() const; |
- Node* containerFirstChild() const; |
- Node* containerLastChild() const; |
- bool rareDataFocused() const; |
- |
- virtual RenderStyle* nonRendererRenderStyle() const; |
- |
- virtual const AtomicString& virtualPrefix() const; |
- virtual const AtomicString& virtualLocalName() const; |
- virtual const AtomicString& virtualNamespaceURI() const; |
- |
- Element* ancestorElement() const; |
- |
- void appendTextContent(bool convertBRsToNewlines, StringBuilder&) const; |
- |
- DocPtr<Document> m_document; |
- Node* m_previous; |
- Node* m_next; |
- RenderObject* m_renderer; |
- |
- unsigned m_styleChange : 2; |
- bool m_hasId : 1; |
- bool m_hasClass : 1; |
- bool m_attached : 1; |
- bool m_hasChangedChild : 1; |
- bool m_inDocument : 1; |
- bool m_isLink : 1; |
- bool m_active : 1; |
- bool m_hovered : 1; |
- bool m_inActiveChain : 1; |
- bool m_inDetach : 1; |
- bool m_inSubtreeMark : 1; |
- bool m_hasRareData : 1; |
- const bool m_isElement : 1; |
- const bool m_isContainer : 1; |
- const bool m_isText : 1; |
- |
-protected: |
- // These bits are used by the Element derived class, pulled up here so they can |
- // be stored in the same memory word as the Node bits above. |
- bool m_parsingChildrenFinished : 1; |
-#if ENABLE(SVG) |
- mutable bool m_areSVGAttributesValid : 1; |
-#endif |
- |
- // These bits are used by the StyledElement derived class, and live here for the |
- // same reason as above. |
- mutable bool m_isStyleAttributeValid : 1; |
- mutable bool m_synchronizingStyleAttribute : 1; |
- |
-#if ENABLE(SVG) |
- // This bit is used by the SVGElement derived class, and lives here for the same |
- // reason as above. |
- mutable bool m_synchronizingSVGAttributes : 1; |
-#endif |
- |
- // 11 bits remaining |
-}; |
- |
-// Used in Node::addSubresourceAttributeURLs() and in addSubresourceStyleURLs() |
-inline void addSubresourceURL(ListHashSet<KURL>& urls, const KURL& url) |
-{ |
- if (!url.isNull()) |
- urls.add(url); |
-} |
- |
-} //namespace |
- |
-#ifndef NDEBUG |
-// Outside the WebCore namespace for ease of invocation from gdb. |
-void showTree(const WebCore::Node*); |
-#endif |
- |
-#endif |
- |
+/* |
+ * 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 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 "KURLHash.h" |
+#include "PlatformString.h" |
+#include "TreeShared.h" |
+#include <wtf/Assertions.h> |
+#include <wtf/ListHashSet.h> |
+#include <wtf/OwnPtr.h> |
+#include <wtf/PassRefPtr.h> |
+ |
+namespace WebCore { |
+ |
+class AtomicString; |
+class ContainerNode; |
+class Document; |
+class DynamicNodeList; |
+class Element; |
+class Event; |
+class EventListener; |
+class IntRect; |
+class KeyboardEvent; |
+class NSResolver; |
+class NamedAttrMap; |
+class NodeList; |
+class NodeRareData; |
+class PlatformKeyboardEvent; |
+class PlatformMouseEvent; |
+class PlatformWheelEvent; |
+class QualifiedName; |
+class RenderArena; |
+class RenderBox; |
+class RenderObject; |
+class RenderStyle; |
+class StringBuilder; |
+ |
+typedef int ExceptionCode; |
+ |
+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 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 isEventTargetNode() const { return false; } |
+ 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. |
+ */ |
+ Node* previousEditable() const; |
+ Node* nextEditable() const; |
+ |
+ RenderObject* renderer() const { return m_renderer; } |
+ RenderObject* nextRenderer(); |
+ RenderObject* previousRenderer(); |
+ void setRenderer(RenderObject* renderer) { m_renderer = renderer; } |
+ |
+ // Use with caution. Does no type checking. Mostly a convenience method for shadow nodes of form controls, where we know exactly |
+ // what kind of renderer we made. |
+ RenderBox* renderBox() const; |
+ |
+ void checkSetPrefix(const AtomicString& prefix, ExceptionCode&); |
+ bool isDescendantOf(const Node*) const; |
+ bool contains(const Node*) const; |
+ |
+ // These two methods are mutually exclusive. The former is used to do strict error-checking |
+ // when adding children via the public DOM API (e.g., appendChild()). The latter is called only when parsing, |
+ // to sanity-check against the DTD for error recovery. |
+ void checkAddChild(Node* newChild, ExceptionCode&); // Error-checking when adding via the DOM API |
+ virtual bool childAllowed(Node* newChild); // Error-checking during parsing that checks the DTD |
+ |
+ void checkReplaceChild(Node* newChild, Node* oldChild, ExceptionCode&); |
+ virtual bool canReplaceChild(Node* newChild, Node* oldChild); |
+ |
+ // Used to determine whether range offsets use characters or node indices. |
+ virtual bool offsetInCharacters() const; |
+ // Number of DOM 16-bit units contained in node. Note that rendered text length can be different - e.g. because of |
+ // css-transform:capitalize breaking up precomposed characters and ligatures. |
+ virtual int maxCharacterOffset() const; |
+ |
+ // FIXME: We should try to find a better location for these methods. |
+ virtual bool canSelectAll() const { return false; } |
+ virtual void selectAll() { } |
+ |
+ // Whether or not a selection can be started in this object |
+ virtual bool canStartSelection() const; |
+ |
+ // ----------------------------------------------------------------------------- |
+ // Integration with rendering tree |
+ |
+ /** |
+ * Attaches this node to the rendering tree. This calculates the style to be applied to the node and creates an |
+ * appropriate RenderObject which will be inserted into the tree (except when the style has display: none). This |
+ * makes the node visible in the FrameView. |
+ */ |
+ virtual void attach(); |
+ |
+ /** |
+ * Detaches the node from the rendering tree, making it invisible in the rendered view. This method will remove |
+ * the node's rendering object from the rendering tree and delete it. |
+ */ |
+ virtual void detach(); |
+ |
+ virtual void willRemove(); |
+ void createRendererIfNeeded(); |
+ PassRefPtr<RenderStyle> styleForRenderer(); |
+ virtual bool rendererIsNeeded(RenderStyle*); |
+#if ENABLE(SVG) |
+ virtual bool childShouldCreateRenderer(Node*) const { return true; } |
+#endif |
+ virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); |
+ |
+ // Wrapper for nodes that don't have a renderer, but still cache the style (like HTMLOptionElement). |
+ RenderStyle* renderStyle() const; |
+ virtual void setRenderStyle(PassRefPtr<RenderStyle>); |
+ |
+ virtual RenderStyle* computedStyle(); |
+ |
+ // ----------------------------------------------------------------------------- |
+ // Notification of document structure changes |
+ |
+ /** |
+ * Notifies the node that it has been inserted into the document. This is called during document parsing, and also |
+ * when a node is added through the DOM methods insertBefore(), appendChild() or replaceChild(). Note that this only |
+ * happens when the node becomes part of the document tree, i.e. only when the document is actually an ancestor of |
+ * the node. The call happens _after_ the node has been added to the tree. |
+ * |
+ * This is similar to the DOMNodeInsertedIntoDocument DOM event, but does not require the overhead of event |
+ * dispatching. |
+ */ |
+ virtual void insertedIntoDocument(); |
+ |
+ /** |
+ * Notifies the node that it is no longer part of the document tree, i.e. when the document is no longer an ancestor |
+ * node. |
+ * |
+ * This is similar to the DOMNodeRemovedFromDocument DOM event, but does not require the overhead of event |
+ * dispatching, and is called _after_ the node is removed from the tree. |
+ */ |
+ virtual void removedFromDocument(); |
+ |
+ // These functions are called whenever you are connected or disconnected from a tree. That tree may be the main |
+ // document tree, or it could be another disconnected tree. Override these functions to do any work that depends |
+ // on connectedness to some ancestor (e.g., an ancestor <form> for example). |
+ virtual void insertedIntoTree(bool /*deep*/) { } |
+ virtual void removedFromTree(bool /*deep*/) { } |
+ |
+ /** |
+ * Notifies the node that it's list of children have changed (either by adding or removing child nodes), or a child |
+ * node that is of the type CDATA_SECTION_NODE, TEXT_NODE or COMMENT_NODE has changed its value. |
+ */ |
+ virtual void childrenChanged(bool /*changedByParser*/ = false, Node* /*beforeChange*/ = 0, Node* /*afterChange*/ = 0, int /*childCountDelta*/ = 0) { } |
+ |
+#ifndef NDEBUG |
+ virtual void formatForDebugger(char* buffer, unsigned length) const; |
+ |
+ void showNode(const char* prefix = "") const; |
+ void showTreeForThis() const; |
+ void showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2 = 0, const char* markedLabel2 = 0) const; |
+#endif |
+ |
+ void registerDynamicNodeList(DynamicNodeList*); |
+ void unregisterDynamicNodeList(DynamicNodeList*); |
+ void notifyNodeListsChildrenChanged(); |
+ void notifyLocalNodeListsChildrenChanged(); |
+ void notifyNodeListsAttributeChanged(); |
+ void notifyLocalNodeListsAttributeChanged(); |
+ |
+ PassRefPtr<NodeList> getElementsByTagName(const String&); |
+ PassRefPtr<NodeList> getElementsByTagNameNS(const AtomicString& namespaceURI, const String& localName); |
+ PassRefPtr<NodeList> getElementsByName(const String& elementName); |
+ PassRefPtr<NodeList> getElementsByClassName(const String& classNames); |
+ |
+ PassRefPtr<Element> querySelector(const String& selectors, ExceptionCode&); |
+ PassRefPtr<NodeList> querySelectorAll(const String& selectors, ExceptionCode&); |
+ |
+ unsigned short compareDocumentPosition(Node*); |
+ |
+protected: |
+ virtual void willMoveToNewOwnerDocument() { } |
+ virtual void didMoveToNewOwnerDocument() { } |
+ |
+ virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const { } |
+ void setTabIndexExplicitly(short); |
+ |
+ bool hasRareData() const { return m_hasRareData; } |
+ |
+ NodeRareData* rareData() const; |
+ NodeRareData* ensureRareData(); |
+ |
+private: |
+ virtual NodeRareData* createRareData(); |
+ Node* containerChildNode(unsigned index) const; |
+ unsigned containerChildNodeCount() const; |
+ Node* containerFirstChild() const; |
+ Node* containerLastChild() const; |
+ bool rareDataFocused() const; |
+ |
+ virtual RenderStyle* nonRendererRenderStyle() const; |
+ |
+ virtual const AtomicString& virtualPrefix() const; |
+ virtual const AtomicString& virtualLocalName() const; |
+ virtual const AtomicString& virtualNamespaceURI() const; |
+ |
+ Element* ancestorElement() const; |
+ |
+ void appendTextContent(bool convertBRsToNewlines, StringBuilder&) const; |
+ |
+ DocPtr<Document> m_document; |
+ Node* m_previous; |
+ Node* m_next; |
+ RenderObject* m_renderer; |
+ |
+ unsigned m_styleChange : 2; |
+ bool m_hasId : 1; |
+ bool m_hasClass : 1; |
+ bool m_attached : 1; |
+ bool m_hasChangedChild : 1; |
+ bool m_inDocument : 1; |
+ bool m_isLink : 1; |
+ bool m_active : 1; |
+ bool m_hovered : 1; |
+ bool m_inActiveChain : 1; |
+ bool m_inDetach : 1; |
+ bool m_inSubtreeMark : 1; |
+ bool m_hasRareData : 1; |
+ const bool m_isElement : 1; |
+ const bool m_isContainer : 1; |
+ const bool m_isText : 1; |
+ |
+protected: |
+ // These bits are used by the Element derived class, pulled up here so they can |
+ // be stored in the same memory word as the Node bits above. |
+ bool m_parsingChildrenFinished : 1; |
+#if ENABLE(SVG) |
+ mutable bool m_areSVGAttributesValid : 1; |
+#endif |
+ |
+ // These bits are used by the StyledElement derived class, and live here for the |
+ // same reason as above. |
+ mutable bool m_isStyleAttributeValid : 1; |
+ mutable bool m_synchronizingStyleAttribute : 1; |
+ |
+#if ENABLE(SVG) |
+ // This bit is used by the SVGElement derived class, and lives here for the same |
+ // reason as above. |
+ mutable bool m_synchronizingSVGAttributes : 1; |
+#endif |
+ |
+ // 11 bits remaining |
+}; |
+ |
+// Used in Node::addSubresourceAttributeURLs() and in addSubresourceStyleURLs() |
+inline void addSubresourceURL(ListHashSet<KURL>& urls, const KURL& url) |
+{ |
+ if (!url.isNull()) |
+ urls.add(url); |
+} |
+ |
+} //namespace |
+ |
+#ifndef NDEBUG |
+// Outside the WebCore namespace for ease of invocation from gdb. |
+void showTree(const WebCore::Node*); |
+#endif |
+ |
+#endif |
+ |