| Index: Source/core/dom/Node.cpp
|
| diff --git a/Source/core/dom/Node.cpp b/Source/core/dom/Node.cpp
|
| index f7594b0770ea741ed1556cde05f78eba663f0848..8e7e139e5d1fb8e93feac81e47e12ee069652c20 100644
|
| --- a/Source/core/dom/Node.cpp
|
| +++ b/Source/core/dom/Node.cpp
|
| @@ -330,10 +330,15 @@ 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);
|
| + rareData->dispose();
|
| + delete rareData;
|
| + } else {
|
| + NodeRareData* rareData = static_cast<NodeRareData*>(m_data.m_rareData);
|
| + rareData->dispose();
|
| + delete rareData;
|
| + }
|
| m_data.m_renderer = renderer;
|
| clearFlag(HasRareDataFlag);
|
| }
|
| @@ -1945,14 +1950,14 @@ void Node::didMoveToNewDocument(Document& oldDocument)
|
| }
|
| EventHandlerRegistry::from(document())->didMoveFromOtherDocument(*this, 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());
|
| }
|
| }
|
| @@ -2046,7 +2051,7 @@ void Node::clearEventTargetData()
|
| eventTargetDataMap().remove(this);
|
| }
|
|
|
| -Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry()
|
| +WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* Node::mutationObserverRegistry()
|
| {
|
| if (!hasRareData())
|
| return 0;
|
| @@ -2056,7 +2061,7 @@ Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry()
|
| return &data->registry;
|
| }
|
|
|
| -HashSet<MutationObserverRegistration*>* Node::transientMutationObserverRegistry()
|
| +WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >* Node::transientMutationObserverRegistry()
|
| {
|
| if (!hasRareData())
|
| return 0;
|
| @@ -2067,7 +2072,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;
|
| @@ -2075,14 +2080,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);
|
| @@ -2096,7 +2101,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();
|
| @@ -2114,7 +2119,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;
|
| @@ -2128,6 +2133,9 @@ 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.
|
| + registration->dispose();
|
| registry->remove(index);
|
| }
|
|
|
| @@ -2138,7 +2146,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;
|
| @@ -2153,14 +2161,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);
|
| }
|
| }
|
|
|