Index: Source/core/dom/Node.cpp |
diff --git a/Source/core/dom/Node.cpp b/Source/core/dom/Node.cpp |
index 338aa5734b2ed6ec461f18cb4d2f1241a99d82d4..d1597c50a09a007bd017d74eebce8fda8e8b797b 100644 |
--- a/Source/core/dom/Node.cpp |
+++ b/Source/core/dom/Node.cpp |
@@ -266,12 +266,12 @@ Node::~Node() |
liveNodeSet.remove(this); |
#endif |
+#if !ENABLE(OILPAN) |
if (hasRareData()) |
clearRareData(); |
RELEASE_ASSERT(!renderer()); |
-#if !ENABLE(OILPAN) |
if (!isContainerNode()) |
willBeDeletedFromDocument(); |
@@ -282,6 +282,10 @@ Node::~Node() |
if (m_treeScope) |
m_treeScope->guardDeref(); |
+#else |
+ // With Oilpan, the rare data finalizer also asserts for |
+ // this condition (we cannot directly access it here.) |
+ RELEASE_ASSERT(hasRareData() || !renderer()); |
#endif |
InspectorCounters::decrementCounter(InspectorCounters::NodeCounter); |
@@ -324,36 +328,32 @@ NodeRareData& Node::ensureRareData() |
if (hasRareData()) |
return *rareData(); |
- NodeRareData* data; |
if (isElementNode()) |
- data = ElementRareData::create(m_data.m_renderer).leakPtr(); |
+ m_data.m_rareData = ElementRareData::create(m_data.m_renderer); |
else |
- data = NodeRareData::create(m_data.m_renderer).leakPtr(); |
- ASSERT(data); |
+ m_data.m_rareData = NodeRareData::create(m_data.m_renderer); |
+ |
+ ASSERT(m_data.m_rareData); |
- m_data.m_rareData = data; |
setFlag(HasRareDataFlag); |
- return *data; |
+ return *rareData(); |
} |
+#if !ENABLE(OILPAN) |
void Node::clearRareData() |
{ |
ASSERT(hasRareData()); |
ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty()); |
RenderObject* renderer = m_data.m_rareData->renderer(); |
- if (isElementNode()) { |
- ElementRareData* rareData = static_cast<ElementRareData*>(m_data.m_rareData); |
- rareData->dispose(); |
- delete rareData; |
- } else { |
- NodeRareData* rareData = static_cast<NodeRareData*>(m_data.m_rareData); |
- rareData->dispose(); |
- delete rareData; |
- } |
+ if (isElementNode()) |
+ delete static_cast<ElementRareData*>(m_data.m_rareData); |
+ else |
+ delete static_cast<NodeRareData*>(m_data.m_rareData); |
m_data.m_renderer = renderer; |
clearFlag(HasRareDataFlag); |
} |
+#endif |
Node* Node::toNode() |
{ |
@@ -2136,7 +2136,7 @@ void Node::registerMutationObserver(MutationObserver& observer, MutationObserver |
} |
if (!registration) { |
- registry.append(MutationObserverRegistration::create(observer, *this, options, attributeFilter)); |
+ registry.append(MutationObserverRegistration::create(observer, this, options, attributeFilter)); |
registration = registry.last().get(); |
} |
@@ -2159,9 +2159,11 @@ void Node::unregisterMutationObserver(MutationObserverRegistration* registration |
// before that, in case |this| is destroyed (see MutationObserverRegistration::m_registrationNodeKeepAlive). |
// FIXME: Simplify the registration/transient registration logic to make this understandable by humans. |
RefPtr<Node> protect(this); |
- // The explicit dispose() is motivated by Oilpan; the registration |
- // object needs to unregister itself promptly. |
+#if ENABLE(OILPAN) |
+ // The explicit dispose() is needed to have the registration |
+ // object unregister itself promptly. |
registration->dispose(); |
+#endif |
registry->remove(index); |
} |
@@ -2565,6 +2567,9 @@ void Node::trace(Visitor* visitor) |
visitor->trace(m_parentOrShadowHostNode); |
visitor->trace(m_previous); |
visitor->trace(m_next); |
+ if (hasRareData()) |
+ visitor->trace(rareData()); |
+ |
visitor->trace(m_treeScope); |
} |