Index: third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp |
diff --git a/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp b/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp |
index 38a035cfbf25fb11f831e8ec9c8c943291b1ab74..bb887abfc4ce19dada26d4141a9fa2bfc9b2845c 100644 |
--- a/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp |
+++ b/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp |
@@ -32,71 +32,53 @@ |
namespace blink { |
-void ContextLifecycleNotifier::notifyResumingActiveDOMObjects() |
+void ContextLifecycleNotifier::eachActiveDOMObject(void (*f)(ActiveDOMObject*)) |
{ |
+ // This ensures that no ActiveDOMObjects are *added* during iteration. |
+ // It does not stop ActiveDOMObjects from being removed. |
TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); |
- Vector<UntracedMember<ContextLifecycleObserver>> snapshotOfObservers; |
+ |
+ // Take a snapshot of the observers. Observers may be removed |
+ // during iteration, hence we need a snapshot for a stable iterator. |
+ HeapVector<Member<ContextLifecycleObserver>> snapshotOfObservers; |
sof
2016/06/24 05:57:59
Could you explain why this is needed? We don't wan
|
+ snapshotOfObservers.reserveInitialCapacity(m_observers.size()); |
copyToVector(m_observers, snapshotOfObservers); |
+ |
for (ContextLifecycleObserver* observer : snapshotOfObservers) { |
- // FIXME: Oilpan: At the moment, it's possible that a ActiveDOMObject |
- // observer is destructed while iterating. Once we enable Oilpan by default |
- // for all LifecycleObserver<T>s, we can remove the hack by making m_observers |
- // a HeapHashSet<WeakMember<LifecycleObserver<T>>>. |
- // (i.e., we can just iterate m_observers without taking a snapshot). |
- // For more details, see https://codereview.chromium.org/247253002/. |
- if (m_observers.contains(observer)) { |
- if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) |
- continue; |
- ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); |
+ if (!m_observers.contains(observer)) |
+ continue; |
+ |
+ if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) |
+ continue; |
+ |
+ ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); |
#if DCHECK_IS_ON() |
- DCHECK_EQ(activeDOMObject->getExecutionContext(), context()); |
- DCHECK(activeDOMObject->suspendIfNeededCalled()); |
+ DCHECK_EQ(activeDOMObject->getExecutionContext(), context()); |
+ DCHECK(activeDOMObject->suspendIfNeededCalled()); |
#endif |
- activeDOMObject->resume(); |
- } |
+ f(activeDOMObject); |
} |
} |
+void ContextLifecycleNotifier::notifyResumingActiveDOMObjects() |
+{ |
+ eachActiveDOMObject([](ActiveDOMObject* object) { |
+ object->resume(); |
+ }); |
+} |
+ |
void ContextLifecycleNotifier::notifySuspendingActiveDOMObjects() |
{ |
- TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); |
- Vector<UntracedMember<ContextLifecycleObserver>> snapshotOfObservers; |
- copyToVector(m_observers, snapshotOfObservers); |
- for (ContextLifecycleObserver* observer : snapshotOfObservers) { |
- // It's possible that the ActiveDOMObject is already destructed. |
- // See a FIXME above. |
- if (m_observers.contains(observer)) { |
- if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) |
- continue; |
- ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); |
-#if DCHECK_IS_ON() |
- DCHECK_EQ(activeDOMObject->getExecutionContext(), context()); |
- DCHECK(activeDOMObject->suspendIfNeededCalled()); |
-#endif |
- activeDOMObject->suspend(); |
- } |
- } |
+ eachActiveDOMObject([](ActiveDOMObject* object) { |
+ object->suspend(); |
+ }); |
} |
void ContextLifecycleNotifier::notifyStoppingActiveDOMObjects() |
{ |
- TemporaryChange<IterationType> scope(m_iterating, IteratingOverAll); |
- Vector<UntracedMember<ContextLifecycleObserver>> snapshotOfObservers; |
- copyToVector(m_observers, snapshotOfObservers); |
- for (ContextLifecycleObserver* observer : snapshotOfObservers) { |
- // It's possible that the ActiveDOMObject is already destructed. |
- // See a FIXME above. |
- if (m_observers.contains(observer)) { |
- if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) |
- continue; |
- ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); |
-#if DCHECK_IS_ON() |
- DCHECK_EQ(activeDOMObject->getExecutionContext(), context()); |
- DCHECK(activeDOMObject->suspendIfNeededCalled()); |
-#endif |
- activeDOMObject->stop(); |
- } |
- } |
+ eachActiveDOMObject([](ActiveDOMObject* object) { |
+ object->stop(); |
+ }); |
} |
unsigned ContextLifecycleNotifier::activeDOMObjectCount() const |