| Index: Source/core/dom/MutationObserverRegistration.cpp
|
| diff --git a/Source/core/dom/MutationObserverRegistration.cpp b/Source/core/dom/MutationObserverRegistration.cpp
|
| index 12816b0943bc7ef8a243660c0b9450f18fecb2a3..dc033558fca519b8c00c0b21ffc7d449837bd27b 100644
|
| --- a/Source/core/dom/MutationObserverRegistration.cpp
|
| +++ b/Source/core/dom/MutationObserverRegistration.cpp
|
| @@ -44,7 +44,7 @@ PassOwnPtrWillBeRawPtr<MutationObserverRegistration> MutationObserverRegistratio
|
|
|
| MutationObserverRegistration::MutationObserverRegistration(MutationObserver& observer, Node& registrationNode, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
|
| : m_observer(observer)
|
| - , m_registrationNode(registrationNode)
|
| + , m_registrationNode(®istrationNode)
|
| , m_options(options)
|
| , m_attributeFilter(attributeFilter)
|
| {
|
| @@ -53,15 +53,18 @@ MutationObserverRegistration::MutationObserverRegistration(MutationObserver& obs
|
|
|
| MutationObserverRegistration::~MutationObserverRegistration()
|
| {
|
| - // dispose() hasn't been called if this assert triggers.
|
| - ASSERT(!m_observer);
|
| +#if !ENABLE(OILPAN)
|
| + dispose();
|
| +#endif
|
| }
|
|
|
| void MutationObserverRegistration::dispose()
|
| {
|
| clearTransientRegistrations();
|
| - m_observer->observationEnded(this);
|
| - m_observer.clear();
|
| + if (m_observer) {
|
| + m_observer->observationEnded(this);
|
| + m_observer.clear();
|
| + }
|
| }
|
|
|
| void MutationObserverRegistration::resetObservation(MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
|
| @@ -82,8 +85,10 @@ void MutationObserverRegistration::observedSubtreeNodeWillDetach(Node& node)
|
| if (!m_transientRegistrationNodes) {
|
| m_transientRegistrationNodes = adoptPtr(new NodeHashSet);
|
|
|
| +#if !ENABLE(OILPAN)
|
| ASSERT(!m_registrationNodeKeepAlive);
|
| - m_registrationNodeKeepAlive = PassRefPtr<Node>(m_registrationNode); // Balanced in clearTransientRegistrations.
|
| + m_registrationNodeKeepAlive = PassRefPtr<Node>(m_registrationNode.get()); // Balanced in clearTransientRegistrations.
|
| +#endif
|
| }
|
| m_transientRegistrationNodes->add(&node);
|
| }
|
| @@ -91,7 +96,9 @@ void MutationObserverRegistration::observedSubtreeNodeWillDetach(Node& node)
|
| void MutationObserverRegistration::clearTransientRegistrations()
|
| {
|
| if (!m_transientRegistrationNodes) {
|
| +#if !ENABLE(OILPAN)
|
| ASSERT(!m_registrationNodeKeepAlive);
|
| +#endif
|
| return;
|
| }
|
|
|
| @@ -100,13 +107,15 @@ void MutationObserverRegistration::clearTransientRegistrations()
|
|
|
| m_transientRegistrationNodes.clear();
|
|
|
| +#if !ENABLE(OILPAN)
|
| ASSERT(m_registrationNodeKeepAlive);
|
| m_registrationNodeKeepAlive = nullptr; // Balanced in observeSubtreeNodeWillDetach.
|
| +#endif
|
| }
|
|
|
| void MutationObserverRegistration::unregister()
|
| {
|
| - m_registrationNode.unregisterMutationObserver(this);
|
| + m_registrationNode->unregisterMutationObserver(this);
|
| // The above line will cause this object to be deleted, so don't do any more in this function.
|
| }
|
|
|
| @@ -116,7 +125,7 @@ bool MutationObserverRegistration::shouldReceiveMutationFrom(Node& node, Mutatio
|
| if (!(m_options & type))
|
| return false;
|
|
|
| - if (m_registrationNode != node && !isSubtree())
|
| + if (m_registrationNode != &node && !isSubtree())
|
| return false;
|
|
|
| if (type != MutationObserver::Attributes || !(m_options & MutationObserver::AttributeFilter))
|
| @@ -130,7 +139,7 @@ bool MutationObserverRegistration::shouldReceiveMutationFrom(Node& node, Mutatio
|
|
|
| void MutationObserverRegistration::addRegistrationNodesToSet(HashSet<Node*>& nodes) const
|
| {
|
| - nodes.add(&m_registrationNode);
|
| + nodes.add(m_registrationNode.get());
|
| if (!m_transientRegistrationNodes)
|
| return;
|
| for (NodeHashSet::const_iterator iter = m_transientRegistrationNodes->begin(); iter != m_transientRegistrationNodes->end(); ++iter)
|
| @@ -140,6 +149,7 @@ void MutationObserverRegistration::addRegistrationNodesToSet(HashSet<Node*>& nod
|
| void MutationObserverRegistration::trace(Visitor* visitor)
|
| {
|
| visitor->trace(m_observer);
|
| + visitor->trace(m_registrationNode);
|
| }
|
|
|
| } // namespace WebCore
|
|
|