Chromium Code Reviews| Index: Source/core/dom/ContextLifecycleNotifier.cpp |
| diff --git a/Source/core/dom/ContextLifecycleNotifier.cpp b/Source/core/dom/ContextLifecycleNotifier.cpp |
| index 048978c735435f9f54fe8aaa07f7e51944ee6664..af9f97ca2917ac8361ec2a167c901c29579d4b81 100644 |
| --- a/Source/core/dom/ContextLifecycleNotifier.cpp |
| +++ b/Source/core/dom/ContextLifecycleNotifier.cpp |
| @@ -59,7 +59,6 @@ void ContextLifecycleNotifier::removeObserver(ContextLifecycleNotifier::Observer |
| RELEASE_ASSERT(m_iterating != IteratingOverContextObservers); |
| if (observer->observerType() == Observer::ActiveDOMObjectType) { |
| - RELEASE_ASSERT(m_iterating != IteratingOverActiveDOMObjects); |
| m_activeDOMObjects.remove(static_cast<ActiveDOMObject*>(observer)); |
| } |
| } |
| @@ -67,44 +66,61 @@ void ContextLifecycleNotifier::removeObserver(ContextLifecycleNotifier::Observer |
| void ContextLifecycleNotifier::notifyResumingActiveDOMObjects() |
| { |
| TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects); |
| - ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end(); |
| - for (ActiveDOMObjectSet::iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) { |
| - ASSERT((*iter)->executionContext() == context()); |
| - ASSERT((*iter)->suspendIfNeededCalled()); |
| - (*iter)->resume(); |
| + Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects; |
| + copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects); |
| + for (Vector<ActiveDOMObject*>::iterator iter = snapshotOfActiveDOMObjects.begin(); iter != snapshotOfActiveDOMObjects.end(); iter++) { |
| + // FIXME: Oilpan: At the moment, it's possible that the ActiveDOMObject is destructed |
| + // during the iteration. Once we move ActiveDOMObject to the heap and |
| + // make m_activeDOMObjects a HeapHashSet<WeakMember<ActiveDOMObject>>, |
| + // it's no longer possible that ActiveDOMObject is destructed during the iteration, |
| + // so we can remove the hack (i.e., we can just iterate m_activeDOMObjects without |
| + // taking a snapshot). For more details, see https://codereview.chromium.org/247253002/. |
| + if (m_activeDOMObjects.contains(*iter)) { |
| + ASSERT((*iter)->executionContext() == context()); |
| + ASSERT((*iter)->suspendIfNeededCalled()); |
| + (*iter)->resume(); |
| + } |
| } |
| } |
| void ContextLifecycleNotifier::notifySuspendingActiveDOMObjects() |
| { |
| TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects); |
| - ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end(); |
| - for (ActiveDOMObjectSet::iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) { |
| - ASSERT((*iter)->executionContext() == context()); |
| - ASSERT((*iter)->suspendIfNeededCalled()); |
| - (*iter)->suspend(); |
| + Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects; |
| + copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects); |
| + for (Vector<ActiveDOMObject*>::iterator iter = snapshotOfActiveDOMObjects.begin(); iter != snapshotOfActiveDOMObjects.end(); iter++) { |
| + // It's possible that the ActiveDOMObject is already destructed. |
| + // See a FIXME above. |
| + if (m_activeDOMObjects.contains(*iter)) { |
| + ASSERT((*iter)->executionContext() == context()); |
| + ASSERT((*iter)->suspendIfNeededCalled()); |
| + (*iter)->suspend(); |
| + } |
| } |
| } |
| void ContextLifecycleNotifier::notifyStoppingActiveDOMObjects() |
| { |
| TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects); |
| - ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end(); |
| - for (ActiveDOMObjectSet::iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) { |
| - ASSERT((*iter)->executionContext() == context()); |
| - ASSERT((*iter)->suspendIfNeededCalled()); |
| - (*iter)->stop(); |
| + Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects; |
| + copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects); |
| + for (Vector<ActiveDOMObject*>::iterator iter = snapshotOfActiveDOMObjects.begin(); iter != snapshotOfActiveDOMObjects.end(); iter++) { |
| + // It's possible that the ActiveDOMObject is already destructed. |
| + // See a FIXME above. |
| + if (m_activeDOMObjects.contains(*iter)) { |
| + ASSERT((*iter)->executionContext() == context()); |
| + ASSERT((*iter)->suspendIfNeededCalled()); |
| + (*iter)->stop(); |
| + } |
| } |
|
abarth-chromium
2014/05/09 13:54:39
I'm worried that ActiveDOMObjects created during t
haraken
2014/05/09 14:05:15
Creation during iteration is already forbidden by
|
| } |
| bool ContextLifecycleNotifier::hasPendingActivity() const |
| { |
| - ActiveDOMObjectSet::const_iterator activeObjectsEnd = activeDOMObjects().end(); |
| - for (ActiveDOMObjectSet::const_iterator iter = activeDOMObjects().begin(); iter != activeObjectsEnd; ++iter) { |
| + for (ActiveDOMObjectSet::const_iterator iter = m_activeDOMObjects.begin(); iter != m_activeDOMObjects.end(); ++iter) { |
| if ((*iter)->hasPendingActivity()) |
| return true; |
| } |
| - |
| return false; |
| } |