Index: Source/core/dom/MutationObserver.cpp |
diff --git a/Source/core/dom/MutationObserver.cpp b/Source/core/dom/MutationObserver.cpp |
index 6f4fb9ec0fe39db4359629b189ef4fc822bebdda..248b547afd18882c337446c9cc099bec32264c37 100644 |
--- a/Source/core/dom/MutationObserver.cpp |
+++ b/Source/core/dom/MutationObserver.cpp |
@@ -49,16 +49,16 @@ namespace WebCore { |
static unsigned s_observerPriority = 0; |
struct MutationObserver::ObserverLessThan { |
- bool operator()(const RefPtr<MutationObserver>& lhs, const RefPtr<MutationObserver>& rhs) |
+ bool operator()(const RefPtrWillBeMember<MutationObserver>& lhs, const RefPtrWillBeMember<MutationObserver>& rhs) |
{ |
return lhs->m_priority < rhs->m_priority; |
} |
}; |
-PassRefPtr<MutationObserver> MutationObserver::create(PassOwnPtr<MutationCallback> callback) |
+PassRefPtrWillBeRawPtr<MutationObserver> MutationObserver::create(PassOwnPtr<MutationCallback> callback) |
{ |
ASSERT(isMainThread()); |
- return adoptRef(new MutationObserver(callback)); |
+ return adoptRefWillBeNoop(new MutationObserver(callback)); |
} |
MutationObserver::MutationObserver(PassOwnPtr<MutationCallback> callback) |
@@ -140,9 +140,9 @@ void MutationObserver::observe(Node* node, const Dictionary& optionsDictionary, |
node->registerMutationObserver(*this, options, attributeFilter); |
} |
-Vector<RefPtr<MutationRecord> > MutationObserver::takeRecords() |
+WillBeHeapVector<RefPtrWillBeMember<MutationRecord> > MutationObserver::takeRecords() |
{ |
- Vector<RefPtr<MutationRecord> > records; |
+ WillBeHeapVector<RefPtrWillBeMember<MutationRecord> > records; |
records.swap(m_records); |
InspectorInstrumentation::didClearAllMutationRecords(m_callback->executionContext(), this); |
return records; |
@@ -152,8 +152,8 @@ void MutationObserver::disconnect() |
{ |
m_records.clear(); |
InspectorInstrumentation::didClearAllMutationRecords(m_callback->executionContext(), this); |
- HashSet<MutationObserverRegistration*> registrations(m_registrations); |
- for (HashSet<MutationObserverRegistration*>::iterator iter = registrations.begin(); iter != registrations.end(); ++iter) |
+ WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> > registrations(m_registrations); |
+ for (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >::iterator iter = registrations.begin(); iter != registrations.end(); ++iter) |
(*iter)->unregister(); |
} |
@@ -169,21 +169,31 @@ void MutationObserver::observationEnded(MutationObserverRegistration* registrati |
m_registrations.remove(registration); |
} |
-typedef HashSet<RefPtr<MutationObserver> > MutationObserverSet; |
+typedef WillBeHeapHashSet<RefPtrWillBeMember<MutationObserver> > MutationObserverSet; |
static MutationObserverSet& activeMutationObservers() |
{ |
+#if ENABLE(OILPAN) |
+ DEFINE_STATIC_LOCAL(Persistent<MutationObserverSet>, activeObservers, (new MutationObserverSet())); |
+ return *activeObservers.get(); |
haraken
2014/04/15 02:33:25
You can use 'return *activeObservers'.
sof
2014/04/15 22:00:53
Thanks, yes.
|
+#else |
DEFINE_STATIC_LOCAL(MutationObserverSet, activeObservers, ()); |
return activeObservers; |
+#endif |
} |
static MutationObserverSet& suspendedMutationObservers() |
{ |
+#if ENABLE(OILPAN) |
+ DEFINE_STATIC_LOCAL(Persistent<MutationObserverSet>, suspendedObservers, (new MutationObserverSet())); |
+ return *suspendedObservers.get(); |
haraken
2014/04/15 02:33:25
Ditto.
sof
2014/04/15 22:00:53
Done.
|
+#else |
DEFINE_STATIC_LOCAL(MutationObserverSet, suspendedObservers, ()); |
return suspendedObservers; |
+#endif |
} |
-static void activateObserver(PassRefPtr<MutationObserver> observer) |
+static void activateObserver(PassRefPtrWillBeRawPtr<MutationObserver> observer) |
{ |
if (activeMutationObservers().isEmpty()) |
Microtask::enqueueMicrotask(&MutationObserver::deliverMutations); |
@@ -191,7 +201,7 @@ static void activateObserver(PassRefPtr<MutationObserver> observer) |
activeMutationObservers().add(observer); |
} |
-void MutationObserver::enqueueMutationRecord(PassRefPtr<MutationRecord> mutation) |
+void MutationObserver::enqueueMutationRecord(PassRefPtrWillBeRawPtr<MutationRecord> mutation) |
{ |
ASSERT(isMainThread()); |
m_records.append(mutation); |
@@ -208,7 +218,7 @@ void MutationObserver::setHasTransientRegistration() |
HashSet<Node*> MutationObserver::getObservedNodes() const |
{ |
HashSet<Node*> observedNodes; |
- for (HashSet<MutationObserverRegistration*>::const_iterator iter = m_registrations.begin(); iter != m_registrations.end(); ++iter) |
+ for (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >::const_iterator iter = m_registrations.begin(); iter != m_registrations.end(); ++iter) |
(*iter)->addRegistrationNodesToSet(observedNodes); |
return observedNodes; |
} |
@@ -224,8 +234,8 @@ void MutationObserver::deliver() |
// Calling clearTransientRegistrations() can modify m_registrations, so it's necessary |
// to make a copy of the transient registrations before operating on them. |
- Vector<MutationObserverRegistration*, 1> transientRegistrations; |
- for (HashSet<MutationObserverRegistration*>::iterator iter = m_registrations.begin(); iter != m_registrations.end(); ++iter) { |
+ WillBeHeapVector<RawPtrWillBeMember<MutationObserverRegistration>, 1> transientRegistrations; |
+ for (WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> >::iterator iter = m_registrations.begin(); iter != m_registrations.end(); ++iter) { |
if ((*iter)->hasTransientRegistrations()) |
transientRegistrations.append(*iter); |
} |
@@ -235,7 +245,7 @@ void MutationObserver::deliver() |
if (m_records.isEmpty()) |
return; |
- Vector<RefPtr<MutationRecord> > records; |
+ WillBeHeapVector<RefPtrWillBeMember<MutationRecord> > records; |
records.swap(m_records); |
InspectorInstrumentation::willDeliverMutationRecords(m_callback->executionContext(), this); |
@@ -249,7 +259,7 @@ void MutationObserver::resumeSuspendedObservers() |
if (suspendedMutationObservers().isEmpty()) |
return; |
- Vector<RefPtr<MutationObserver> > suspended; |
+ WillBeHeapVector<RefPtrWillBeMember<MutationObserver> > suspended; |
copyToVector(suspendedMutationObservers(), suspended); |
for (size_t i = 0; i < suspended.size(); ++i) { |
if (suspended[i]->canDeliver()) { |
@@ -262,7 +272,7 @@ void MutationObserver::resumeSuspendedObservers() |
void MutationObserver::deliverMutations() |
{ |
ASSERT(isMainThread()); |
- Vector<RefPtr<MutationObserver> > observers; |
+ WillBeHeapVector<RefPtrWillBeMember<MutationObserver> > observers; |
copyToVector(activeMutationObservers(), observers); |
activeMutationObservers().clear(); |
std::sort(observers.begin(), observers.end(), ObserverLessThan()); |
@@ -274,4 +284,10 @@ void MutationObserver::deliverMutations() |
} |
} |
+void MutationObserver::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_records); |
+ visitor->trace(m_registrations); |
+} |
+ |
} // namespace WebCore |