Chromium Code Reviews| 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); |
| } |
| } |