OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007 Apple Inc. All rights reserved. |
3 * (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> | 3 * (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } else { | 78 } else { |
79 container.setFirstChild(&child); | 79 container.setFirstChild(&child); |
80 } | 80 } |
81 | 81 |
82 container.setLastChild(&child); | 82 container.setLastChild(&child); |
83 } | 83 } |
84 | 84 |
85 // Helper methods for removeDetachedChildrenInContainer, hidden from WebCore nam
espace | 85 // Helper methods for removeDetachedChildrenInContainer, hidden from WebCore nam
espace |
86 namespace Private { | 86 namespace Private { |
87 | 87 |
88 template<class GenericNode, class GenericNodeContainer, bool dispatchRemoval
Notification> | |
89 struct NodeRemovalDispatcher { | |
90 static void dispatch(GenericNode&, GenericNodeContainer&) | |
91 { | |
92 // no-op, by default | |
93 } | |
94 }; | |
95 | |
96 template<class GenericNode, class GenericNodeContainer> | |
97 struct NodeRemovalDispatcher<GenericNode, GenericNodeContainer, true> { | |
98 static void dispatch(GenericNode& node, GenericNodeContainer& container) | |
99 { | |
100 container.document().adoptIfNeeded(node); | |
101 if (node.inDocument()) | |
102 container.notifyNodeRemoved(node); | |
103 } | |
104 }; | |
105 | |
106 template<class GenericNode> | |
107 struct ShouldDispatchRemovalNotification { | |
108 static const bool value = false; | |
109 }; | |
110 | |
111 template<> | |
112 struct ShouldDispatchRemovalNotification<Node> { | |
113 static const bool value = true; | |
114 }; | |
115 | |
116 template<class GenericNode, class GenericNodeContainer> | 88 template<class GenericNode, class GenericNodeContainer> |
117 void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, Ge
nericNodeContainer& container) | 89 void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, Ge
nericNodeContainer& container) |
118 { | 90 { |
119 // We have to tell all children that their parent has died. | 91 // We have to tell all children that their parent has died. |
120 GenericNode* next = 0; | 92 GenericNode* next = 0; |
121 for (GenericNode* n = container.firstChild(); n; n = next) { | 93 for (GenericNode* n = container.firstChild(); n; n = next) { |
122 ASSERT_WITH_SECURITY_IMPLICATION(!n->m_deletionHasBegun); | 94 ASSERT_WITH_SECURITY_IMPLICATION(!n->m_deletionHasBegun); |
123 | 95 |
124 next = n->nextSibling(); | 96 next = n->nextSibling(); |
125 n->setNextSibling(0); | 97 n->setNextSibling(0); |
126 n->setParentOrShadowHostNode(0); | 98 n->setParentOrShadowHostNode(0); |
127 container.setFirstChild(next); | 99 container.setFirstChild(next); |
128 if (next) | 100 if (next) |
129 next->setPreviousSibling(0); | 101 next->setPreviousSibling(0); |
130 | 102 |
131 if (!n->refCount()) { | 103 if (!n->refCount()) { |
132 #if SECURITY_ASSERT_ENABLED | 104 #if SECURITY_ASSERT_ENABLED |
133 n->m_deletionHasBegun = true; | 105 n->m_deletionHasBegun = true; |
134 #endif | 106 #endif |
135 // Add the node to the list of nodes to be deleted. | 107 // Add the node to the list of nodes to be deleted. |
136 // Reuse the nextSibling pointer for this purpose. | 108 // Reuse the nextSibling pointer for this purpose. |
137 if (tail) | 109 if (tail) |
138 tail->setNextSibling(n); | 110 tail->setNextSibling(n); |
139 else | 111 else |
140 head = n; | 112 head = n; |
141 | 113 |
142 tail = n; | 114 tail = n; |
143 } else { | 115 } else { |
144 RefPtrWillBeRawPtr<GenericNode> protect(n); // removedFromDocume
nt may remove all references to this node. | 116 RefPtrWillBeRawPtr<GenericNode> protect(n); // removedFromDocume
nt may remove all references to this node. |
145 NodeRemovalDispatcher<GenericNode, GenericNodeContainer, ShouldD
ispatchRemovalNotification<GenericNode>::value>::dispatch(*n, container); | 117 container.document().adoptIfNeeded(*n); |
| 118 if (n->inDocument()) |
| 119 container.notifyNodeRemoved(*n); |
146 } | 120 } |
147 } | 121 } |
148 | 122 |
149 container.setLastChild(0); | 123 container.setLastChild(0); |
150 } | 124 } |
151 | 125 |
152 } // namespace Private | 126 } // namespace Private |
153 | 127 |
154 } // namespace WebCore | 128 } // namespace WebCore |
155 | 129 |
156 #endif // ContainerNodeAlgorithms_h | 130 #endif // ContainerNodeAlgorithms_h |
OLD | NEW |