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)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptWrappable.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/EventTarget.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MutationObserver.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/SimulatedClickOptions.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScope.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/EditingBoundary.h"
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/inspector/InspectorCounters.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/TreeShared.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/LayoutRect.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyleConstants.h"
38521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "weborigin/KURLHash.h"
39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Forward.h"
40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/ListHashSet.h"
41e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/AtomicString.h"
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This needs to be here because Document.h also depends on it.
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DUMP_NODE_STATISTICS 0
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Attribute;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ClassNodeList;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ContainerNode;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DOMSettableTokenList;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Event;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EventContext;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EventDispatchMediator;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EventListener;
58df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FloatPoint;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Frame;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLInputElement;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IntRect;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class KeyboardEvent;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NSResolver;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NamedNodeMap;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NameNodeList;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeList;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeListsNodeData;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeRareData;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeRenderingContext;
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class PlatformGestureEvent;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformKeyboardEvent;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformMouseEvent;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformWheelEvent;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class QualifiedName;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RadioNodeList;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RegisteredEventListener;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderBox;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderBoxModelObject;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderStyle;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ShadowRoot;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TagNodeList;
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TouchEvent;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochconst int nodeStyleChangeShift = 14;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)enum StyleChangeType {
89e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    NoStyleChange = 0,
90e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    LocalStyleChange = 1 << nodeStyleChangeShift,
91e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    SubtreeStyleChange = 2 << nodeStyleChangeShift,
92df95704c49daea886ddad70775bda23618d6274dBen Murdoch    LazyAttachStyleChange = 3 << nodeStyleChangeShift,
93e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch};
94591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// If the style change is from the renderer then we'll call setStyle on the
96e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// renderer even if the style computed from CSS is identical.
97e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochenum StyleChangeSource {
98e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    StyleChangeFromCSS,
99e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    StyleChangeFromRenderer
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NodeRareDataBase {
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer() const { return m_renderer; }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setRenderer(RenderObject* renderer) { m_renderer = renderer; }
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    NodeRareDataBase(RenderObject* renderer)
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        : m_renderer(renderer)
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    { }
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* m_renderer;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)enum AttachBehavior {
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AttachNow,
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AttachLazily,
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class Node : public EventTarget, public ScriptWrappable, public TreeShared<Node> {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend class Document;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend class TreeScope;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend class TreeScopeAdopter;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum NodeType {
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ELEMENT_NODE = 1,
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ATTRIBUTE_NODE = 2,
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TEXT_NODE = 3,
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CDATA_SECTION_NODE = 4,
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ENTITY_NODE = 6,
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PROCESSING_INSTRUCTION_NODE = 7,
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        COMMENT_NODE = 8,
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_NODE = 9,
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_TYPE_NODE = 10,
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_FRAGMENT_NODE = 11,
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NOTATION_NODE = 12,
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        XPATH_NAMESPACE_NODE = 13,
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
14181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
14281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // EntityReference nodes are deprecated and impossible to create in WebKit.
14381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // We want Node.ENTITY_REFERNCE_NODE to exist in JS and this enum, makes the bindings
14481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // generation not complain about ENTITY_REFERENCE_NODE being missing from the implementation
14581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // while not requiring all switch(NodeType) blocks to include this deprecated constant.
14681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    enum DeprecatedNodeType {
14781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        ENTITY_REFERENCE_NODE = 5
14881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    };
14981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum DocumentPosition {
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_EQUIVALENT = 0x00,
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_DISCONNECTED = 0x01,
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_PRECEDING = 0x02,
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_FOLLOWING = 0x04,
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_CONTAINS = 0x08,
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_CONTAINED_BY = 0x10,
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20,
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // All Nodes are placed in their own heap partition for security.
1615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // See http://crbug.com/246860 for detail.
1625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void* operator new(size_t);
1635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void operator delete(void*);
1645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isSupported(const String& feature, const String& version);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static void dumpStatistics();
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    enum StyleChange { NoChange, NoInherit, Inherit, Detach, Force };
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static StyleChange diff(const RenderStyle*, const RenderStyle*, Document*);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~Node();
17253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void willBeDeletedFrom(Document*);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // DOM methods & attributes for Node
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasTagName(const QualifiedName&) const;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasLocalName(const AtomicString&) const;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String nodeName() const = 0;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String nodeValue() const;
180e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    virtual void setNodeValue(const String&);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual NodeType nodeType() const = 0;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* parentNode() const;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* parentElement() const;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* previousSibling() const { return m_previous; }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* nextSibling() const { return m_next; }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<NodeList> childNodes();
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* firstChild() const;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* lastChild() const;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasAttributes() const;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NamedNodeMap* attributes() const;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
192e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    // ChildNode interface API
193e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    Element* previousElementSibling() const;
194e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    Element* nextElementSibling() const;
195df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void remove(ExceptionState&);
196e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
19753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Node* pseudoAwareNextSibling() const;
19853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Node* pseudoAwarePreviousSibling() const;
19953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Node* pseudoAwareFirstChild() const;
20053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Node* pseudoAwareLastChild() const;
20153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual KURL baseURI() const;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These should all actually return a node, but this is only important for language bindings,
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // which will already know and hold a ref on the right node to return. Returning bool allows
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // these methods to be more efficient since they don't need to return a ref
207df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionState&, AttachBehavior = AttachNow);
208df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionState&, AttachBehavior = AttachNow);
209df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void removeChild(Node* child, ExceptionState&);
210df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void appendChild(PassRefPtr<Node> newChild, ExceptionState&, AttachBehavior = AttachNow);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasChildNodes() const { return firstChild(); }
213e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    virtual PassRefPtr<Node> cloneNode(bool deep = true) = 0;
21493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    virtual const AtomicString& localName() const;
21593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    virtual const AtomicString& namespaceURI() const;
21693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    virtual const AtomicString& prefix() const;
217df95704c49daea886ddad70775bda23618d6274dBen Murdoch    virtual void setPrefix(const AtomicString&, ExceptionState&);
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void normalize();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSameNode(Node* other) const { return this == other; }
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isEqualNode(Node*) const;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isDefaultNamespace(const AtomicString& namespaceURI) const;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String lookupPrefix(const AtomicString& namespaceURI) const;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String lookupNamespaceURI(const String& prefix) const;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String lookupNamespacePrefix(const AtomicString& namespaceURI, const Element* originalElement) const;
22602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String textContent(bool convertBRsToNewlines = false) const;
228df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setTextContent(const String&, ExceptionState&);
22902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* lastDescendant() const;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* firstDescendant() const;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Other methods (not part of DOM)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isElementNode() const { return getFlag(IsElementFlag); }
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isContainerNode() const { return getFlag(IsContainerFlag); }
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isTextNode() const { return getFlag(IsTextFlag); }
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isHTMLElement() const { return getFlag(IsHTMLFlag); }
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSVGElement() const { return getFlag(IsSVGFlag); }
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isPseudoElement() const { return pseudoId() != NOPSEUDO; }
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isBeforePseudoElement() const { return pseudoId() == BEFORE; }
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isAfterPseudoElement() const { return pseudoId() == AFTER; }
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PseudoId pseudoId() const { return (isElementNode() && hasCustomStyleCallbacks()) ? customPseudoId() : NOPSEUDO; }
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    enum CustomElementState {
2477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        NotCustomElement,
2487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        UpgradeCandidate,
2497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        Defined,
2507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        Upgraded
2517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    };
2527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    bool isCustomElement() const { return customElementState() != NotCustomElement; }
2537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    CustomElementState customElementState() const { return CustomElementState((getFlag(CustomElementHasDefinitionOrIsUpgraded) ? 2 : 0) | (getFlag(CustomElementIsUpgradeCandidateOrUpgraded) ? 1 : 0)); }
2547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    void setCustomElementState(CustomElementState newState);
25553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isMediaControlElement() const { return false; }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isMediaControls() const { return false; }
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool isWebVTTElement() const { return false; }
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isAttributeNode() const { return false; }
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isCharacterDataNode() const { return false; }
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isFrameOwnerElement() const { return false; }
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isPluginElement() const { return false; }
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
264e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // StyledElements allow inline style (style="border: 1px"), presentational attributes (ex. color),
265e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // class names (ex. class="foo bar") and other non-basic styling features. They and also control
266e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // if this element can participate in style sharing.
267e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    //
268e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // FIXME: The only things that ever go through StyleResolver that aren't StyledElements are
269e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // PseudoElements and WebVTTElements. It's possible we can just eliminate all the checks
270e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // since those elements will never have class names, inline style, or other things that
271e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // this apparently guards against.
272e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool isStyledElement() const { return isHTMLElement() || isSVGElement(); }
273e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isDocumentNode() const;
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isTreeScope() const { return treeScope()->rootNode() == this; }
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isDocumentFragment() const { return getFlag(IsDocumentFragmentFlag); }
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isShadowRoot() const { return isDocumentFragment() && isTreeScope(); }
278521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    bool isInsertionPoint() const { return getFlag(IsInsertionPointFlag); }
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inNamedFlow() const { return getFlag(InNamedFlowFlag); }
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool hasCustomStyleCallbacks() const { return getFlag(HasCustomStyleCallbacksFlag); }
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
283591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool isRegisteredWithNamedFlow() const;
284591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasSyntheticAttrChildNodes() const { return getFlag(HasSyntheticAttrChildNodesFlag); }
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasSyntheticAttrChildNodes(bool flag) { setFlag(flag, HasSyntheticAttrChildNodesFlag); }
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this node is in a shadow tree, returns its shadow host. Otherwise, returns 0.
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* shadowHost() const;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this node is in a shadow tree, returns its shadow host. Otherwise, returns this.
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Deprecated. Should use shadowHost() and check the return value.
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* deprecatedShadowAncestorNode() const;
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ShadowRoot* containingShadowRoot() const;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ShadowRoot* youngestShadowRoot() const;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns 0, a child of ShadowRoot, or a legacy shadow root.
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* nonBoundaryShadowTreeRootNode();
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Node's parent, shadow tree host.
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ContainerNode* parentOrShadowHostNode() const;
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Element* parentOrShadowHostElement() const;
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setParentOrShadowHostNode(ContainerNode*);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* highestAncestor() const;
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use when it's guaranteed to that shadowHost is 0.
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* parentNodeGuaranteedHostFree() const;
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns the parent node, but 0 if the parent node is a ShadowRoot.
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* nonShadowBoundaryParentNode() const;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool selfOrAncestorHasDirAutoAttribute() const { return getFlag(SelfOrAncestorHasDirAutoFlag); }
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelfOrAncestorHasDirAutoAttribute(bool flag) { setFlag(flag, SelfOrAncestorHasDirAutoFlag); }
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns the enclosing event parent node (or self) that, when clicked, would trigger a navigation.
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* enclosingLinkEventParentOrSelf();
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool isBlockFlowElement() const;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These low-level calls give the caller responsibility for maintaining the integrity of the tree.
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setPreviousSibling(Node* previous) { m_previous = previous; }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNextSibling(Node* next) { m_next = next; }
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool canContainRangeEndPoint() const { return false; }
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: These two functions belong in editing -- "atomic node" is an editing concept.
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* previousNodeConsideringAtomicNodes() const;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* nextNodeConsideringAtomicNodes() const;
32702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns the next leaf node or 0 if there are no more.
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes.
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Uses an editing-specific concept of what a leaf node is, and should probably be moved
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out of the Node class into an editing-specific source file.
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* nextLeafNode() const;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns the previous leaf node or 0 if there are no more.
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Delivers leaf nodes as if the whole DOM tree were a linear chain of its leaf nodes.
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Uses an editing-specific concept of what a leaf node is, and should probably be moved
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out of the Node class into an editing-specific source file.
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* previousLeafNode() const;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // enclosingBlockFlowElement() is deprecated. Use enclosingBlock instead.
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* enclosingBlockFlowElement() const;
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isRootEditableElement() const;
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* rootEditableElement() const;
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* rootEditableElement(EditableType) const;
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inSameContainingBlockFlowElement(Node*);
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Called by the parser when this element's close tag is reached,
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // signaling that all child tags have been parsed and added.
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is needed for <applet> and <object> elements, which can't lay themselves out
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // until they know all of their nested <param>s. [Radar 3603191, 4040848].
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Also used for script elements and some SVG elements for similar purposes,
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but making parsing a special case in this respect should be avoided if possible.
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void finishParsingChildren() { }
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void beginParsingChildren() { }
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For <link> and <style> elements.
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool sheetLoaded() { return true; }
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void notifyLoadedSheetAndAllCriticalSubresources(bool /* error loading subresource */) { }
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void startLoadingDynamicSheet() { ASSERT_NOT_REACHED(); }
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool hasName() const { return !isTextNode() && getFlag(HasNameOrIsEditingTextFlag); }
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasID() const;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasClass() const;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isUserActionElement() const { return getFlag(IsUserActionElement); }
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setUserActionElement(bool flag) { setFlag(flag, IsUserActionElement); }
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool active() const { return isUserActionElement() && isUserActionElementActive(); }
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool inActiveChain() const { return isUserActionElement() && isUserActionElementInActiveChain(); }
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); }
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool focused() const { return isUserActionElement() && isUserActionElementFocused(); }
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool attached() const { return getFlag(IsAttachedFlag); }
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setAttached() { setFlag(IsAttachedFlag); }
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool needsStyleRecalc() const { return styleChangeType() != NoStyleChange; }
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleChangeType styleChangeType() const { return static_cast<StyleChangeType>(m_nodeFlags & StyleChangeMask); }
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool childNeedsStyleRecalc() const { return getFlag(ChildNeedsStyleRecalcFlag); }
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isLink() const { return getFlag(IsLinkFlag); }
381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isEditingText() const { return isTextNode() && getFlag(HasNameOrIsEditingTextFlag); }
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setHasName(bool f) { ASSERT(!isTextNode()); setFlag(f, HasNameOrIsEditingTextFlag); }
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setChildNeedsStyleRecalc() { setFlag(ChildNeedsStyleRecalcFlag); }
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearChildNeedsStyleRecalc() { clearFlag(ChildNeedsStyleRecalcFlag); }
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
387e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    void setNeedsStyleRecalc(StyleChangeType = SubtreeStyleChange, StyleChangeSource = StyleChangeFromCSS);
388591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void clearNeedsStyleRecalc()
389591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
390591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_nodeFlags &= ~StyleChangeMask;
391e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        clearFlag(NotifyRendererWithIdenticalStyles);
392591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
393591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
394f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool childNeedsDistributionRecalc() const { return getFlag(ChildNeedsDistributionRecalc); }
395f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    void setChildNeedsDistributionRecalc()  { setFlag(ChildNeedsDistributionRecalc); }
396f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    void clearChildNeedsDistributionRecalc()  { clearFlag(ChildNeedsDistributionRecalc); }
397f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    void markAncestorsWithChildNeedsDistributionRecalc();
398f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
399f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    void recalcDistribution();
400f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
401e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool shouldNotifyRendererWithIdenticalStyles() const { return getFlag(NotifyRendererWithIdenticalStyles); }
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setIsLink(bool f) { setFlag(f, IsLinkFlag); }
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setIsLink() { setFlag(IsLinkFlag); }
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearIsLink() { clearFlag(IsLinkFlag); }
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setInNamedFlow() { setFlag(InNamedFlowFlag); }
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearInNamedFlow() { clearFlag(InNamedFlowFlag); }
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasScopedHTMLStyleChild() const { return getFlag(HasScopedHTMLStyleChildFlag); }
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasScopedHTMLStyleChild(bool flag) { setFlag(flag, HasScopedHTMLStyleChildFlag); }
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasEventTargetData() const { return getFlag(HasEventTargetDataFlag); }
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasEventTargetData(bool flag) { setFlag(flag, HasEventTargetDataFlag); }
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isV8CollectableDuringMinorGC() const { return getFlag(V8CollectableDuringMinorGCFlag); }
417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setV8CollectableDuringMinorGC(bool flag) { setFlag(flag, V8CollectableDuringMinorGCFlag); }
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    enum ShouldSetAttached {
4205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        SetAttached,
4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        DoNotSetAttached
4225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    };
4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void lazyAttach(ShouldSetAttached = SetAttached);
4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void lazyReattach(ShouldSetAttached = SetAttached);
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setFocus(bool flag);
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setActive(bool flag = true, bool pause = false);
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setHovered(bool flag = true);
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual short tabIndex() const;
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual Node* focusDelegate();
433591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // This is called only when the node is focused.
434591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    virtual bool shouldHaveFocusAppearance() const;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum UserSelectAllTreatment {
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UserSelectAllDoesNotAffectEditability,
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UserSelectAllIsAlwaysNonEditable
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isContentEditable(UserSelectAllTreatment = UserSelectAllDoesNotAffectEditability);
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isContentRichlyEditable();
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool rendererIsEditable(EditableType editableType = ContentIsEditable, UserSelectAllTreatment treatment = UserSelectAllIsAlwaysNonEditable) const
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (editableType) {
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ContentIsEditable:
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return rendererIsEditable(Editable, treatment);
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case HasEditableAXRole:
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isEditableToAccessibility(Editable);
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool rendererIsRichlyEditable(EditableType editableType = ContentIsEditable) const
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (editableType) {
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ContentIsEditable:
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return rendererIsEditable(RichlyEditable, UserSelectAllIsAlwaysNonEditable);
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case HasEditableAXRole:
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isEditableToAccessibility(RichlyEditable);
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool shouldUseInputMethod();
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual LayoutRect boundingBox() const;
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect pixelSnappedBoundingBox() const { return pixelSnappedIntRect(boundingBox()); }
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect renderRect(bool* isReplaced);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect pixelSnappedRenderRect(bool* isReplaced) { return pixelSnappedIntRect(renderRect(isReplaced)); }
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns true if the node has a non-empty bounding box in layout.
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This does not 100% guarantee the user can see it, but is pretty close.
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Note: This method only works properly after layout has occurred.
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasNonEmptyBoundingBox() const;
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned nodeIndex() const;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // Returns the DOM ownerDocument attribute. This method never returns NULL, except in the case
48102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // of (1) a Document node or (2) a DocumentType node that is not used with any Document yet.
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* ownerDocument() const;
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // Returns the document associated with this node. This method never returns NULL, except in the case
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // of a DocumentType node that is not used with any Document yet. A Document node returns itself.
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document() const
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(this);
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: below ASSERT is useful, but prevents the use of document() in the constructor or destructor
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // due to the virtual function call to nodeType().
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(documentInternal() || (nodeType() == DOCUMENT_TYPE_NODE && !inDocument()));
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return documentInternal();
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TreeScope* treeScope() const { return m_treeScope; }
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns true if this node is associated with a document and is in its associated document's
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // node tree, false otherwise.
49902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    bool inDocument() const
50002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(documentInternal() || !getFlag(InDocumentFlag));
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getFlag(InDocumentFlag);
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isInShadowTree() const { return getFlag(IsInShadowTreeFlag); }
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isInTreeScope() const { return getFlag(static_cast<NodeFlags>(InDocumentFlag | IsInShadowTreeFlag)); }
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isDocumentTypeNode() const { return nodeType() == DOCUMENT_TYPE_NODE; }
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool childTypeAllowed(NodeType) const { return false; }
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned childNodeCount() const;
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* childNode(unsigned index) const;
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
512df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void checkSetPrefix(const AtomicString& prefix, ExceptionState&);
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isDescendantOf(const Node*) const;
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool contains(const Node*) const;
515926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool containsIncludingShadowDOM(const Node*) const;
516926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool containsIncludingHostElements(const Node*) const;
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
518f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // FIXME: Remove this when crbug.com/265716 cleans up contains semantics.
519f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool bindingsContains(const Node* node) const { return containsIncludingShadowDOM(node); }
520f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to determine whether range offsets use characters or node indices.
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool offsetInCharacters() const;
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Number of DOM 16-bit units contained in node. Note that rendered text length can be different - e.g. because of
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // css-transform:capitalize breaking up precomposed characters and ligatures.
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int maxCharacterOffset() const;
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Whether or not a selection can be started in this object
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool canStartSelection() const;
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Getting points into and out of screen space
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint convertToPage(const FloatPoint&) const;
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint convertFromPage(const FloatPoint&) const;
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // -----------------------------------------------------------------------------
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Integration with rendering tree
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // As renderer() includes a branch you should avoid calling it repeatedly in hot code paths.
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer() const { return hasRareData() ? m_data.m_rareData->renderer() : m_data.m_renderer; };
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setRenderer(RenderObject* renderer)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hasRareData())
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_data.m_rareData->setRenderer(renderer);
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_data.m_renderer = renderer;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use these two methods with caution.
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBox* renderBox() const;
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBoxModelObject* renderBoxModelObject() const;
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
551521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    struct AttachContext {
552521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        RenderStyle* resolvedStyle;
553521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        bool performingReattach;
554521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
555521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        AttachContext() : resolvedStyle(0), performingReattach(false) { }
556521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    };
557521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Attaches this node to the rendering tree. This calculates the style to be applied to the node and creates an
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // appropriate RenderObject which will be inserted into the tree (except when the style has display: none). This
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // makes the node visible in the FrameView.
561521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    virtual void attach(const AttachContext& = AttachContext());
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Detaches the node from the rendering tree, making it invisible in the rendered view. This method will remove
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the node's rendering object from the rendering tree and delete it.
565521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    virtual void detach(const AttachContext& = AttachContext());
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inDetach() const;
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
571521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    void reattach(const AttachContext& = AttachContext());
57293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void lazyReattachIfAttached();
573e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Wrapper for nodes that don't have a renderer, but still cache the style (like HTMLOptionElement).
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* renderStyle() const;
57683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    RenderStyle* parentRenderStyle() const;
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* computedStyle(PseudoId pseudoElementSpecifier = NOPSEUDO) { return virtualComputedStyle(pseudoElementSpecifier); }
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // -----------------------------------------------------------------------------
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Notification of document structure changes (see ContainerNode.h for more notification methods)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // At first, WebKit notifies the node that it has been inserted into the document. This is called during document parsing, and also
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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.
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is similar to the DOMNodeInsertedIntoDocument DOM event, but does not require the overhead of event
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // dispatching.
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // WebKit notifies this callback regardless if the subtree of the node is a document tree or a floating subtree.
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implementation can determine the type of subtree by seeing insertionPoint->inDocument().
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For a performance reason, notifications are delivered only to ContainerNode subclasses if the insertionPoint is out of document.
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There are another callback named didNotifyDescendantInsertions(), which is called after all the descendant is notified.
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only a few subclasses actually need this. To utilize this, the node should return InsertionShouldCallDidNotifyDescendantInsertions
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from insrtedInto().
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum InsertionNotificationRequest {
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InsertionDone,
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InsertionShouldCallDidNotifySubtreeInsertions
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual InsertionNotificationRequest insertedInto(ContainerNode* insertionPoint);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void didNotifySubtreeInsertions(ContainerNode*) { }
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Notifies the node that it is no longer part of the tree.
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is a dual of insertedInto(), and is similar to the DOMNodeRemovedFromDocument DOM event, but does not require the overhead of event
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // dispatching, and is called _after_ the node is removed from the tree.
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void removedFrom(ContainerNode* insertionPoint);
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
61253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    String debugName() const;
61353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void formatForDebugger(char* buffer, unsigned length) const;
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void showNode(const char* prefix = "") const;
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void showTreeForThis() const;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void showNodePathForThis() const;
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2 = 0, const char* markedLabel2 = 0) const;
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void showTreeForThisAcrossFrame() const;
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateNodeListCachesInAncestors(const QualifiedName* attrName = 0, Element* attributeOwnerElement = 0);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NodeListsNodeData* nodeLists();
625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void clearNodeLists();
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<NodeList> getElementsByTagName(const AtomicString&);
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<NodeList> getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName);
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<NodeList> getElementsByName(const String& elementName);
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<NodeList> getElementsByClassName(const String& classNames);
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<RadioNodeList> radioNodeList(const AtomicString&);
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool willRespondToMouseMoveEvents();
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool willRespondToMouseClickEvents();
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool willRespondToTouchEvents();
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
637df95704c49daea886ddad70775bda23618d6274dBen Murdoch    PassRefPtr<Element> querySelector(const AtomicString& selectors, ExceptionState&);
638df95704c49daea886ddad70775bda23618d6274dBen Murdoch    PassRefPtr<NodeList> querySelectorAll(const AtomicString& selectors, ExceptionState&);
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    unsigned short compareDocumentPosition(const Node*) const;
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    enum ShadowTreesTreatment {
64353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        TreatShadowTreesAsDisconnected,
64453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        TreatShadowTreesAsComposed
64553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    };
64653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    unsigned short compareDocumentPositionInternal(const Node*, ShadowTreesTreatment) const;
64853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual Node* toNode();
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual const AtomicString& interfaceName() const;
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ScriptExecutionContext* scriptExecutionContext() const;
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Handlers to do/undo actions on the target node before an event is dispatched to it and after the event
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // has been dispatched.  The data pointer is handed back by the preDispatch and passed to postDispatch.
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void* preDispatchEventHandler(Event*) { return 0; }
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void postDispatchEventHandler(Event*, void* /*dataFromPreDispatch*/) { }
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    using EventTarget::dispatchEvent;
663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool dispatchEvent(PassRefPtr<Event>) OVERRIDE;
664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void dispatchScopedEvent(PassRefPtr<Event>);
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void dispatchScopedEventDispatchMediator(PassRefPtr<EventDispatchMediator>);
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void handleLocalEvents(Event*);
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void dispatchSubtreeModifiedEvent();
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent);
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool dispatchKeyEvent(const PlatformKeyboardEvent&);
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool dispatchWheelEvent(const PlatformWheelEvent&);
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Node* relatedTarget = 0);
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool dispatchGestureEvent(const PlatformGestureEvent&);
677926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool dispatchTouchEvent(PassRefPtr<TouchEvent>);
678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEventOptions = SendNoEvents, SimulatedClickVisualOptions = ShowPressedLook);
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool dispatchBeforeLoadEvent(const String& sourceURL);
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void dispatchChangeEvent();
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void dispatchInputEvent();
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Perform the default action for an event.
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void defaultEventHandler(Event*);
687591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    virtual void willCallDefaultEventHandler(const Event&);
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    using TreeShared<Node>::ref;
690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    using TreeShared<Node>::deref;
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual EventTargetData* eventTargetData();
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual EventTargetData* ensureEventTargetData();
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void getRegisteredMutationObserversOfType(HashMap<MutationObserver*, MutationRecordDeliveryOptions>&, MutationObserver::MutationType, const QualifiedName* attributeName);
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void registerMutationObserver(MutationObserver*, MutationObserverOptions, const HashSet<AtomicString>& attributeFilter);
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void unregisterMutationObserver(MutationObserverRegistration*);
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void registerTransientMutationObserver(MutationObserverRegistration*);
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void unregisterTransientMutationObserver(MutationObserverRegistration*);
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void notifyMutationObserversNodeWillDetach();
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void registerScopedHTMLStyleChild();
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void unregisterScopedHTMLStyleChild();
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t numberOfScopedHTMLStyleChildren() const;
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void textRects(Vector<IntRect>&) const;
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned connectedSubframeCount() const;
709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void incrementConnectedSubframeCount(unsigned amount = 1);
710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void decrementConnectedSubframeCount(unsigned amount = 1);
711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void updateAncestorConnectedSubframeCountForRemoval() const;
712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void updateAncestorConnectedSubframeCountForInsertion() const;
713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
714e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    PassRefPtr<NodeList> getDestinationInsertionPoints();
715e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum NodeFlags {
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IsTextFlag = 1,
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IsContainerFlag = 1 << 1,
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IsElementFlag = 1 << 2,
721e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsHTMLFlag = 1 << 3,
722e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsSVGFlag = 1 << 4,
723e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsAttachedFlag = 1 << 5,
724e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        ChildNeedsStyleRecalcFlag = 1 << 6,
725e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        InDocumentFlag = 1 << 7,
726e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsLinkFlag = 1 << 8,
727e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsUserActionElement = 1 << 9,
728e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasRareDataFlag = 1 << 10,
729e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsDocumentFragmentFlag = 1 << 11,
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // These bits are used by derived classes, pulled up here so they can
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // be stored in the same memory word as the Node bits above.
733e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsParsingChildrenFinishedFlag = 1 << 12, // Element
734e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasSVGRareDataFlag = 1 << 13, // SVGElement
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1),
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
738e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        SelfOrAncestorHasDirAutoFlag = 1 << 16,
739e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
740e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasNameOrIsEditingTextFlag = 1 << 17,
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
742e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        InNamedFlowFlag = 1 << 18,
743e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasSyntheticAttrChildNodesFlag = 1 << 19,
744e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasCustomStyleCallbacksFlag = 1 << 20,
745e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasScopedHTMLStyleChildFlag = 1 << 21,
746e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        HasEventTargetDataFlag = 1 << 22,
747e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        V8CollectableDuringMinorGCFlag = 1 << 23,
748e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsInsertionPointFlag = 1 << 24,
749e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        IsInShadowTreeFlag = 1 << 25,
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        NotifyRendererWithIdenticalStyles = 1 << 26,
752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        CustomElementIsUpgradeCandidateOrUpgraded = 1 << 27,
7547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        CustomElementHasDefinitionOrIsUpgraded = 1 << 28,
755591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
756f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        ChildNeedsDistributionRecalc = 1 << 29,
757f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        DefaultNodeFlags = IsParsingChildrenFinishedFlag
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
761f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // 2 bits remaining
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool getFlag(NodeFlags mask) const { return m_nodeFlags & mask; }
76402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    void setFlag(bool f, NodeFlags mask) const { m_nodeFlags = (m_nodeFlags & ~mask) | (-(int32_t)f & mask); }
76502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    void setFlag(NodeFlags mask) const { m_nodeFlags |= mask; }
76602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    void clearFlag(NodeFlags mask) const { m_nodeFlags &= ~mask; }
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
76902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    enum ConstructionType {
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CreateOther = DefaultNodeFlags,
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CreateText = DefaultNodeFlags | IsTextFlag,
77202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        CreateContainer = DefaultNodeFlags | IsContainerFlag,
77302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        CreateElement = CreateContainer | IsElementFlag,
774521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        CreatePseudoElement =  CreateElement | InDocumentFlag,
775521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        CreateShadowRoot = CreateContainer | IsDocumentFragmentFlag | IsInShadowTreeFlag,
776926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        CreateDocumentFragment = CreateContainer | IsDocumentFragmentFlag,
777e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CreateHTMLElement = CreateElement | IsHTMLFlag,
778e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CreateSVGElement = CreateElement | IsSVGFlag,
779926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        CreateDocument = CreateContainer | InDocumentFlag,
780521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        CreateInsertionPoint = CreateHTMLElement | IsInsertionPointFlag,
781926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        CreateEditingText = CreateText | HasNameOrIsEditingTextFlag,
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
7835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
7845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Node(TreeScope* treeScope, ConstructionType type)
7855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        : m_nodeFlags(type)
7865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        , m_parentOrShadowHostNode(0)
7875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        , m_treeScope(treeScope)
7885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        , m_previous(0)
7895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        , m_next(0)
7905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
7915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        ScriptWrappable::init(this);
7925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (!m_treeScope)
7935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            m_treeScope = TreeScope::noDocumentInstance();
7945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        m_treeScope->guardRef();
7955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
7965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#if !defined(NDEBUG) || (defined(DUMP_NODE_STATISTICS) && DUMP_NODE_STATISTICS)
7975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        trackForDebugging();
7985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#endif
7995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        InspectorCounters::incrementCounter(InspectorCounters::NodeCounter);
8005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void didMoveToNewDocument(Document* oldDocument);
80302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const { }
805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasRareData() const { return getFlag(HasRareDataFlag); }
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NodeRareData* rareData() const;
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NodeRareData* ensureRareData();
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearRareData();
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearEventTargetData();
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setHasCustomStyleCallbacks() { setFlag(true, HasCustomStyleCallbacksFlag); }
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
816926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Document* documentInternal() const { return treeScope()->documentScope(); }
817926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setTreeScope(TreeScope* scope) { m_treeScope = scope; }
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    friend class TreeShared<Node>;
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual PseudoId customPseudoId() const
823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
824926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(hasCustomStyleCallbacks());
825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return NOPSEUDO;
826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void removedLastRef();
829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool hasTreeSharedParent() const { return !!parentOrShadowHostNode(); }
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum EditableLevel { Editable, RichlyEditable };
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool rendererIsEditable(EditableLevel, UserSelectAllTreatment = UserSelectAllIsAlwaysNonEditable) const;
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isEditableToAccessibility(EditableLevel) const;
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isUserActionElementActive() const;
836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isUserActionElementInActiveChain() const;
837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isUserActionElementHovered() const;
838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isUserActionElementFocused() const;
839926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStyleChange(StyleChangeType);
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to share code between lazyAttach and setNeedsStyleRecalc.
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void markAncestorsWithChildNeedsStyleRecalc();
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void refEventTarget();
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void derefEventTarget();
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderStyle* nonRendererStyle() const { return 0; }
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderStyle* virtualComputedStyle(PseudoId = NOPSEUDO);
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* ancestorElement() const;
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void trackForDebugging();
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<OwnPtr<MutationObserverRegistration> >* mutationObserverRegistry();
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<MutationObserverRegistration*>* transientMutationObserverRegistry();
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable uint32_t m_nodeFlags;
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ContainerNode* m_parentOrShadowHostNode;
861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TreeScope* m_treeScope;
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* m_previous;
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* m_next;
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // When a node has rare data we move the renderer into the rare data.
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    union DataUnion {
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DataUnion() : m_renderer(0) { }
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* m_renderer;
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeRareDataBase* m_rareData;
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } m_data;
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isParsingChildrenFinished() const { return getFlag(IsParsingChildrenFinishedFlag); }
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setIsParsingChildrenFinished() { setFlag(IsParsingChildrenFinishedFlag); }
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearIsParsingChildrenFinished() { clearFlag(IsParsingChildrenFinishedFlag); }
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasSVGRareData() const { return getFlag(HasSVGRareDataFlag); }
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasSVGRareData() { setFlag(HasSVGRareDataFlag); }
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearHasSVGRareData() { clearFlag(HasSVGRareDataFlag); }
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Used in Node::addSubresourceAttributeURLs() and in addSubresourceStyleURLs()
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void addSubresourceURL(ListHashSet<KURL>& urls, const KURL& url)
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!url.isNull())
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        urls.add(url);
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
888926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline void Node::setParentOrShadowHostNode(ContainerNode* parent)
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
890926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isMainThread());
891926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_parentOrShadowHostNode = parent;
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline ContainerNode* Node::parentOrShadowHostNode() const
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
89653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(isMainThread());
897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_parentOrShadowHostNode;
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline ContainerNode* Node::parentNode() const
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
902926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return isShadowRoot() ? 0 : parentOrShadowHostNode();
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline ContainerNode* Node::parentNodeGuaranteedHostFree() const
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
907926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!isShadowRoot());
908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return parentOrShadowHostNode();
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline void Node::lazyReattachIfAttached()
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attached())
91493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        lazyReattach();
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)inline void Node::lazyReattach(ShouldSetAttached shouldSetAttached)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
919df95704c49daea886ddad70775bda23618d6274dBen Murdoch    if (styleChangeType() == LazyAttachStyleChange)
920df95704c49daea886ddad70775bda23618d6274dBen Murdoch        return;
921df95704c49daea886ddad70775bda23618d6274dBen Murdoch
922591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    AttachContext context;
923591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    context.performingReattach = true;
924591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attached())
926591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        detach(context);
9275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    lazyAttach(shouldSetAttached);
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93083750176c3ee2cea66c8a9751271026a5901be3aBen Murdochinline bool shouldRecalcStyle(Node::StyleChange change, const Node* node)
93181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
93281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    return change >= Node::Inherit || node->childNeedsStyleRecalc() || node->needsStyleRecalc();
93381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
93481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} //namespace
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Outside the WebCore namespace for ease of invocation from gdb.
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::Node*);
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showNodePath(const WebCore::Node*);
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
944