namespace WebCore {
-PassOwnPtr<MutationObserverRegistration> MutationObserverRegistration::create(MutationObserver& observer, Node& registrationNode, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
+PassOwnPtrWillBeRawPtr<MutationObserverRegistration> MutationObserverRegistration::create(MutationObserver& observer, Node* registrationNode, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
{
- return adoptPtr(new MutationObserverRegistration(observer, registrationNode, options, attributeFilter));
+ return adoptPtrWillBeNoop(new MutationObserverRegistration(observer, registrationNode, options, attributeFilter));
}
-MutationObserverRegistration::MutationObserverRegistration(MutationObserver& observer, Node& registrationNode, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
+MutationObserverRegistration::MutationObserverRegistration(MutationObserver& observer, Node* registrationNode, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
: m_observer(observer)
, m_registrationNode(registrationNode)
, m_options(options)
MutationObserverRegistration::~MutationObserverRegistration()
{
+#if !ENABLE(OILPAN)
+ dispose();
+#endif
+}
+
+void MutationObserverRegistration::dispose()
+{
clearTransientRegistrations();
m_observer->observationEnded(this);
+ m_observer.clear();
}
void MutationObserverRegistration::resetObservation(MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
if (!m_transientRegistrationNodes) {
m_transientRegistrationNodes = adoptPtr(new NodeHashSet);
+ ASSERT(m_registrationNode);
ASSERT(!m_registrationNodeKeepAlive);
- m_registrationNodeKeepAlive = PassRefPtr<Node>(m_registrationNode); // Balanced in clearTransientRegistrations.
+ m_registrationNodeKeepAlive = PassRefPtrWillBeRawPtr<Node>(m_registrationNode.get()); // Balanced in clearTransientRegistrations.
}
m_transientRegistrationNodes->add(&node);
}
void MutationObserverRegistration::unregister()
{
- m_registrationNode.unregisterMutationObserver(this);
+ ASSERT(m_registrationNode);
+ m_registrationNode->unregisterMutationObserver(this);
// The above line will cause this object to be deleted, so don't do any more in this function.
}
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))
void MutationObserverRegistration::addRegistrationNodesToSet(HashSet<Node*>& nodes) const
{
- nodes.add(&m_registrationNode);
+ ASSERT(m_registrationNode);
+ nodes.add(m_registrationNode.get());
if (!m_transientRegistrationNodes)
return;
for (NodeHashSet::const_iterator iter = m_transientRegistrationNodes->begin(); iter != m_transientRegistrationNodes->end(); ++iter)
nodes.add(iter->get());
}
+void MutationObserverRegistration::trace(Visitor* visitor)
+{
+ visitor->trace(m_observer);
+ visitor->trace(m_registrationNode);
+ visitor->trace(m_registrationNodeKeepAlive);
+}
+
} // namespace WebCore