18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999 Antti Koivisto (koivisto@kde.org) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 2001 Dirk Mueller (mueller@kde.org) 581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 65f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef Node_h 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define Node_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "EventTarget.h" 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "KURLHash.h" 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderStyleConstants.h" 31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ScriptWrappable.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TreeShared.h" 33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h> 34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/ListHashSet.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3621939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(JSC) 3721939df44de1705786c545cd1bf519d47250322dBen Murdochnamespace JSC { 38a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch class JSGlobalData; 39a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch class MarkStack; 4021939df44de1705786c545cd1bf519d47250322dBen Murdoch} 4121939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 4221939df44de1705786c545cd1bf519d47250322dBen Murdoch 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass Attribute; 4621939df44de1705786c545cd1bf519d47250322dBen Murdochclass ClassNodeList; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass ContainerNode; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Document; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass DynamicNodeList; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Element; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Event; 526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerclass EventContext; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass EventListener; 54d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass FloatPoint; 558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass Frame; 562bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass InputElement; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass IntRect; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass KeyboardEvent; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass NSResolver; 605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass NamedNodeMap; 6121939df44de1705786c545cd1bf519d47250322dBen Murdochclass NameNodeList; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass NodeList; 638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass NodeRareData; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass PlatformKeyboardEvent; 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass PlatformMouseEvent; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass PlatformWheelEvent; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass QualifiedName; 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass RegisteredEventListener; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderArena; 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass RenderBox; 718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass RenderBoxModelObject; 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderObject; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderStyle; 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(SVG) 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass SVGUseElement; 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 7721939df44de1705786c545cd1bf519d47250322dBen Murdochclass TagNodeList; 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass TreeScope; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef int ExceptionCode; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochconst int nodeStyleChangeShift = 25; 8321939df44de1705786c545cd1bf519d47250322dBen Murdoch 84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// SyntheticStyleChange means that we need to go through the entire style change logic even though 85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// no style property has actually changed. It is used to restructure the tree when, for instance, 86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// RenderLayers are created or destroyed due to animation changes. 8721939df44de1705786c545cd1bf519d47250322dBen Murdochenum StyleChangeType { 8821939df44de1705786c545cd1bf519d47250322dBen Murdoch NoStyleChange = 0, 8921939df44de1705786c545cd1bf519d47250322dBen Murdoch InlineStyleChange = 1 << nodeStyleChangeShift, 9021939df44de1705786c545cd1bf519d47250322dBen Murdoch FullStyleChange = 2 << nodeStyleChangeShift, 9121939df44de1705786c545cd1bf519d47250322dBen Murdoch SyntheticStyleChange = 3 << nodeStyleChangeShift 9221939df44de1705786c545cd1bf519d47250322dBen Murdoch}; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 94e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass Node : public EventTarget, public TreeShared<ContainerNode>, public ScriptWrappable { 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project friend class Document; 962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch friend class TreeScope; 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum NodeType { 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ELEMENT_NODE = 1, 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ATTRIBUTE_NODE = 2, 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TEXT_NODE = 3, 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CDATA_SECTION_NODE = 4, 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ENTITY_REFERENCE_NODE = 5, 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ENTITY_NODE = 6, 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PROCESSING_INSTRUCTION_NODE = 7, 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMMENT_NODE = 8, 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOCUMENT_NODE = 9, 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOCUMENT_TYPE_NODE = 10, 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOCUMENT_FRAGMENT_NODE = 11, 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NOTATION_NODE = 12, 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project XPATH_NAMESPACE_NODE = 13 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 114f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick enum DocumentPosition { 115f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_EQUIVALENT = 0x00, 116f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_DISCONNECTED = 0x01, 117f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_PRECEDING = 0x02, 118f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_FOLLOWING = 0x04, 119f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_CONTAINS = 0x08, 120f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_CONTAINED_BY = 0x10, 121f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20, 122f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick }; 123f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool isSupported(const String& feature, const String& version); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void startIgnoringLeaks(); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void stopIgnoringLeaks(); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static void dumpStatistics(); 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum StyleChange { NoChange, NoInherit, Inherit, Detach, Force }; 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static StyleChange diff(const RenderStyle*, const RenderStyle*); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual ~Node(); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // DOM methods & attributes for Node 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasTagName(const QualifiedName&) const; 13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool hasLocalName(const AtomicString&) const; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual String nodeName() const = 0; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual String nodeValue() const; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void setNodeValue(const String&, ExceptionCode&); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual NodeType nodeType() const = 0; 144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContainerNode* parentNode() const; 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Element* parentElement() const; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* previousSibling() const { return m_previous; } 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* nextSibling() const { return m_next; } 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PassRefPtr<NodeList> childNodes(); 149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Node* firstChild() const; 150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Node* lastChild() const; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasAttributes() const; 1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian NamedNodeMap* attributes() const; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual KURL baseURI() const; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void getSubresourceURLs(ListHashSet<KURL>&) const; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These should all actually return a node, but this is only important for language bindings, 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // which will already know and hold a ref on the right node to return. Returning bool allows 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // these methods to be more efficient since they don't need to return a ref 161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode&, bool shouldLazyAttach = false); 162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode&, bool shouldLazyAttach = false); 163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool removeChild(Node* child, ExceptionCode&); 164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool appendChild(PassRefPtr<Node> newChild, ExceptionCode&, bool shouldLazyAttach = false); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void remove(ExceptionCode&); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasChildNodes() const { return firstChild(); } 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual PassRefPtr<Node> cloneNode(bool deep) = 0; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& localName() const { return virtualLocalName(); } 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& namespaceURI() const { return virtualNamespaceURI(); } 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& prefix() const { return virtualPrefix(); } 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void setPrefix(const AtomicString&, ExceptionCode&); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void normalize(); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isSameNode(Node* other) const { return this == other; } 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isEqualNode(Node*) const; 177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool isDefaultNamespace(const AtomicString& namespaceURI) const; 178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String lookupPrefix(const AtomicString& namespaceURI) const; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String lookupNamespaceURI(const String& prefix) const; 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String lookupNamespacePrefix(const AtomicString& namespaceURI, const Element* originalElement) const; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String textContent(bool convertBRsToNewlines = false) const; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setTextContent(const String&, ExceptionCode&); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* lastDescendant() const; 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* firstDescendant() const; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Other methods (not part of DOM) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19021939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isElementNode() const { return getFlag(IsElementFlag); } 19121939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isContainerNode() const { return getFlag(IsContainerFlag); } 19221939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isTextNode() const { return getFlag(IsTextFlag); } 193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19421939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isHTMLElement() const { return getFlag(IsHTMLFlag); } 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19621939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isSVGElement() const { return getFlag(IsSVGFlag); } 1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual bool isSVGShadowRoot() const { return false; } 1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(SVG) 1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch SVGUseElement* svgShadowHost() const; 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual bool isWMLElement() const { return false; } 204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static bool isWMLElement() { return false; } 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool isMediaControlElement() const { return false; } 20954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block virtual bool isMediaControls() const { return false; } 21021939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isStyledElement() const { return getFlag(IsStyledElementFlag); } 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isFrameOwnerElement() const { return false; } 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isAttributeNode() const { return false; } 21321939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isCommentNode() const { return getFlag(IsCommentFlag); } 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isCharacterDataNode() const { return false; } 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isDocumentNode() const; 216f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool isShadowRoot() const { return getFlag(IsShadowRootFlag); } 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Remove this when all shadow roots are ShadowRoots. 2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual bool isShadowBoundary() const { return false; } 2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual bool canHaveLightChildRendererWithShadow() const { return false; } 2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* shadowAncestorNode(); 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* shadowTreeRootNode(); 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isInShadowTree(); 2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Node's parent, shadow tree host, or SVG use. 225f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContainerNode* parentOrHostNode() const; 2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Use when it's guaranteed to that shadowHost is 0 and svgShadowHost is 0. 227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContainerNode* parentNodeGuaranteedHostFree() const; 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 229cad810f21b803229eb11403f9209855525a25d57Steve Block Element* shadowHost() const; 230cad810f21b803229eb11403f9209855525a25d57Steve Block void setShadowHost(Element*); 231cad810f21b803229eb11403f9209855525a25d57Steve Block 23281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool selfOrAncestorHasDirAutoAttribute() const { return getFlag(SelfOrAncestorHasDirAutoFlag); } 23381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void setSelfOrAncestorHasDirAutoAttribute(bool flag) { setFlag(flag, SelfOrAncestorHasDirAutoFlag); } 23481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 235d0825bca7fe65beaee391d30da42e937db621564Steve Block // Returns the enclosing event parent node (or self) that, when clicked, would trigger a navigation. 236d0825bca7fe65beaee391d30da42e937db621564Steve Block Node* enclosingLinkEventParentOrSelf(); 237d0825bca7fe65beaee391d30da42e937db621564Steve Block 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isBlockFlow() const; 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isBlockFlowOrBlockTable() const; 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These low-level calls give the caller responsibility for maintaining the integrity of the tree. 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setPreviousSibling(Node* previous) { m_previous = previous; } 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setNextSibling(Node* next) { m_next = next; } 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: These two functions belong in editing -- "atomic node" is an editing concept. 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* previousNodeConsideringAtomicNodes() const; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* nextNodeConsideringAtomicNodes() const; 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 249a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Returns the next leaf node or 0 if there are no more. 250a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes. 251a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Uses an editing-specific concept of what a leaf node is, and should probably be moved 252a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // out of the Node class into an editing-specific source file. 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* nextLeafNode() const; 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 255a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Returns the previous leaf node or 0 if there are no more. 256a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes. 257a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Uses an editing-specific concept of what a leaf node is, and should probably be moved 258a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // out of the Node class into an editing-specific source file. 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* previousLeafNode() const; 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 261a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // enclosingBlockFlowElement() is deprecated. Use enclosingBlock instead. 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* enclosingBlockFlowElement() const; 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* rootEditableElement() const; 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool inSameContainingBlockFlowElement(Node*); 267e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block 268e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // FIXME: All callers of this function are almost certainly wrong! 269e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block virtual void deprecatedParserAddChild(PassRefPtr<Node>); 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Called by the parser when this element's close tag is reached, 272d0825bca7fe65beaee391d30da42e937db621564Steve Block // signaling that all child tags have been parsed and added. 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is needed for <applet> and <object> elements, which can't lay themselves out 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // until they know all of their nested <param>s. [Radar 3603191, 4040848]. 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Also used for script elements and some SVG elements for similar purposes, 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but making parsing a special case in this respect should be avoided if possible. 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void finishParsingChildren() { } 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void beginParsingChildren() { } 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 280a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Called on the focused node right before dispatching an unload event. 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void aboutToUnload() { } 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For <link> and <style> elements. 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool sheetLoaded() { return true; } 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28621939df44de1705786c545cd1bf519d47250322dBen Murdoch bool hasID() const { return getFlag(HasIDFlag); } 28721939df44de1705786c545cd1bf519d47250322dBen Murdoch bool hasClass() const { return getFlag(HasClassFlag); } 28821939df44de1705786c545cd1bf519d47250322dBen Murdoch bool active() const { return getFlag(IsActiveFlag); } 28921939df44de1705786c545cd1bf519d47250322dBen Murdoch bool inActiveChain() const { return getFlag(InActiveChainFlag); } 29021939df44de1705786c545cd1bf519d47250322dBen Murdoch bool inDetach() const { return getFlag(InDetachFlag); } 29121939df44de1705786c545cd1bf519d47250322dBen Murdoch bool hovered() const { return getFlag(IsHoveredFlag); } 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool focused() const { return hasRareData() ? rareDataFocused() : false; } 29321939df44de1705786c545cd1bf519d47250322dBen Murdoch bool attached() const { return getFlag(IsAttachedFlag); } 29421939df44de1705786c545cd1bf519d47250322dBen Murdoch void setAttached() { setFlag(IsAttachedFlag); } 29521939df44de1705786c545cd1bf519d47250322dBen Murdoch bool needsStyleRecalc() const { return styleChangeType() != NoStyleChange; } 29621939df44de1705786c545cd1bf519d47250322dBen Murdoch StyleChangeType styleChangeType() const { return static_cast<StyleChangeType>(m_nodeFlags & StyleChangeMask); } 29721939df44de1705786c545cd1bf519d47250322dBen Murdoch bool childNeedsStyleRecalc() const { return getFlag(ChildNeedsStyleRecalcFlag); } 29821939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isLink() const { return getFlag(IsLinkFlag); } 29921939df44de1705786c545cd1bf519d47250322dBen Murdoch 30021939df44de1705786c545cd1bf519d47250322dBen Murdoch void setHasID(bool f) { setFlag(f, HasIDFlag); } 30121939df44de1705786c545cd1bf519d47250322dBen Murdoch void setHasClass(bool f) { setFlag(f, HasClassFlag); } 30221939df44de1705786c545cd1bf519d47250322dBen Murdoch void setChildNeedsStyleRecalc() { setFlag(ChildNeedsStyleRecalcFlag); } 30321939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearChildNeedsStyleRecalc() { clearFlag(ChildNeedsStyleRecalcFlag); } 30421939df44de1705786c545cd1bf519d47250322dBen Murdoch void setInDocument() { setFlag(InDocumentFlag); } 30521939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearInDocument() { clearFlag(InDocumentFlag); } 30621939df44de1705786c545cd1bf519d47250322dBen Murdoch 30721939df44de1705786c545cd1bf519d47250322dBen Murdoch void setInActiveChain() { setFlag(InActiveChainFlag); } 30821939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearInActiveChain() { clearFlag(InActiveChainFlag); } 309db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 3105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void setNeedsStyleRecalc(StyleChangeType changeType = FullStyleChange); 311db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block void clearNeedsStyleRecalc() { m_nodeFlags &= ~StyleChangeMask; } 312db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 31321939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsLink(bool f) { setFlag(f, IsLinkFlag); } 31421939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsLink() { setFlag(IsLinkFlag); } 31521939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearIsLink() { clearFlag(IsLinkFlag); } 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31768513a70bcd92384395513322f1b801e7bf9c729Steve Block enum ShouldSetAttached { 31868513a70bcd92384395513322f1b801e7bf9c729Steve Block SetAttached, 31968513a70bcd92384395513322f1b801e7bf9c729Steve Block DoNotSetAttached 32068513a70bcd92384395513322f1b801e7bf9c729Steve Block }; 32168513a70bcd92384395513322f1b801e7bf9c729Steve Block void lazyAttach(ShouldSetAttached = SetAttached); 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 323a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch virtual void setFocus(bool = true); 32421939df44de1705786c545cd1bf519d47250322dBen Murdoch virtual void setActive(bool f = true, bool /*pause*/ = false) { setFlag(f, IsActiveFlag); } 32521939df44de1705786c545cd1bf519d47250322dBen Murdoch virtual void setHovered(bool f = true) { setFlag(f, IsHoveredFlag); } 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual short tabIndex() const; 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 329231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Whether this kind of node can receive focus by default. Most nodes are 330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // not focusable but some elements, such as form controls and links, are. 331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool supportsFocus() const; 332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Whether the node can actually be focused. 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isFocusable() const; 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isKeyboardFocusable(KeyboardEvent*) const; 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isMouseFocusable() const; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isContentEditable() const; 3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3392bde8e466a4451c7319e3a072d118917957d6554Steve Block bool rendererIsEditable() const { return rendererIsEditable(Editable); } 3402bde8e466a4451c7319e3a072d118917957d6554Steve Block bool rendererIsRichlyEditable() const { return rendererIsEditable(RichlyEditable); } 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool shouldUseInputMethod() const; 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual IntRect getRect() const; 34306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen IntRect renderRect(bool* isReplaced); 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34521939df44de1705786c545cd1bf519d47250322dBen Murdoch // Returns true if the node has a non-empty bounding box in layout. 34621939df44de1705786c545cd1bf519d47250322dBen Murdoch // This does not 100% guarantee the user can see it, but is pretty close. 34721939df44de1705786c545cd1bf519d47250322dBen Murdoch // Note: This method only works properly after layout has occurred. 34821939df44de1705786c545cd1bf519d47250322dBen Murdoch bool hasNonEmptyBoundingBox() const; 34921939df44de1705786c545cd1bf519d47250322dBen Murdoch 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void recalcStyle(StyleChange = NoChange) { } 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned nodeIndex() const; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Returns the DOM ownerDocument attribute. This method never returns NULL, except in the case 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of (1) a Document node or (2) a DocumentType node that is not used with any Document yet. 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual Document* ownerDocument() const; 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Returns the document associated with this node. This method never returns NULL, except in the case 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of a DocumentType node that is not used with any Document yet. A Document node returns itself. 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* document() const 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(this); 3638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(m_document || (nodeType() == DOCUMENT_TYPE_NODE && !inDocument())); 364231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return m_document; 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch TreeScope* treeScope() const; 3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Do not use this method to change the scope of a node until after the node has been 3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // removed from its previous scope. Do not use to change documents. 3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setTreeScope(TreeScope*); 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Used by the basic DOM methods (e.g., appendChild()). 3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setTreeScopeRecursively(TreeScope*); 37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Returns true if this node is associated with a document and is in its associated document's 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // node tree, false otherwise. 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool inDocument() const 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 38021939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(m_document || !getFlag(InDocumentFlag)); 38121939df44de1705786c545cd1bf519d47250322dBen Murdoch return getFlag(InDocumentFlag); 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isReadOnlyNode() const { return nodeType() == ENTITY_REFERENCE_NODE; } 3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual bool childTypeAllowed(NodeType) const { return false; } 386a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch unsigned childNodeCount() const; 387a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Node* childNode(unsigned index) const; 388a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 389a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Does a pre-order traversal of the tree to find the next node after this one. 390a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // This uses the same order that tags appear in the source file. If the stayWithin 391a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // argument is non-null, the traversal will stop once the specified node is reached. 392a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // This can be used to restrict traversal to a particular sub-tree. 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* traverseNextNode(const Node* stayWithin = 0) const; 39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Like traverseNextNode, but skips children and starts with the next sibling. 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* traverseNextSibling(const Node* stayWithin = 0) const; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Does a reverse pre-order traversal to find the node that comes before the current one in document order 399a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Node* traversePreviousNode(const Node* stayWithin = 0) const; 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Like traverseNextNode, but visits parents after their children. 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* traverseNextNodePostOrder() const; 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Like traversePreviousNode, but visits parents before their children. 405a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Node* traversePreviousNodePostOrder(const Node* stayWithin = 0) const; 406a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Node* traversePreviousSiblingPostOrder(const Node* stayWithin = 0) const; 4078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void checkSetPrefix(const AtomicString& prefix, ExceptionCode&); 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isDescendantOf(const Node*) const; 410635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool contains(const Node*) const; 4114a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch bool containsIncludingShadowDOM(Node*); 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 413e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // This method is used to do strict error-checking when adding children via 414e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block // the public DOM API (e.g., appendChild()). 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void checkAddChild(Node* newChild, ExceptionCode&); // Error-checking when adding via the DOM API 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void checkReplaceChild(Node* newChild, Node* oldChild, ExceptionCode&); 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool canReplaceChild(Node* newChild, Node* oldChild); 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Used to determine whether range offsets use characters or node indices. 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool offsetInCharacters() const; 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Number of DOM 16-bit units contained in node. Note that rendered text length can be different - e.g. because of 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // css-transform:capitalize breaking up precomposed characters and ligatures. 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual int maxCharacterOffset() const; 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: We should try to find a better location for these methods. 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool canSelectAll() const { return false; } 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void selectAll() { } 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Whether or not a selection can be started in this object 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool canStartSelection() const; 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Getting points into and out of screen space 434a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch FloatPoint convertToPage(const FloatPoint&) const; 435a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch FloatPoint convertFromPage(const FloatPoint&) const; 4368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ----------------------------------------------------------------------------- 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Integration with rendering tree 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 440a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RenderObject* renderer() const { return m_renderer; } 441a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RenderObject* nextRenderer(); 442a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RenderObject* previousRenderer(); 443a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch void setRenderer(RenderObject* renderer) { m_renderer = renderer; } 444a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 445a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Use these two methods with caution. 446a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RenderBox* renderBox() const; 447a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RenderBoxModelObject* renderBoxModelObject() const; 448a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 449a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Attaches this node to the rendering tree. This calculates the style to be applied to the node and creates an 450a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // appropriate RenderObject which will be inserted into the tree (except when the style has display: none). This 451a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // makes the node visible in the FrameView. 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void attach(); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 454a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Detaches the node from the rendering tree, making it invisible in the rendered view. This method will remove 455a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // the node's rendering object from the rendering tree and delete it. 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void detach(); 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void willRemove(); 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void createRendererIfNeeded(); 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<RenderStyle> styleForRenderer(); 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool rendererIsNeeded(RenderStyle*); 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool childShouldCreateRenderer(Node*) const { return true; } 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 4642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ContainerNode* parentNodeForRenderingAndStyle() const; 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Wrapper for nodes that don't have a renderer, but still cache the style (like HTMLOptionElement). 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderStyle* renderStyle() const; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void setRenderStyle(PassRefPtr<RenderStyle>); 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderStyle* computedStyle(PseudoId pseudoElementSpecifier = NOPSEUDO) { return virtualComputedStyle(pseudoElementSpecifier); } 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ----------------------------------------------------------------------------- 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Notification of document structure changes 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 475a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Notifies the node that it has been inserted into the document. This is called during document parsing, and also 476a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // when a node is added through the DOM methods insertBefore(), appendChild() or replaceChild(). Note that this only 477a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // happens when the node becomes part of the document tree, i.e. only when the document is actually an ancestor of 478a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // the node. The call happens _after_ the node has been added to the tree. 479a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // 480a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // This is similar to the DOMNodeInsertedIntoDocument DOM event, but does not require the overhead of event 481a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // dispatching. 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void insertedIntoDocument(); 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 484a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Notifies the node that it is no longer part of the document tree, i.e. when the document is no longer an ancestor 485a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // node. 486a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // 487a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // This is similar to the DOMNodeRemovedFromDocument DOM event, but does not require the overhead of event 488a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // dispatching, and is called _after_ the node is removed from the tree. 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void removedFromDocument(); 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These functions are called whenever you are connected or disconnected from a tree. That tree may be the main 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // document tree, or it could be another disconnected tree. Override these functions to do any work that depends 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // on connectedness to some ancestor (e.g., an ancestor <form> for example). 494635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual void insertedIntoTree(bool /*deep*/) { } 495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual void removedFromTree(bool /*deep*/) { } 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 497a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Notifies the node that it's list of children have changed (either by adding or removing child nodes), or a child 498a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // node that is of the type CDATA_SECTION_NODE, TEXT_NODE or COMMENT_NODE has changed its value. 499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project virtual void childrenChanged(bool /*changedByParser*/ = false, Node* /*beforeChange*/ = 0, Node* /*afterChange*/ = 0, int /*childCountDelta*/ = 0) { } 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !defined(NDEBUG) || defined(ANDROID_DOM_LOGGING) 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void formatForDebugger(char* buffer, unsigned length) const; 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void showNode(const char* prefix = "") const; 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void showTreeForThis() const; 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2 = 0, const char* markedLabel2 = 0) const; 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void registerDynamicNodeList(DynamicNodeList*); 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void unregisterDynamicNodeList(DynamicNodeList*); 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void notifyNodeListsChildrenChanged(); 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void notifyLocalNodeListsChildrenChanged(); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void notifyNodeListsAttributeChanged(); 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void notifyLocalNodeListsAttributeChanged(); 5155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke void notifyLocalNodeListsLabelChanged(); 51621939df44de1705786c545cd1bf519d47250322dBen Murdoch void removeCachedClassNodeList(ClassNodeList*, const String&); 51721939df44de1705786c545cd1bf519d47250322dBen Murdoch void removeCachedNameNodeList(NameNodeList*, const String&); 51821939df44de1705786c545cd1bf519d47250322dBen Murdoch void removeCachedTagNodeList(TagNodeList*, const QualifiedName&); 5195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke void removeCachedLabelsNodeList(DynamicNodeList*); 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke PassRefPtr<NodeList> getElementsByTagName(const AtomicString&); 5225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke PassRefPtr<NodeList> getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName); 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<NodeList> getElementsByName(const String& elementName); 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<NodeList> getElementsByClassName(const String& classNames); 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<Element> querySelector(const String& selectors, ExceptionCode&); 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<NodeList> querySelectorAll(const String& selectors, ExceptionCode&); 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned short compareDocumentPosition(Node*); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef ANDROID_INSTRUMENT 532635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Overridden to prevent the normal new from being called. 53347300b36ce11d38290d3933277fc9906493505d4Grace Kloba void* operator new(size_t size); 53447300b36ce11d38290d3933277fc9906493505d4Grace Kloba void* operator new[](size_t size); 535635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 536635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Overridden to prevent the normal delete from being called. 53747300b36ce11d38290d3933277fc9906493505d4Grace Kloba void operator delete(void* p, size_t size); 53847300b36ce11d38290d3933277fc9906493505d4Grace Kloba void operator delete[](void* p, size_t size); 539635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static size_t reportDOMNodesSize(); 541635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 542635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 5438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual Node* toNode() { return this; } 5448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 5452bde8e466a4451c7319e3a072d118917957d6554Steve Block virtual InputElement* toInputElement(); 5462bde8e466a4451c7319e3a072d118917957d6554Steve Block 5478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual ScriptExecutionContext* scriptExecutionContext() const; 5488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 549231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture); 550231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture); 5515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Handlers to do/undo actions on the target node before an event is dispatched to it and after the event 553231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // has been dispatched. The data pointer is handed back by the preDispatch and passed to postDispatch. 554231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void* preDispatchEventHandler(Event*) { return 0; } 555231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void postDispatchEventHandler(Event*, void* /*dataFromPreDispatch*/) { } 5565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 557231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block using EventTarget::dispatchEvent; 558f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool dispatchEvent(PassRefPtr<Event>); 559f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch void dispatchScopedEvent(PassRefPtr<Event>); 5608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 561231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void handleLocalEvents(Event*); 5628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 5635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void dispatchSubtreeModifiedEvent(); 5640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void dispatchUIEvent(const AtomicString& eventType, int detail, PassRefPtr<Event> underlyingEvent); 5658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool dispatchKeyEvent(const PlatformKeyboardEvent&); 5662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool dispatchWheelEvent(const PlatformWheelEvent&); 567a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Node* relatedTarget = 0); 5688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void dispatchSimulatedClick(PassRefPtr<Event> underlyingEvent, bool sendMouseEvents = false, bool showPressedLook = true); 5698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 5708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual void dispatchFocusEvent(); 5718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual void dispatchBlurEvent(); 5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual void dispatchChangeEvent(); 5732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual void dispatchInputEvent(); 5748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 575a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Perform the default action for an event. 5768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual void defaultEventHandler(Event*); 5778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 578a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Used for disabled form elements; if true, prevents mouse events from being dispatched 579a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // to event listeners, and prevents DOMActivate events from being sent at all. 5808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian virtual bool disabled() const; 5818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 582e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block using TreeShared<ContainerNode>::ref; 583e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block using TreeShared<ContainerNode>::deref; 584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 585231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual EventTargetData* eventTargetData(); 586231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual EventTargetData* ensureEventTargetData(); 587231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 58821939df44de1705786c545cd1bf519d47250322dBen Murdochprivate: 58921939df44de1705786c545cd1bf519d47250322dBen Murdoch enum NodeFlags { 59021939df44de1705786c545cd1bf519d47250322dBen Murdoch IsTextFlag = 1, 59121939df44de1705786c545cd1bf519d47250322dBen Murdoch IsCommentFlag = 1 << 1, 59221939df44de1705786c545cd1bf519d47250322dBen Murdoch IsContainerFlag = 1 << 2, 59321939df44de1705786c545cd1bf519d47250322dBen Murdoch IsElementFlag = 1 << 3, 59421939df44de1705786c545cd1bf519d47250322dBen Murdoch IsStyledElementFlag = 1 << 4, 59521939df44de1705786c545cd1bf519d47250322dBen Murdoch IsHTMLFlag = 1 << 5, 59621939df44de1705786c545cd1bf519d47250322dBen Murdoch IsSVGFlag = 1 << 6, 59721939df44de1705786c545cd1bf519d47250322dBen Murdoch HasIDFlag = 1 << 7, 59821939df44de1705786c545cd1bf519d47250322dBen Murdoch HasClassFlag = 1 << 8, 59921939df44de1705786c545cd1bf519d47250322dBen Murdoch IsAttachedFlag = 1 << 9, 60021939df44de1705786c545cd1bf519d47250322dBen Murdoch ChildNeedsStyleRecalcFlag = 1 << 10, 60121939df44de1705786c545cd1bf519d47250322dBen Murdoch InDocumentFlag = 1 << 11, 60221939df44de1705786c545cd1bf519d47250322dBen Murdoch IsLinkFlag = 1 << 12, 60321939df44de1705786c545cd1bf519d47250322dBen Murdoch IsActiveFlag = 1 << 13, 60421939df44de1705786c545cd1bf519d47250322dBen Murdoch IsHoveredFlag = 1 << 14, 60521939df44de1705786c545cd1bf519d47250322dBen Murdoch InActiveChainFlag = 1 << 15, 60621939df44de1705786c545cd1bf519d47250322dBen Murdoch InDetachFlag = 1 << 16, 60721939df44de1705786c545cd1bf519d47250322dBen Murdoch HasRareDataFlag = 1 << 17, 608f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IsShadowRootFlag = 1 << 18, 60921939df44de1705786c545cd1bf519d47250322dBen Murdoch 61021939df44de1705786c545cd1bf519d47250322dBen Murdoch // These bits are used by derived classes, pulled up here so they can 61121939df44de1705786c545cd1bf519d47250322dBen Murdoch // be stored in the same memory word as the Node bits above. 612f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IsParsingChildrenFinishedFlag = 1 << 19, // Element 613f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IsStyleAttributeValidFlag = 1 << 20, // StyledElement 614f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IsSynchronizingStyleAttributeFlag = 1 << 21, // StyledElement 61521939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(SVG) 616f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch AreSVGAttributesValidFlag = 1 << 22, // Element 617f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IsSynchronizingSVGAttributesFlag = 1 << 23, // SVGElement 618f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch HasSVGRareDataFlag = 1 << 24, // SVGElement 61921939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 620f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 62121939df44de1705786c545cd1bf519d47250322dBen Murdoch StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1), 62221939df44de1705786c545cd1bf519d47250322dBen Murdoch 62381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch SelfOrAncestorHasDirAutoFlag = 1 << 27, 62481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 62521939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(SVG) 62621939df44de1705786c545cd1bf519d47250322dBen Murdoch DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag 62721939df44de1705786c545cd1bf519d47250322dBen Murdoch#else 62821939df44de1705786c545cd1bf519d47250322dBen Murdoch DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag 62921939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 63021939df44de1705786c545cd1bf519d47250322dBen Murdoch }; 63121939df44de1705786c545cd1bf519d47250322dBen Murdoch 632f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // 4 bits remaining 63321939df44de1705786c545cd1bf519d47250322dBen Murdoch 63421939df44de1705786c545cd1bf519d47250322dBen Murdoch bool getFlag(NodeFlags mask) const { return m_nodeFlags & mask; } 63521939df44de1705786c545cd1bf519d47250322dBen Murdoch void setFlag(bool f, NodeFlags mask) const { m_nodeFlags = (m_nodeFlags & ~mask) | (-(int32_t)f & mask); } 63621939df44de1705786c545cd1bf519d47250322dBen Murdoch void setFlag(NodeFlags mask) const { m_nodeFlags |= mask; } 63721939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearFlag(NodeFlags mask) const { m_nodeFlags &= ~mask; } 63821939df44de1705786c545cd1bf519d47250322dBen Murdoch 639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprotected: 64021939df44de1705786c545cd1bf519d47250322dBen Murdoch enum ConstructionType { 64121939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateOther = DefaultNodeFlags, 64221939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateText = DefaultNodeFlags | IsTextFlag, 64321939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateComment = DefaultNodeFlags | IsCommentFlag, 64421939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateContainer = DefaultNodeFlags | IsContainerFlag, 64521939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateElement = CreateContainer | IsElementFlag, 64621939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateStyledElement = CreateElement | IsStyledElementFlag, 64721939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateHTMLElement = CreateStyledElement | IsHTMLFlag, 64821939df44de1705786c545cd1bf519d47250322dBen Murdoch CreateSVGElement = CreateStyledElement | IsSVGFlag, 64921939df44de1705786c545cd1bf519d47250322dBen Murdoch }; 650231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Node(Document*, ConstructionType); 651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 6522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Do not use this method to change the document of a node until after the node has been 6532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // removed from its previous document. 6542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setDocument(Document*); 6552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setDocumentRecursively(Document*); 6562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 657231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void willMoveToNewOwnerDocument(); 658231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void didMoveToNewOwnerDocument(); 659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const { } 661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void setTabIndexExplicitly(short); 66281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void clearTabIndexExplicitly(); 663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 66421939df44de1705786c545cd1bf519d47250322dBen Murdoch bool hasRareData() const { return getFlag(HasRareDataFlag); } 665d0825bca7fe65beaee391d30da42e937db621564Steve Block 666231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NodeRareData* rareData() const; 667231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NodeRareData* ensureRareData(); 668231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 6698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprivate: 6702bde8e466a4451c7319e3a072d118917957d6554Steve Block enum EditableLevel { Editable, RichlyEditable }; 6712bde8e466a4451c7319e3a072d118917957d6554Steve Block bool rendererIsEditable(EditableLevel) const; 6722bde8e466a4451c7319e3a072d118917957d6554Steve Block 67321939df44de1705786c545cd1bf519d47250322dBen Murdoch void setStyleChange(StyleChangeType); 674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 67568513a70bcd92384395513322f1b801e7bf9c729Steve Block // Used to share code between lazyAttach and setNeedsStyleRecalc. 67668513a70bcd92384395513322f1b801e7bf9c729Steve Block void markAncestorsWithChildNeedsStyleRecalc(); 67768513a70bcd92384395513322f1b801e7bf9c729Steve Block 67881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RenderObject* createRendererAndStyle(); 67981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 680a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch virtual void refEventTarget(); 681a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch virtual void derefEventTarget(); 6828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual NodeRareData* createRareData(); 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool rareDataFocused() const; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual RenderStyle* nonRendererRenderStyle() const; 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const AtomicString& virtualPrefix() const; 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const AtomicString& virtualLocalName() const; 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const AtomicString& virtualNamespaceURI() const; 691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block virtual RenderStyle* virtualComputedStyle(PseudoId = NOPSEUDO); 692635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 693635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Element* ancestorElement() const; 694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 695f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Use Node::parentNode as the consistent way of querying a parent node. 696f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // This method is made private to ensure a compiler error on call sites that 697f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // don't follow this rule. 698f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch using TreeShared<ContainerNode>::parent; 699f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 70021939df44de1705786c545cd1bf519d47250322dBen Murdoch void trackForDebugging(); 701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 702231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Document* m_document; 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* m_previous; 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* m_next; 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* m_renderer; 70621939df44de1705786c545cd1bf519d47250322dBen Murdoch mutable uint32_t m_nodeFlags; 70721939df44de1705786c545cd1bf519d47250322dBen Murdoch 708a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochprotected: 70921939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isParsingChildrenFinished() const { return getFlag(IsParsingChildrenFinishedFlag); } 71021939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsParsingChildrenFinished() { setFlag(IsParsingChildrenFinishedFlag); } 71121939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearIsParsingChildrenFinished() { clearFlag(IsParsingChildrenFinishedFlag); } 71221939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isStyleAttributeValid() const { return getFlag(IsStyleAttributeValidFlag); } 71321939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsStyleAttributeValid(bool f) { setFlag(f, IsStyleAttributeValidFlag); } 71421939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsStyleAttributeValid() const { setFlag(IsStyleAttributeValidFlag); } 71521939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearIsStyleAttributeValid() { clearFlag(IsStyleAttributeValidFlag); } 71621939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isSynchronizingStyleAttribute() const { return getFlag(IsSynchronizingStyleAttributeFlag); } 71721939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsSynchronizingStyleAttribute(bool f) { setFlag(f, IsSynchronizingStyleAttributeFlag); } 71821939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsSynchronizingStyleAttribute() const { setFlag(IsSynchronizingStyleAttributeFlag); } 71921939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearIsSynchronizingStyleAttribute() const { clearFlag(IsSynchronizingStyleAttributeFlag); } 720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(SVG) 72221939df44de1705786c545cd1bf519d47250322dBen Murdoch bool areSVGAttributesValid() const { return getFlag(AreSVGAttributesValidFlag); } 72321939df44de1705786c545cd1bf519d47250322dBen Murdoch void setAreSVGAttributesValid() const { setFlag(AreSVGAttributesValidFlag); } 72421939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearAreSVGAttributesValid() { clearFlag(AreSVGAttributesValidFlag); } 72521939df44de1705786c545cd1bf519d47250322dBen Murdoch bool isSynchronizingSVGAttributes() const { return getFlag(IsSynchronizingSVGAttributesFlag); } 72621939df44de1705786c545cd1bf519d47250322dBen Murdoch void setIsSynchronizingSVGAttributes() const { setFlag(IsSynchronizingSVGAttributesFlag); } 72721939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearIsSynchronizingSVGAttributes() const { clearFlag(IsSynchronizingSVGAttributesFlag); } 72821939df44de1705786c545cd1bf519d47250322dBen Murdoch bool hasRareSVGData() const { return getFlag(HasSVGRareDataFlag); } 72921939df44de1705786c545cd1bf519d47250322dBen Murdoch void setHasRareSVGData() { setFlag(HasSVGRareDataFlag); } 73021939df44de1705786c545cd1bf519d47250322dBen Murdoch void clearHasRareSVGData() { clearFlag(HasSVGRareDataFlag); } 731635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 733635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 734635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Used in Node::addSubresourceAttributeURLs() and in addSubresourceStyleURLs() 735635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline void addSubresourceURL(ListHashSet<KURL>& urls, const KURL& url) 736635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 737635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!url.isNull()) 738635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project urls.add(url); 739635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 740635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 741f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline ContainerNode* Node::parentNode() const 742f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 7432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return getFlag(IsShadowRootFlag) || isSVGShadowRoot() ? 0 : parent(); 744f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 745f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 746f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline ContainerNode* Node::parentOrHostNode() const 747f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 748f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return parent(); 749f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 750f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 751f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline ContainerNode* Node::parentNodeGuaranteedHostFree() const 752f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 7532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!getFlag(IsShadowRootFlag) && !isSVGShadowRoot()); 754f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return parentOrHostNode(); 755f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 756f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} //namespace 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Outside the WebCore namespace for ease of invocation from gdb. 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::Node*); 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 765