Chromium Code Reviews| 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 |