15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2001 Dirk Mueller (mueller@kde.org) 5c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * Copyright (C) 2004-2011, 2014 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef Node_h 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Node_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MutationObserver.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/SimulatedClickOptions.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScope.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/TreeShared.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/EditingBoundary.h" 341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventTarget.h" 355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/inspector/InspectorCounters.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyleConstants.h" 371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/LayoutRect.h" 3810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/heap/Handle.h" 3951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURLHash.h" 40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Forward.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This needs to be here because Document.h also depends on it. 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DUMP_NODE_STATISTICS 0 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Attribute; 4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class ClassCollection; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ContainerNode; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DOMSettableTokenList; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Event; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EventDispatchMediator; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EventListener; 56df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FloatPoint; 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class LocalFrame; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLInputElement; 60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class HTMLQualifiedName; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IntRect; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class KeyboardEvent; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NSResolver; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NameNodeList; 6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class NamedNodeMap; 6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class NodeEventContext; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeList; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeListsNodeData; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeRareData; 7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class PlatformGestureEvent; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformKeyboardEvent; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformMouseEvent; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformWheelEvent; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class QualifiedName; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RadioNodeList; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RegisteredEventListener; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderBox; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderBoxModelObject; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderStyle; 81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class SVGQualifiedName; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ShadowRoot; 83e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)template <typename NodeType> class StaticNodeTypeList; 84e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)typedef StaticNodeTypeList<Node> StaticNodeList; 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class TagCollection; 8651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class Text; 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TouchEvent; 88f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass WeakNodeMap; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuconst int nodeStyleChangeShift = 19; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)enum StyleChangeType { 93e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) NoStyleChange = 0, 94e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch LocalStyleChange = 1 << nodeStyleChangeShift, 95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch SubtreeStyleChange = 2 << nodeStyleChangeShift, 961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) NeedsReattachStyleChange = 3 << nodeStyleChangeShift, 97e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 98591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeRareDataBase { 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* renderer() const { return m_renderer; } 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setRenderer(RenderObject* renderer) { m_renderer = renderer; } 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) NodeRareDataBase(RenderObject* renderer) 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_renderer(renderer) 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { } 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 109e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)protected: 110e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // Oilpan: This member is traced in NodeRareData. 111e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // FIXME: Can we add traceAfterDispatch and finalizeGarbageCollectedObject 112e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // to NodeRareDataBase, and make m_renderer Member<>? 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* m_renderer; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ENABLE(OILPAN) 117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#define NODE_BASE_CLASSES public GarbageCollectedFinalized<Node>, public EventTarget 1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#else 1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// TreeShared should be the last to pack TreeShared::m_refCount and 1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Node::m_nodeFlags on 64bit platforms. 121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#define NODE_BASE_CLASSES public EventTarget, public TreeShared<Node> 1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif 1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class Node : NODE_BASE_CLASSES { 1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_EVENT_TARGET_REFCOUNTING_WILL_BE_REMOVED(TreeShared<Node>); 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_WRAPPERTYPEINFO(); 1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(Node); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class Document; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class TreeScope; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class TreeScopeAdopter; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum NodeType { 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ELEMENT_NODE = 1, 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ATTRIBUTE_NODE = 2, 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TEXT_NODE = 3, 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CDATA_SECTION_NODE = 4, 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PROCESSING_INSTRUCTION_NODE = 7, 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) COMMENT_NODE = 8, 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_NODE = 9, 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_TYPE_NODE = 10, 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_FRAGMENT_NODE = 11, 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 14381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Entity, EntityReference, Notation, and XPathNamespace nodes are impossible to create in Blink. 14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // But for compatibility reasons we want these enum values exist in JS, and this enum makes the bindings 14681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) // generation not complain about ENTITY_REFERENCE_NODE being missing from the implementation 14781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) // while not requiring all switch(NodeType) blocks to include this deprecated constant. 14881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) enum DeprecatedNodeType { 14909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ENTITY_REFERENCE_NODE = 5, 15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ENTITY_NODE = 6, 15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) NOTATION_NODE = 12, 15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) XPATH_NAMESPACE_NODE = 13, 15381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) }; 15481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum DocumentPosition { 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_EQUIVALENT = 0x00, 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_DISCONNECTED = 0x01, 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_PRECEDING = 0x02, 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_FOLLOWING = 0x04, 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_CONTAINS = 0x08, 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_CONTAINED_BY = 0x10, 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20, 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#if !ENABLE(OILPAN) 1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // All Nodes are placed in their own heap partition for security. 1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // See http://crbug.com/246860 for detail. 1685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void* operator new(size_t); 1695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void operator delete(void*); 170a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#endif 1715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void dumpStatistics(); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~Node(); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DOM methods & attributes for Node 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool hasTagName(const HTMLQualifiedName&) const; 179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool hasTagName(const SVGQualifiedName&) const; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String nodeName() const = 0; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String nodeValue() const; 182e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch virtual void setNodeValue(const String&); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual NodeType nodeType() const = 0; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContainerNode* parentNode() const; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* parentElement() const; 18607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ContainerNode* parentElementOrShadowRoot() const; 187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ContainerNode* parentElementOrDocumentFragment() const; 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* previousSibling() const { return m_previous; } 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* nextSibling() const { return m_next; } 190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) PassRefPtrWillBeRawPtr<NodeList> childNodes(); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* firstChild() const; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* lastChild() const; 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 194df95704c49daea886ddad70775bda23618d6274dBen Murdoch void remove(ExceptionState&); 195e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) 19653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Node* pseudoAwareNextSibling() const; 19753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Node* pseudoAwarePreviousSibling() const; 19853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Node* pseudoAwareFirstChild() const; 19953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Node* pseudoAwareLastChild() const; 20053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual KURL baseURI() const; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These should all actually return a node, but this is only important for language bindings, 2041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // which will already know and hold a ref on the right node to return. 205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch PassRefPtrWillBeRawPtr<Node> insertBefore(PassRefPtrWillBeRawPtr<Node> newChild, Node* refChild, ExceptionState& = ASSERT_NO_EXCEPTION); 206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch PassRefPtrWillBeRawPtr<Node> replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& = ASSERT_NO_EXCEPTION); 207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch PassRefPtrWillBeRawPtr<Node> removeChild(PassRefPtrWillBeRawPtr<Node> child, ExceptionState& = ASSERT_NO_EXCEPTION); 208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch PassRefPtrWillBeRawPtr<Node> appendChild(PassRefPtrWillBeRawPtr<Node> newChild, ExceptionState& = ASSERT_NO_EXCEPTION); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool hasChildren() const { return firstChild(); } 211d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual PassRefPtrWillBeRawPtr<Node> cloneNode(bool deep = false) = 0; 21293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) virtual const AtomicString& localName() const; 21393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) virtual const AtomicString& namespaceURI() const; 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void normalize(); 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isSameNode(Node* other) const { return this == other; } 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isEqualNode(Node*) const; 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isDefaultNamespace(const AtomicString& namespaceURI) const; 219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) const AtomicString& lookupPrefix(const AtomicString& namespaceURI) const; 220a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) const AtomicString& lookupNamespaceURI(const String& prefix) const; 22102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String textContent(bool convertBRsToNewlines = false) const; 223a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) void setTextContent(const String&); 22402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Other methods (not part of DOM) 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isElementNode() const { return getFlag(IsElementFlag); } 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isContainerNode() const { return getFlag(IsContainerFlag); } 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isTextNode() const { return getFlag(IsTextFlag); } 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isHTMLElement() const { return getFlag(IsHTMLFlag); } 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isSVGElement() const { return getFlag(IsSVGFlag); } 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isPseudoElement() const { return pseudoId() != NOPSEUDO; } 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isBeforePseudoElement() const { return pseudoId() == BEFORE; } 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isAfterPseudoElement() const { return pseudoId() == AFTER; } 236c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual PseudoId pseudoId() const { return NOPSEUDO; } 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 238f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu bool isCustomElement() const { return getFlag(CustomElementFlag); } 2397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch enum CustomElementState { 24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) NotCustomElement = 0, 24151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) WaitingForUpgrade = 1 << 0, 24251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Upgraded = 1 << 1 2437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch }; 24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CustomElementState customElementState() const 24551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) { 24651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return isCustomElement() 247f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ? (getFlag(CustomElementUpgradedFlag) ? Upgraded : WaitingForUpgrade) 24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : NotCustomElement; 24951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 2507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch void setCustomElementState(CustomElementState newState); 25153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isMediaControlElement() const { return false; } 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isMediaControls() const { return false; } 25451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool isVTTElement() const { return false; } 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isAttributeNode() const { return false; } 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isCharacterDataNode() const { return false; } 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isFrameOwnerElement() const { return false; } 258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 259e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // StyledElements allow inline style (style="border: 1px"), presentational attributes (ex. color), 260e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // class names (ex. class="foo bar") and other non-basic styling features. They and also control 261e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // if this element can participate in style sharing. 262e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // 263e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // FIXME: The only things that ever go through StyleResolver that aren't StyledElements are 26451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // PseudoElements and VTTElements. It's possible we can just eliminate all the checks 265e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // since those elements will never have class names, inline style, or other things that 266e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // this apparently guards against. 267e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch bool isStyledElement() const { return isHTMLElement() || isSVGElement(); } 268e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isDocumentNode() const; 270197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool isTreeScope() const; 271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isDocumentFragment() const { return getFlag(IsDocumentFragmentFlag); } 272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isShadowRoot() const { return isDocumentFragment() && isTreeScope(); } 273521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool isInsertionPoint() const { return getFlag(IsInsertionPointFlag); } 274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool hasCustomStyleCallbacks() const { return getFlag(HasCustomStyleCallbacksFlag); } 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasSyntheticAttrChildNodes() const { return getFlag(HasSyntheticAttrChildNodesFlag); } 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHasSyntheticAttrChildNodes(bool flag) { setFlag(flag, HasSyntheticAttrChildNodesFlag); } 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this node is in a shadow tree, returns its shadow host. Otherwise, returns 0. 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* shadowHost() const; 282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ShadowRoot* containingShadowRoot() const; 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ShadowRoot* youngestShadowRoot() const; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns 0, a child of ShadowRoot, or a legacy shadow root. 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* nonBoundaryShadowTreeRootNode(); 287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Node's parent, shadow tree host. 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ContainerNode* parentOrShadowHostNode() const; 290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Element* parentOrShadowHostElement() const; 291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setParentOrShadowHostNode(ContainerNode*); 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // Knows about all kinds of hosts. 29451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ContainerNode* parentOrShadowHostOrTemplateHostNode() const; 29551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the parent node, but 0 if the parent node is a ShadowRoot. 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContainerNode* nonShadowBoundaryParentNode() const; 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool selfOrAncestorHasDirAutoAttribute() const { return getFlag(SelfOrAncestorHasDirAutoFlag); } 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setSelfOrAncestorHasDirAutoAttribute(bool flag) { setFlag(flag, SelfOrAncestorHasDirAutoFlag); } 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // Returns the enclosing event parent Element (or self) that, when clicked, would trigger a navigation. 303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Element* enclosingLinkEventParentOrSelf(); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These low-level calls give the caller responsibility for maintaining the integrity of the tree. 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setPreviousSibling(Node* previous) { m_previous = previous; } 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setNextSibling(Node* next) { m_next = next; } 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool canContainRangeEndPoint() const { return false; } 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: These two functions belong in editing -- "atomic node" is an editing concept. 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* previousNodeConsideringAtomicNodes() const; 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* nextNodeConsideringAtomicNodes() const; 31402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the next leaf node or 0 if there are no more. 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes. 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Uses an editing-specific concept of what a leaf node is, and should probably be moved 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // out of the Node class into an editing-specific source file. 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* nextLeafNode() const; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the previous leaf node or 0 if there are no more. 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes. 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Uses an editing-specific concept of what a leaf node is, and should probably be moved 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // out of the Node class into an editing-specific source file. 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* previousLeafNode() const; 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isRootEditableElement() const; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* rootEditableElement() const; 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* rootEditableElement(EditableType) const; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For <link> and <style> elements. 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool sheetLoaded() { return true; } 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void notifyLoadedSheetAndAllCriticalSubresources(bool /* error loading subresource */) { } 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void startLoadingDynamicSheet() { ASSERT_NOT_REACHED(); } 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool hasName() const { return !isTextNode() && getFlag(HasNameOrIsEditingTextFlag); } 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 338f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu bool isUserActionElement() const { return getFlag(IsUserActionElementFlag); } 339f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void setUserActionElement(bool flag) { setFlag(flag, IsUserActionElementFlag); } 340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool active() const { return isUserActionElement() && isUserActionElementActive(); } 342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool inActiveChain() const { return isUserActionElement() && isUserActionElementInActiveChain(); } 343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); } 344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool focused() const { return isUserActionElement() && isUserActionElementFocused(); } 345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 34651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool needsAttach() const { return styleChangeType() == NeedsReattachStyleChange; } 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool needsStyleRecalc() const { return styleChangeType() != NoStyleChange; } 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleChangeType styleChangeType() const { return static_cast<StyleChangeType>(m_nodeFlags & StyleChangeMask); } 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool childNeedsStyleRecalc() const { return getFlag(ChildNeedsStyleRecalcFlag); } 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isLink() const { return getFlag(IsLinkFlag); } 351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isEditingText() const { return isTextNode() && getFlag(HasNameOrIsEditingTextFlag); } 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setHasName(bool f) { ASSERT(!isTextNode()); setFlag(f, HasNameOrIsEditingTextFlag); } 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setChildNeedsStyleRecalc() { setFlag(ChildNeedsStyleRecalcFlag); } 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clearChildNeedsStyleRecalc() { clearFlag(ChildNeedsStyleRecalcFlag); } 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch void setNeedsStyleRecalc(StyleChangeType); 358a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) void clearNeedsStyleRecalc(); 359591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 360f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu bool childNeedsDistributionRecalc() const { return getFlag(ChildNeedsDistributionRecalcFlag); } 361f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void setChildNeedsDistributionRecalc() { setFlag(ChildNeedsDistributionRecalcFlag); } 362f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void clearChildNeedsDistributionRecalc() { clearFlag(ChildNeedsDistributionRecalcFlag); } 363f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) void markAncestorsWithChildNeedsDistributionRecalc(); 364f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 365f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu bool childNeedsStyleInvalidation() const { return getFlag(ChildNeedsStyleInvalidationFlag); } 366f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void setChildNeedsStyleInvalidation() { setFlag(ChildNeedsStyleInvalidationFlag); } 367f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void clearChildNeedsStyleInvalidation() { clearFlag(ChildNeedsStyleInvalidationFlag); } 36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void markAncestorsWithChildNeedsStyleInvalidation(); 369f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu bool needsStyleInvalidation() const { return getFlag(NeedsStyleInvalidationFlag); } 370f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void clearNeedsStyleInvalidation() { clearFlag(NeedsStyleInvalidationFlag); } 37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void setNeedsStyleInvalidation(); 37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 373f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) void recalcDistribution(); 374f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 375f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) bool svgFilterNeedsLayerUpdate() const { return getFlag(SVGFilterNeedsLayerUpdateFlag); } 376f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) void setSVGFilterNeedsLayerUpdate() { setFlag(SVGFilterNeedsLayerUpdateFlag); } 377f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) void clearSVGFilterNeedsLayerUpdate() { clearFlag(SVGFilterNeedsLayerUpdateFlag); } 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 379e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) void setIsLink(bool f); 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasEventTargetData() const { return getFlag(HasEventTargetDataFlag); } 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHasEventTargetData(bool flag) { setFlag(flag, HasEventTargetDataFlag); } 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isV8CollectableDuringMinorGC() const { return getFlag(V8CollectableDuringMinorGCFlag); } 38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void markV8CollectableDuringMinorGC() { setFlag(true, V8CollectableDuringMinorGCFlag); } 38609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void clearV8CollectableDuringMinorGC() { setFlag(false, V8CollectableDuringMinorGCFlag); } 387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void setFocus(bool flag); 38951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual void setActive(bool flag = true); 390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void setHovered(bool flag = true); 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual short tabIndex() const; 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Node* focusDelegate(); 395591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // This is called only when the node is focused. 396591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch virtual bool shouldHaveFocusAppearance() const; 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 398e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Whether the node is inert. This can't be in Element because text nodes 399e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // must be recognized as inert to prevent text selection. 400e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) bool isInert() const; 401e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum UserSelectAllTreatment { 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UserSelectAllDoesNotAffectEditability, 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UserSelectAllIsAlwaysNonEditable 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isContentEditable(UserSelectAllTreatment = UserSelectAllDoesNotAffectEditability); 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isContentRichlyEditable(); 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 409197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool hasEditableStyle(EditableType editableType = ContentIsEditable, UserSelectAllTreatment treatment = UserSelectAllIsAlwaysNonEditable) const 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (editableType) { 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ContentIsEditable: 413197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return hasEditableStyle(Editable, treatment); 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case HasEditableAXRole: 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isEditableToAccessibility(Editable); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool rendererIsRichlyEditable(EditableType editableType = ContentIsEditable) const 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (editableType) { 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ContentIsEditable: 425197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return hasEditableStyle(RichlyEditable, UserSelectAllIsAlwaysNonEditable); 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case HasEditableAXRole: 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isEditableToAccessibility(RichlyEditable); 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual LayoutRect boundingBox() const; 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect pixelSnappedBoundingBox() const { return pixelSnappedIntRect(boundingBox()); } 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if the node has a non-empty bounding box in layout. 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This does not 100% guarantee the user can see it, but is pretty close. 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note: This method only works properly after layout has occurred. 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasNonEmptyBoundingBox() const; 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned nodeIndex() const; 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // Returns the DOM ownerDocument attribute. This method never returns NULL, except in the case 4448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // of a Document node. 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* ownerDocument() const; 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // Returns the document associated with this node. A Document node returns itself. 4488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Document& document() const 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 45009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return treeScope().document(); 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) TreeScope& treeScope() const 45409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 45509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(m_treeScope); 45609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return *m_treeScope; 45709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 459f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) bool inActiveDocument() const; 460f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if this node is associated with a document and is in its associated document's 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node tree, false otherwise. 46302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch bool inDocument() const 46402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getFlag(InDocumentFlag); 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isInShadowTree() const { return getFlag(IsInShadowTreeFlag); } 468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isInTreeScope() const { return getFlag(static_cast<NodeFlags>(InDocumentFlag | IsInShadowTreeFlag)); } 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isDocumentTypeNode() const { return nodeType() == DOCUMENT_TYPE_NODE; } 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool childTypeAllowed(NodeType) const { return false; } 472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) unsigned countChildren() const; 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isDescendantOf(const Node*) const; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool contains(const Node*) const; 476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool containsIncludingShadowDOM(const Node*) const; 47719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) bool containsIncludingHostElements(const Node&) const; 47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* commonAncestor(const Node&, Node* (*parent)(const Node&)); 479f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Used to determine whether range offsets use characters or node indices. 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool offsetInCharacters() const; 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Number of DOM 16-bit units contained in node. Note that rendered text length can be different - e.g. because of 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // css-transform:capitalize breaking up precomposed characters and ligatures. 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual int maxCharacterOffset() const; 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Whether or not a selection can be started in this object 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool canStartSelection() const; 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ----------------------------------------------------------------------------- 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Integration with rendering tree 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // As renderer() includes a branch you should avoid calling it repeatedly in hot code paths. 493a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // Note that if a Node has a renderer, it's parentNode is guaranteed to have one as well. 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* renderer() const { return hasRareData() ? m_data.m_rareData->renderer() : m_data.m_renderer; }; 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setRenderer(RenderObject* renderer) 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasRareData()) 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.m_rareData->setRenderer(renderer); 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data.m_renderer = renderer; 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use these two methods with caution. 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* renderBox() const; 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBoxModelObject* renderBoxModelObject() const; 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 507521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) struct AttachContext { 508521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderStyle* resolvedStyle; 509521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool performingReattach; 510521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 511521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) AttachContext() : resolvedStyle(0), performingReattach(false) { } 512521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) }; 513521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Attaches this node to the rendering tree. This calculates the style to be applied to the node and creates an 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // appropriate RenderObject which will be inserted into the tree (except when the style has display: none). This 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // makes the node visible in the FrameView. 517521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) virtual void attach(const AttachContext& = AttachContext()); 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Detaches the node from the rendering tree, making it invisible in the rendered view. This method will remove 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the node's rendering object from the rendering tree and delete it. 521521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) virtual void detach(const AttachContext& = AttachContext()); 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 523197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool inDetach() const; 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 527521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) void reattach(const AttachContext& = AttachContext()); 52893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) void lazyReattachIfAttached(); 529e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Returns true if recalcStyle should be called on the object, if there is such a method (on Document and Element). 53109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool shouldCallRecalcStyle(StyleRecalcChange); 53209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Wrapper for nodes that don't have a renderer, but still cache the style (like HTMLOptionElement). 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* renderStyle() const; 53583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch RenderStyle* parentRenderStyle() const; 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* computedStyle(PseudoId pseudoElementSpecifier = NOPSEUDO) { return virtualComputedStyle(pseudoElementSpecifier); } 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ----------------------------------------------------------------------------- 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Notification of document structure changes (see ContainerNode.h for more notification methods) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // At first, WebKit notifies the node that it has been inserted into the document. This is called during document parsing, and also 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when a node is added through the DOM methods insertBefore(), appendChild() or replaceChild(). The call happens _after_ the node has been added to the tree. 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is similar to the DOMNodeInsertedIntoDocument DOM event, but does not require the overhead of event 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatching. 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // WebKit notifies this callback regardless if the subtree of the node is a document tree or a floating subtree. 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Implementation can determine the type of subtree by seeing insertionPoint->inDocument(). 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For a performance reason, notifications are delivered only to ContainerNode subclasses if the insertionPoint is out of document. 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 5518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // There are another callback named didNotifySubtreeInsertionsToDocument(), which is called after all the descendant is notified, 5528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // if this node was inserted into the document tree. Only a few subclasses actually need this. To utilize this, the node should 553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // return InsertionShouldCallDidNotifySubtreeInsertions from insertedInto(). 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum InsertionNotificationRequest { 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InsertionDone, 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InsertionShouldCallDidNotifySubtreeInsertions 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual InsertionNotificationRequest insertedInto(ContainerNode* insertionPoint); 5618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) virtual void didNotifySubtreeInsertionsToDocument() { } 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Notifies the node that it is no longer part of the tree. 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is a dual of insertedInto(), and is similar to the DOMNodeRemovedFromDocument DOM event, but does not require the overhead of event 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatching, and is called _after_ the node is removed from the tree. 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void removedFrom(ContainerNode* insertionPoint); 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String debugName() const; 57153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 572e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#ifndef NDEBUG 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void formatForDebugger(char* buffer, unsigned length) const; 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void showNode(const char* prefix = "") const; 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void showTreeForThis() const; 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void showNodePathForThis() const; 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2 = 0, const char* markedLabel2 = 0) const; 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void showTreeForThisAcrossFrame() const; 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeListsNodeData* nodeLists(); 583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void clearNodeLists(); 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool willRespondToMouseMoveEvents(); 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool willRespondToMouseClickEvents(); 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool willRespondToTouchEvents(); 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) enum ShadowTreesTreatment { 59053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) TreatShadowTreesAsDisconnected, 59153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) TreatShadowTreesAsComposed 59253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) }; 59353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 594c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) unsigned short compareDocumentPosition(const Node*, ShadowTreesTreatment = TreatShadowTreesAsDisconnected) const; 59553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 59609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual Node* toNode() OVERRIDE FINAL; 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) virtual const AtomicString& interfaceName() const OVERRIDE; 5995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) virtual ExecutionContext* executionContext() const OVERRIDE FINAL; 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) OVERRIDE; 602197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual bool removeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) OVERRIDE; 60309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void removeAllEventListeners() OVERRIDE; 604a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch void removeAllEventListenersRecursively(); 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Handlers to do/undo actions on the target node before an event is dispatched to it and after the event 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has been dispatched. The data pointer is handed back by the preDispatch and passed to postDispatch. 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void* preDispatchEventHandler(Event*) { return 0; } 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void postDispatchEventHandler(Event*, void* /*dataFromPreDispatch*/) { } 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) using EventTarget::dispatchEvent; 612a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch virtual bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>) OVERRIDE; 613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 614a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch void dispatchScopedEvent(PassRefPtrWillBeRawPtr<Event>); 6155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void dispatchScopedEventDispatchMediator(PassRefPtrWillBeRawPtr<EventDispatchMediator>); 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void handleLocalEvents(Event*); 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void dispatchSubtreeModifiedEvent(); 620a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch bool dispatchDOMActivateEvent(int detail, PassRefPtrWillBeRawPtr<Event> underlyingEvent); 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool dispatchKeyEvent(const PlatformKeyboardEvent&); 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool dispatchWheelEvent(const PlatformWheelEvent&); 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Node* relatedTarget = 0); 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool dispatchGestureEvent(const PlatformGestureEvent&); 626a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch bool dispatchTouchEvent(PassRefPtrWillBeRawPtr<TouchEvent>); 627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 62851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEventOptions = SendNoEvents); 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void dispatchInputEvent(); 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Perform the default action for an event. 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void defaultEventHandler(Event*); 634591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch virtual void willCallDefaultEventHandler(const Event&); 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) virtual EventTargetData* eventTargetData() OVERRIDE; 6371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) virtual EventTargetData& ensureEventTargetData() OVERRIDE; 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch void getRegisteredMutationObserversOfType(WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions>&, MutationObserver::MutationType, const QualifiedName* attributeName); 640d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void registerMutationObserver(MutationObserver&, MutationObserverOptions, const HashSet<AtomicString>& attributeFilter); 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void unregisterMutationObserver(MutationObserverRegistration*); 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void registerTransientMutationObserver(MutationObserverRegistration*); 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void unregisterTransientMutationObserver(MutationObserverRegistration*); 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void notifyMutationObserversNodeWillDetach(); 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned connectedSubframeCount() const; 647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void incrementConnectedSubframeCount(unsigned amount = 1); 648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void decrementConnectedSubframeCount(unsigned amount = 1); 649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void updateAncestorConnectedSubframeCountForRemoval() const; 650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void updateAncestorConnectedSubframeCountForInsertion() const; 651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 65276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) PassRefPtrWillBeRawPtr<StaticNodeList> getDestinationInsertionPoints(); 6533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 654e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) void setAlreadySpellChecked(bool flag) { setFlag(flag, AlreadySpellCheckedFlag); } 655e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) bool isAlreadySpellChecked() { return getFlag(AlreadySpellCheckedFlag); } 656e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 65707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool isFinishedParsingChildren() const { return getFlag(IsFinishedParsingChildrenFlag); } 65807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 659d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void trace(Visitor*) OVERRIDE; 660a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 661f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) unsigned lengthOfContents() const; 662f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 6637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual v8::Handle<v8::Object> wrap(v8::Handle<v8::Object> creationContext, v8::Isolate*) OVERRIDE; 6647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual v8::Handle<v8::Object> associateWithWrapper(const WrapperTypeInfo*, v8::Handle<v8::Object> wrapper, v8::Isolate*) OVERRIDE; 6657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum NodeFlags { 668f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu HasRareDataFlag = 1, 669f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 670f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Node type flags. These never change once created. 671f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsTextFlag = 1 << 1, 672f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsContainerFlag = 1 << 2, 673f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsElementFlag = 1 << 3, 674f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsHTMLFlag = 1 << 4, 675f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsSVGFlag = 1 << 5, 676f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsDocumentFragmentFlag = 1 << 6, 677f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsInsertionPointFlag = 1 << 7, 678f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 679f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Changes based on if the element should be treated like a link, 680f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // ex. When setting the href attribute on an <a>. 681e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch IsLinkFlag = 1 << 8, 6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 683f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Changes based on :hover, :active and :focus state. 684f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsUserActionElementFlag = 1 << 9, 68509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 686f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Tree state flags. These change when the element is added/removed 687f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // from a DOM tree. 688f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu InDocumentFlag = 1 << 10, 689f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsInShadowTreeFlag = 1 << 11, 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 691f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Set by the parser when the children are done parsing. 692f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IsFinishedParsingChildrenFlag = 1 << 12, 6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 694f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Flags related to recalcStyle. 695f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) SVGFilterNeedsLayerUpdateFlag = 1 << 13, 696f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu HasCustomStyleCallbacksFlag = 1 << 14, 697f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ChildNeedsStyleInvalidationFlag = 1 << 15, 698f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu NeedsStyleInvalidationFlag = 1 << 16, 699f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ChildNeedsDistributionRecalcFlag = 1 << 17, 700f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ChildNeedsStyleRecalcFlag = 1 << 18, 701f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1), 70209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 703f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu CustomElementFlag = 1 << 21, 704f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu CustomElementUpgradedFlag = 1 << 22, 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 706f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu HasNameOrIsEditingTextFlag = 1 << 23, 707f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu HasWeakReferencesFlag = 1 << 24, 708f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu V8CollectableDuringMinorGCFlag = 1 << 25, 709f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu HasSyntheticAttrChildNodesFlag = 1 << 26, 710f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu HasEventTargetDataFlag = 1 << 27, 711f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu AlreadySpellCheckedFlag = 1 << 28, 712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 713f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // HTML dir=auto. 714f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu SelfOrAncestorHasDirAutoFlag = 1 << 29, 715591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 71609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) DefaultNodeFlags = IsFinishedParsingChildrenFlag | ChildNeedsStyleRecalcFlag | NeedsReattachStyleChange 7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // 2 bits remaining. 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool getFlag(NodeFlags mask) const { return m_nodeFlags & mask; } 7225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void setFlag(bool f, NodeFlags mask) { m_nodeFlags = (m_nodeFlags & ~mask) | (-(int32_t)f & mask); } 7235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void setFlag(NodeFlags mask) { m_nodeFlags |= mask; } 7245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) void clearFlag(NodeFlags mask) { m_nodeFlags &= ~mask; } 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 72702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch enum ConstructionType { 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CreateOther = DefaultNodeFlags, 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CreateText = DefaultNodeFlags | IsTextFlag, 73002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch CreateContainer = DefaultNodeFlags | IsContainerFlag, 73102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch CreateElement = CreateContainer | IsElementFlag, 732521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CreateShadowRoot = CreateContainer | IsDocumentFragmentFlag | IsInShadowTreeFlag, 733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) CreateDocumentFragment = CreateContainer | IsDocumentFragmentFlag, 734e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch CreateHTMLElement = CreateElement | IsHTMLFlag, 735e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch CreateSVGElement = CreateElement | IsSVGFlag, 736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) CreateDocument = CreateContainer | InDocumentFlag, 737521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CreateInsertionPoint = CreateHTMLElement | IsInsertionPointFlag, 738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) CreateEditingText = CreateText | HasNameOrIsEditingTextFlag, 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 7405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 741f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Node(TreeScope*, ConstructionType); 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) virtual void didMoveToNewDocument(Document& oldDocument); 74402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 74551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) static void reattachWhitespaceSiblings(Text* start); 74651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 747f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 748f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) void willBeDeletedFromDocument(); 749f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 750f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasRareData() const { return getFlag(HasRareDataFlag); } 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeRareData* rareData() const; 754bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) NodeRareData& ensureRareData(); 755323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clearRareData(); 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clearEventTargetData(); 759f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setHasCustomStyleCallbacks() { setFlag(true, HasCustomStyleCallbacksFlag); } 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setTreeScope(TreeScope* scope) { m_treeScope = scope; } 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // isTreeScopeInitialized() can be false 76609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // - in the destruction of Document or ShadowRoot where m_treeScope is set to null or 76709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // - in the Node constructor called by these two classes where m_treeScope is set by TreeScope ctor. 76809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool isTreeScopeInitialized() const { return m_treeScope; } 76909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 77051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void markAncestorsWithChildNeedsStyleRecalc(); 77151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 77209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void setIsFinishedParsingChildren(bool value) { setFlag(value, IsFinishedParsingChildrenFlag); } 77309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 775926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) friend class TreeShared<Node>; 776f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu friend class WeakNodeMap; 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 778d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) unsigned styledSubtreeSize() const; 779d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 780323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 781926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void removedLastRef(); 782323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool hasTreeSharedParent() const { return !!parentOrShadowHostNode(); } 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum EditableLevel { Editable, RichlyEditable }; 786197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool hasEditableStyle(EditableLevel, UserSelectAllTreatment = UserSelectAllIsAlwaysNonEditable) const; 7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isEditableToAccessibility(EditableLevel) const; 7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isUserActionElementActive() const; 790926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isUserActionElementInActiveChain() const; 791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isUserActionElementHovered() const; 792926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isUserActionElementFocused() const; 793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 79409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void traceStyleChange(StyleChangeType); 79509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void traceStyleChangeIfNeeded(StyleChangeType); 7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setStyleChange(StyleChangeType); 7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual RenderStyle* nonRendererStyle() const { return 0; } 7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual RenderStyle* virtualComputedStyle(PseudoId = NOPSEUDO); 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void trackForDebugging(); 8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* mutationObserverRegistry(); 80510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >* transientMutationObserverRegistry(); 8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) uint32_t m_nodeFlags; 808323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RawPtrWillBeMember<ContainerNode> m_parentOrShadowHostNode; 809f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu RawPtrWillBeMember<TreeScope> m_treeScope; 810323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RawPtrWillBeMember<Node> m_previous; 811323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RawPtrWillBeMember<Node> m_next; 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When a node has rare data we move the renderer into the rare data. 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) union DataUnion { 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DataUnion() : m_renderer(0) { } 8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* m_renderer; 8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeRareDataBase* m_rareData; 8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } m_data; 8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline void Node::setParentOrShadowHostNode(ContainerNode* parent) 8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isMainThread()); 823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_parentOrShadowHostNode = parent; 8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline ContainerNode* Node::parentOrShadowHostNode() const 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 82853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(isMainThread()); 829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_parentOrShadowHostNode; 8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 832926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline ContainerNode* Node::parentNode() const 8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return isShadowRoot() ? 0 : parentOrShadowHostNode(); 8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline void Node::lazyReattachIfAttached() 8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (styleChangeType() == NeedsReattachStyleChange) 840df95704c49daea886ddad70775bda23618d6274dBen Murdoch return; 841f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!inActiveDocument()) 842f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return; 843df95704c49daea886ddad70775bda23618d6274dBen Murdoch 844591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch AttachContext context; 845591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch context.performingReattach = true; 846591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 847f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) detach(context); 84851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) markAncestorsWithChildNeedsStyleRecalc(); 8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)inline bool Node::shouldCallRecalcStyle(StyleRecalcChange change) 85281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 85309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return change >= Inherit || needsStyleRecalc() || childNeedsStyleRecalc(); 85481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 85581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 85651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline bool isTreeScopeRoot(const Node* node) 85751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 85851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return !node || node->isDocumentNode() || node->isShadowRoot(); 85951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 86051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 86151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline bool isTreeScopeRoot(const Node& node) 86251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 86351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return node.isDocumentNode() || node.isShadowRoot(); 86451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 86551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 8661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)// Allow equality comparisons of Nodes by reference or pointer, interchangeably. 867f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES_REFCOUNTED(Node) 8681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 8691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 8701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#define DEFINE_NODE_TYPE_CASTS(thisType, predicate) \ 871f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) template<typename T> inline thisType* to##thisType(const RefPtr<T>& node) { return to##thisType(node.get()); } \ 8721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) DEFINE_TYPE_CASTS(thisType, Node, node, node->predicate, node.predicate) 8731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 874f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)// This requires isClassName(const Node&). 875f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#define DEFINE_NODE_TYPE_CASTS_WITH_FUNCTION(thisType) \ 876f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) template<typename T> inline thisType* to##thisType(const RefPtr<T>& node) { return to##thisType(node.get()); } \ 877f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) DEFINE_TYPE_CASTS(thisType, Node, node, is##thisType(*node), is##thisType(node)) 878f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 8795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#define DECLARE_NODE_FACTORY(T) \ 8805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) static PassRefPtrWillBeRawPtr<T> create(Document&) 881d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#define DEFINE_NODE_FACTORY(T) \ 8825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)PassRefPtrWillBeRawPtr<T> T::create(Document& document) \ 8835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ \ 8845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return adoptRefWillBeNoop(new T(document)); \ 8855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 886d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 887c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Outside the WebCore namespace for ease of invocation from gdb. 891c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showNode(const blink::Node*); 892c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showTree(const blink::Node*); 893c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showNodePath(const blink::Node*); 8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif // Node_h 897