| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights
reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights
reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 return s_count; | 69 return s_count; |
| 70 } | 70 } |
| 71 #endif | 71 #endif |
| 72 | 72 |
| 73 private: | 73 private: |
| 74 #ifndef NDEBUG | 74 #ifndef NDEBUG |
| 75 static unsigned s_count; | 75 static unsigned s_count; |
| 76 #endif | 76 #endif |
| 77 }; | 77 }; |
| 78 | 78 |
| 79 enum DynamicRestyleFlags { |
| 80 ChildrenAffectedByFocus = 1 << 0, |
| 81 ChildrenAffectedByHover = 1 << 1, |
| 82 ChildrenAffectedByActive = 1 << 2, |
| 83 ChildrenAffectedByDrag = 1 << 3, |
| 84 ChildrenAffectedByFirstChildRules = 1 << 4, |
| 85 ChildrenAffectedByLastChildRules = 1 << 5, |
| 86 ChildrenAffectedByDirectAdjacentRules = 1 << 6, |
| 87 ChildrenAffectedByIndirectAdjacentRules = 1 << 7, |
| 88 ChildrenAffectedByForwardPositionalRules = 1 << 8, |
| 89 ChildrenAffectedByBackwardPositionalRules = 1 << 9, |
| 90 |
| 91 NumberOfDynamicRestyleFlags = 10, |
| 92 }; |
| 93 |
| 79 class ContainerNode : public Node { | 94 class ContainerNode : public Node { |
| 80 public: | 95 public: |
| 81 virtual ~ContainerNode(); | 96 virtual ~ContainerNode(); |
| 82 | 97 |
| 83 Node* firstChild() const { return m_firstChild; } | 98 Node* firstChild() const { return m_firstChild; } |
| 84 Node* lastChild() const { return m_lastChild; } | 99 Node* lastChild() const { return m_lastChild; } |
| 85 bool hasChildren() const { return m_firstChild; } | 100 bool hasChildren() const { return m_firstChild; } |
| 86 | 101 |
| 87 bool hasOneChild() const { return m_firstChild && !m_firstChild->nextSibling
(); } | 102 bool hasOneChild() const { return m_firstChild && !m_firstChild->nextSibling
(); } |
| 88 bool hasOneTextChild() const { return hasOneChild() && m_firstChild->isTextN
ode(); } | 103 bool hasOneTextChild() const { return hasOneChild() && m_firstChild->isTextN
ode(); } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 void cloneChildNodes(ContainerNode* clone); | 135 void cloneChildNodes(ContainerNode* clone); |
| 121 | 136 |
| 122 virtual void attach(const AttachContext& = AttachContext()) OVERRIDE; | 137 virtual void attach(const AttachContext& = AttachContext()) OVERRIDE; |
| 123 virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; | 138 virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; |
| 124 virtual LayoutRect boundingBox() const OVERRIDE FINAL; | 139 virtual LayoutRect boundingBox() const OVERRIDE FINAL; |
| 125 virtual void setFocus(bool) OVERRIDE; | 140 virtual void setFocus(bool) OVERRIDE; |
| 126 void focusStateChanged(); | 141 void focusStateChanged(); |
| 127 virtual void setActive(bool = true) OVERRIDE; | 142 virtual void setActive(bool = true) OVERRIDE; |
| 128 virtual void setHovered(bool = true) OVERRIDE; | 143 virtual void setHovered(bool = true) OVERRIDE; |
| 129 | 144 |
| 145 bool childrenAffectedByFocus() const { return hasRestyleFlag(ChildrenAffecte
dByFocus); } |
| 146 void setChildrenAffectedByFocus() { setRestyleFlag(ChildrenAffectedByFocus);
} |
| 147 |
| 148 bool childrenAffectedByHover() const { return hasRestyleFlag(ChildrenAffecte
dByHover); } |
| 149 void setChildrenAffectedByHover() { setRestyleFlag(ChildrenAffectedByHover);
} |
| 150 |
| 151 bool childrenAffectedByActive() const { return hasRestyleFlag(ChildrenAffect
edByActive); } |
| 152 void setChildrenAffectedByActive() { setRestyleFlag(ChildrenAffectedByActive
); } |
| 153 |
| 154 bool childrenAffectedByDrag() const { return hasRestyleFlag(ChildrenAffected
ByDrag); } |
| 155 void setChildrenAffectedByDrag() { setRestyleFlag(ChildrenAffectedByDrag); } |
| 156 |
| 157 bool childrenAffectedByPositionalRules() const { return hasRestyleFlag(Child
renAffectedByForwardPositionalRules) || hasRestyleFlag(ChildrenAffectedByBackwar
dPositionalRules); } |
| 158 |
| 159 bool childrenAffectedByFirstChildRules() const { return hasRestyleFlag(Child
renAffectedByFirstChildRules); } |
| 160 void setChildrenAffectedByFirstChildRules() { setRestyleFlag(ChildrenAffecte
dByFirstChildRules); } |
| 161 |
| 162 bool childrenAffectedByLastChildRules() const { return hasRestyleFlag(Childr
enAffectedByLastChildRules); } |
| 163 void setChildrenAffectedByLastChildRules() { setRestyleFlag(ChildrenAffected
ByLastChildRules); } |
| 164 |
| 165 bool childrenAffectedByDirectAdjacentRules() const { return hasRestyleFlag(C
hildrenAffectedByDirectAdjacentRules); } |
| 166 void setChildrenAffectedByDirectAdjacentRules() { setRestyleFlag(ChildrenAff
ectedByDirectAdjacentRules); } |
| 167 |
| 168 bool childrenAffectedByIndirectAdjacentRules() const { return hasRestyleFlag
(ChildrenAffectedByIndirectAdjacentRules); } |
| 169 void setChildrenAffectedByIndirectAdjacentRules() { setRestyleFlag(ChildrenA
ffectedByIndirectAdjacentRules); } |
| 170 |
| 171 bool childrenAffectedByForwardPositionalRules() const { return hasRestyleFla
g(ChildrenAffectedByForwardPositionalRules); } |
| 172 void setChildrenAffectedByForwardPositionalRules() { setRestyleFlag(Children
AffectedByForwardPositionalRules); } |
| 173 |
| 174 bool childrenAffectedByBackwardPositionalRules() const { return hasRestyleFl
ag(ChildrenAffectedByBackwardPositionalRules); } |
| 175 void setChildrenAffectedByBackwardPositionalRules() { setRestyleFlag(Childre
nAffectedByBackwardPositionalRules); } |
| 176 |
| 177 void checkForChildrenAdjacentRuleChanges(); |
| 178 |
| 179 bool childrenSupportStyleSharing() const { return !hasRestyleFlags(); } |
| 180 |
| 130 // -------------------------------------------------------------------------
---- | 181 // -------------------------------------------------------------------------
---- |
| 131 // Notification of document structure changes (see core/dom/Node.h for more
notification methods) | 182 // Notification of document structure changes (see core/dom/Node.h for more
notification methods) |
| 132 | 183 |
| 133 // Notifies the node that it's list of children have changed (either by addi
ng or removing child nodes), or a child | 184 // Notifies the node that it's list of children have changed (either by addi
ng or removing child nodes), or a child |
| 134 // node that is of the type CDATA_SECTION_NODE, TEXT_NODE or COMMENT_NODE ha
s changed its value. | 185 // node that is of the type CDATA_SECTION_NODE, TEXT_NODE or COMMENT_NODE ha
s changed its value. |
| 135 virtual void childrenChanged(bool createdByParser = false, Node* beforeChang
e = 0, Node* afterChange = 0, int childCountDelta = 0); | 186 virtual void childrenChanged(bool createdByParser = false, Node* beforeChang
e = 0, Node* afterChange = 0, int childCountDelta = 0); |
| 136 | 187 |
| 137 void disconnectDescendantFrames(); | 188 void disconnectDescendantFrames(); |
| 138 | 189 |
| 139 protected: | 190 protected: |
| 140 ContainerNode(TreeScope*, ConstructionType = CreateContainer); | 191 ContainerNode(TreeScope*, ConstructionType = CreateContainer); |
| 141 | 192 |
| 142 template<class GenericNode, class GenericNodeContainer> | 193 template<class GenericNode, class GenericNodeContainer> |
| 143 friend void appendChildToContainer(GenericNode& child, GenericNodeContainer&
); | 194 friend void appendChildToContainer(GenericNode& child, GenericNodeContainer&
); |
| 144 | 195 |
| 145 template<class GenericNode, class GenericNodeContainer> | 196 template<class GenericNode, class GenericNodeContainer> |
| 146 friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, Generi
cNode*& tail, GenericNodeContainer&); | 197 friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, Generi
cNode*& tail, GenericNodeContainer&); |
| 147 | 198 |
| 148 void removeDetachedChildren(); | 199 void removeDetachedChildren(); |
| 149 void setFirstChild(Node* child) { m_firstChild = child; } | 200 void setFirstChild(Node* child) { m_firstChild = child; } |
| 150 void setLastChild(Node* child) { m_lastChild = child; } | 201 void setLastChild(Node* child) { m_lastChild = child; } |
| 151 | 202 |
| 152 private: | 203 private: |
| 153 void removeBetween(Node* previousChild, Node* nextChild, Node& oldChild); | 204 void removeBetween(Node* previousChild, Node* nextChild, Node& oldChild); |
| 154 void insertBeforeCommon(Node& nextChild, Node& oldChild); | 205 void insertBeforeCommon(Node& nextChild, Node& oldChild); |
| 155 void updateTreeAfterInsertion(Node& child); | 206 void updateTreeAfterInsertion(Node& child); |
| 156 void willRemoveChildren(); | 207 void willRemoveChildren(); |
| 157 void willRemoveChild(Node& child); | 208 void willRemoveChild(Node& child); |
| 158 | 209 |
| 210 bool hasRestyleFlag(DynamicRestyleFlags mask) const { return hasRareData() &
& hasRestyleFlagInternal(mask); } |
| 211 bool hasRestyleFlags() const { return hasRareData() && hasRestyleFlagsIntern
al(); } |
| 212 void setRestyleFlag(DynamicRestyleFlags); |
| 213 bool hasRestyleFlagInternal(DynamicRestyleFlags) const; |
| 214 bool hasRestyleFlagsInternal() const; |
| 215 |
| 159 inline bool checkAcceptChildGuaranteedNodeTypes(const Node& newChild, Except
ionState&) const; | 216 inline bool checkAcceptChildGuaranteedNodeTypes(const Node& newChild, Except
ionState&) const; |
| 160 inline bool checkAcceptChild(const Node* newChild, const Node* oldChild, Exc
eptionState&) const; | 217 inline bool checkAcceptChild(const Node* newChild, const Node* oldChild, Exc
eptionState&) const; |
| 161 inline bool containsConsideringHostElements(const Node&) const; | 218 inline bool containsConsideringHostElements(const Node&) const; |
| 162 inline bool isChildTypeAllowed(const Node& child) const; | 219 inline bool isChildTypeAllowed(const Node& child) const; |
| 163 | 220 |
| 164 void attachChildren(const AttachContext& = AttachContext()); | 221 void attachChildren(const AttachContext& = AttachContext()); |
| 165 void detachChildren(const AttachContext& = AttachContext()); | 222 void detachChildren(const AttachContext& = AttachContext()); |
| 166 | 223 |
| 167 bool getUpperLeftCorner(FloatPoint&) const; | 224 bool getUpperLeftCorner(FloatPoint&) const; |
| 168 bool getLowerRightCorner(FloatPoint&) const; | 225 bool getLowerRightCorner(FloatPoint&) const; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 | 302 |
| 246 inline Node& Node::highestAncestor() const | 303 inline Node& Node::highestAncestor() const |
| 247 { | 304 { |
| 248 Node* node = const_cast<Node*>(this); | 305 Node* node = const_cast<Node*>(this); |
| 249 Node* highest = node; | 306 Node* highest = node; |
| 250 for (; node; node = node->parentNode()) | 307 for (; node; node = node->parentNode()) |
| 251 highest = node; | 308 highest = node; |
| 252 return *highest; | 309 return *highest; |
| 253 } | 310 } |
| 254 | 311 |
| 255 inline Node* Node::parentElementOrShadowRoot() const | 312 inline ContainerNode* Node::parentElementOrShadowRoot() const |
| 256 { | 313 { |
| 257 ContainerNode* parent = parentNode(); | 314 ContainerNode* parent = parentNode(); |
| 258 return parent && (parent->isElementNode() || parent->isShadowRoot()) ? paren
t : 0; | 315 return parent && (parent->isElementNode() || parent->isShadowRoot()) ? paren
t : 0; |
| 259 } | 316 } |
| 260 | 317 |
| 261 // This constant controls how much buffer is initially allocated | 318 // This constant controls how much buffer is initially allocated |
| 262 // for a Node Vector that is used to store child Nodes of a given Node. | 319 // for a Node Vector that is used to store child Nodes of a given Node. |
| 263 // FIXME: Optimize the value. | 320 // FIXME: Optimize the value. |
| 264 const int initialNodeVectorSize = 11; | 321 const int initialNodeVectorSize = 11; |
| 265 typedef Vector<RefPtr<Node>, initialNodeVectorSize> NodeVector; | 322 typedef Vector<RefPtr<Node>, initialNodeVectorSize> NodeVector; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 | 389 |
| 333 RefPtr<Node> m_currentNode; | 390 RefPtr<Node> m_currentNode; |
| 334 unsigned m_currentIndex; | 391 unsigned m_currentIndex; |
| 335 OwnPtr<Vector<RefPtr<Node> > > m_childNodes; // Lazily instantiated. | 392 OwnPtr<Vector<RefPtr<Node> > > m_childNodes; // Lazily instantiated. |
| 336 ChildNodesLazySnapshot* m_nextSnapshot; | 393 ChildNodesLazySnapshot* m_nextSnapshot; |
| 337 }; | 394 }; |
| 338 | 395 |
| 339 } // namespace WebCore | 396 } // namespace WebCore |
| 340 | 397 |
| 341 #endif // ContainerNode_h | 398 #endif // ContainerNode_h |
| OLD | NEW |