X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2FWebKit%2FSource%2Fcore%2Fdom%2FMutationObserverRegistration.cpp;h=0ba07f1d38a2f679fb86a9192060c2367ff9f88a;hb=004985e17e624662a4c85c76a7654039dc83f028;hp=2680bb73b6601eb2e57e356936c800d56c623464;hpb=2f108dbacb161091e42a3479f4e171339b7e7623;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/WebKit/Source/core/dom/MutationObserverRegistration.cpp b/src/third_party/WebKit/Source/core/dom/MutationObserverRegistration.cpp index 2680bb7..0ba07f1 100644 --- a/src/third_party/WebKit/Source/core/dom/MutationObserverRegistration.cpp +++ b/src/third_party/WebKit/Source/core/dom/MutationObserverRegistration.cpp @@ -37,12 +37,12 @@ namespace WebCore { -PassOwnPtr MutationObserverRegistration::create(MutationObserver& observer, Node& registrationNode, MutationObserverOptions options, const HashSet& attributeFilter) +PassOwnPtrWillBeRawPtr MutationObserverRegistration::create(MutationObserver& observer, Node* registrationNode, MutationObserverOptions options, const HashSet& 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& attributeFilter) +MutationObserverRegistration::MutationObserverRegistration(MutationObserver& observer, Node* registrationNode, MutationObserverOptions options, const HashSet& attributeFilter) : m_observer(observer) , m_registrationNode(registrationNode) , m_options(options) @@ -53,8 +53,16 @@ MutationObserverRegistration::MutationObserverRegistration(MutationObserver& obs 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& attributeFilter) @@ -75,8 +83,9 @@ void MutationObserverRegistration::observedSubtreeNodeWillDetach(Node& node) if (!m_transientRegistrationNodes) { m_transientRegistrationNodes = adoptPtr(new NodeHashSet); + ASSERT(m_registrationNode); ASSERT(!m_registrationNodeKeepAlive); - m_registrationNodeKeepAlive = PassRefPtr(m_registrationNode); // Balanced in clearTransientRegistrations. + m_registrationNodeKeepAlive = PassRefPtrWillBeRawPtr(m_registrationNode.get()); // Balanced in clearTransientRegistrations. } m_transientRegistrationNodes->add(&node); } @@ -99,7 +108,8 @@ void MutationObserverRegistration::clearTransientRegistrations() 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. } @@ -109,7 +119,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)) @@ -123,11 +133,19 @@ bool MutationObserverRegistration::shouldReceiveMutationFrom(Node& node, Mutatio void MutationObserverRegistration::addRegistrationNodesToSet(HashSet& 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