Index: Source/core/dom/Node.cpp |
diff --git a/Source/core/dom/Node.cpp b/Source/core/dom/Node.cpp |
index cba038b6cca06edabba595937d870d29f262089b..dede3e4264e2a8d80cad3d71cd1abcf90641a87a 100644 |
--- a/Source/core/dom/Node.cpp |
+++ b/Source/core/dom/Node.cpp |
@@ -328,10 +328,19 @@ void Node::clearRareData() |
ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty()); |
RenderObject* renderer = m_data.m_rareData->renderer(); |
- if (isElementNode()) |
- delete static_cast<ElementRareData*>(m_data.m_rareData); |
- else |
- delete static_cast<NodeRareData*>(m_data.m_rareData); |
+ if (isElementNode()) { |
+ ElementRareData* rareData = static_cast<ElementRareData*>(m_data.m_rareData); |
+#if ENABLE(OILPAN) |
+ rareData->dispose(); |
+#endif |
+ delete rareData; |
+ } else { |
+ NodeRareData* rareData = static_cast<NodeRareData*>(m_data.m_rareData); |
+#if ENABLE(OILPAN) |
+ rareData->dispose(); |
+#endif |
+ delete rareData; |
+ } |
m_data.m_renderer = renderer; |
clearFlag(HasRareDataFlag); |
} |
@@ -1940,14 +1949,14 @@ void Node::didMoveToNewDocument(Document& oldDocument) |
} |
} |
- if (Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry()) { |
+ if (WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* registry = mutationObserverRegistry()) { |
for (size_t i = 0; i < registry->size(); ++i) { |
document().addMutationObserverTypes(registry->at(i)->mutationTypes()); |
} |
} |
- if (HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry()) { |
- for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) { |
+ if (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >* transientRegistry = transientMutationObserverRegistry()) { |
+ for (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) { |
document().addMutationObserverTypes((*iter)->mutationTypes()); |
} |
} |
@@ -2037,7 +2046,7 @@ void Node::clearEventTargetData() |
eventTargetDataMap().remove(this); |
} |
-Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry() |
+WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* Node::mutationObserverRegistry() |
{ |
if (!hasRareData()) |
return 0; |
@@ -2047,7 +2056,7 @@ Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry() |
return &data->registry; |
} |
-HashSet<MutationObserverRegistration*>* Node::transientMutationObserverRegistry() |
+WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >* Node::transientMutationObserverRegistry() |
{ |
if (!hasRareData()) |
return 0; |
@@ -2058,7 +2067,7 @@ HashSet<MutationObserverRegistration*>* Node::transientMutationObserverRegistry( |
} |
template<typename Registry> |
-static inline void collectMatchingObserversForMutation(HashMap<MutationObserver*, MutationRecordDeliveryOptions>& observers, Registry* registry, Node& target, MutationObserver::MutationType type, const QualifiedName* attributeName) |
+static inline void collectMatchingObserversForMutation(WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions>& observers, Registry* registry, Node& target, MutationObserver::MutationType type, const QualifiedName* attributeName) |
{ |
if (!registry) |
return; |
@@ -2066,14 +2075,14 @@ static inline void collectMatchingObserversForMutation(HashMap<MutationObserver* |
const MutationObserverRegistration& registration = **iter; |
if (registration.shouldReceiveMutationFrom(target, type, attributeName)) { |
MutationRecordDeliveryOptions deliveryOptions = registration.deliveryOptions(); |
- HashMap<MutationObserver*, MutationRecordDeliveryOptions>::AddResult result = observers.add(®istration.observer(), deliveryOptions); |
+ WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions>::AddResult result = observers.add(®istration.observer(), deliveryOptions); |
if (!result.isNewEntry) |
result.storedValue->value |= deliveryOptions; |
} |
} |
} |
-void Node::getRegisteredMutationObserversOfType(HashMap<MutationObserver*, MutationRecordDeliveryOptions>& observers, MutationObserver::MutationType type, const QualifiedName* attributeName) |
+void Node::getRegisteredMutationObserversOfType(WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions>& observers, MutationObserver::MutationType type, const QualifiedName* attributeName) |
{ |
ASSERT((type == MutationObserver::Attributes && attributeName) || !attributeName); |
collectMatchingObserversForMutation(observers, mutationObserverRegistry(), *this, type, attributeName); |
@@ -2087,7 +2096,7 @@ void Node::getRegisteredMutationObserversOfType(HashMap<MutationObserver*, Mutat |
void Node::registerMutationObserver(MutationObserver& observer, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter) |
{ |
MutationObserverRegistration* registration = 0; |
- Vector<OwnPtr<MutationObserverRegistration> >& registry = ensureRareData().ensureMutationObserverData().registry; |
+ WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >& registry = ensureRareData().ensureMutationObserverData().registry; |
for (size_t i = 0; i < registry.size(); ++i) { |
if (®istry[i]->observer() == &observer) { |
registration = registry[i].get(); |
@@ -2105,7 +2114,7 @@ void Node::registerMutationObserver(MutationObserver& observer, MutationObserver |
void Node::unregisterMutationObserver(MutationObserverRegistration* registration) |
{ |
- Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry(); |
+ WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* registry = mutationObserverRegistry(); |
ASSERT(registry); |
if (!registry) |
return; |
@@ -2120,6 +2129,10 @@ void Node::unregisterMutationObserver(MutationObserverRegistration* registration |
// FIXME: Simplify the registration/transient registration logic to make this understandable by humans. |
RefPtr<Node> protect(this); |
registry->remove(index); |
+#if ENABLE(OILPAN) |
+ // Promptly dispose of the MutationObserverRegistration object. |
+ registration->dispose(); |
haraken
2014/04/15 02:33:25
This looks dangerous. As far as I read a comment i
sof
2014/04/15 22:00:53
This only applies in the Oilpan case and 'registra
|
+#endif |
} |
void Node::registerTransientMutationObserver(MutationObserverRegistration* registration) |
@@ -2129,7 +2142,7 @@ void Node::registerTransientMutationObserver(MutationObserverRegistration* regis |
void Node::unregisterTransientMutationObserver(MutationObserverRegistration* registration) |
{ |
- HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry(); |
+ WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >* transientRegistry = transientMutationObserverRegistry(); |
ASSERT(transientRegistry); |
if (!transientRegistry) |
return; |
@@ -2144,14 +2157,14 @@ void Node::notifyMutationObserversNodeWillDetach() |
return; |
for (Node* node = parentNode(); node; node = node->parentNode()) { |
- if (Vector<OwnPtr<MutationObserverRegistration> >* registry = node->mutationObserverRegistry()) { |
+ if (WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* registry = node->mutationObserverRegistry()) { |
const size_t size = registry->size(); |
for (size_t i = 0; i < size; ++i) |
registry->at(i)->observedSubtreeNodeWillDetach(*this); |
} |
- if (HashSet<MutationObserverRegistration*>* transientRegistry = node->transientMutationObserverRegistry()) { |
- for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) |
+ if (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >* transientRegistry = node->transientMutationObserverRegistry()) { |
+ for (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) |
(*iter)->observedSubtreeNodeWillDetach(*this); |
} |
} |