Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(584)

Unified Diff: Source/core/dom/Node.cpp

Issue 236653002: Oilpan: move mutation observers to the Oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased + explicitly dispose() mutation observer registrations always (non-Oilpan also.) Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(&registration.observer(), deliveryOptions);
+ WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions>::AddResult result = observers.add(&registration.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 (&registry[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);
}
}

Powered by Google App Engine
This is Rietveld 408576698