#include "core/dom/ExecutionContext.h"
#include "wtf/TemporaryChange.h"
-namespace WebCore {
+namespace blink {
ContextLifecycleNotifier::ContextLifecycleNotifier(ExecutionContext* context)
: LifecycleNotifier<ExecutionContext>(context)
RELEASE_ASSERT(m_iterating != IteratingOverContextObservers);
if (observer->observerType() == Observer::ActiveDOMObjectType) {
- RELEASE_ASSERT(m_iterating != IteratingOverActiveDOMObjects);
m_activeDOMObjects.remove(static_cast<ActiveDOMObject*>(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 (ActiveDOMObject* obj : snapshotOfActiveDOMObjects) {
+ // 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(obj)) {
+ ASSERT(obj->executionContext() == context());
+ ASSERT(obj->suspendIfNeededCalled());
+ obj->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();
- }
-}
-
-void ContextLifecycleNotifier::notifyWillStopActiveDOMObjects()
-{
- 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)->willStop();
+ Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects;
+ copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects);
+ for (ActiveDOMObject* obj : snapshotOfActiveDOMObjects) {
+ // It's possible that the ActiveDOMObject is already destructed.
+ // See a FIXME above.
+ if (m_activeDOMObjects.contains(obj)) {
+ ASSERT(obj->executionContext() == context());
+ ASSERT(obj->suspendIfNeededCalled());
+ obj->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 (ActiveDOMObject* obj : snapshotOfActiveDOMObjects) {
+ // It's possible that the ActiveDOMObject is already destructed.
+ // See a FIXME above.
+ if (m_activeDOMObjects.contains(obj)) {
+ ASSERT(obj->executionContext() == context());
+ ASSERT(obj->suspendIfNeededCalled());
+ obj->stop();
+ }
}
}
bool ContextLifecycleNotifier::hasPendingActivity() const
{
- ActiveDOMObjectSet::const_iterator activeObjectsEnd = activeDOMObjects().end();
- for (ActiveDOMObjectSet::const_iterator iter = activeDOMObjects().begin(); iter != activeObjectsEnd; ++iter) {
- if ((*iter)->hasPendingActivity())
+ for (ActiveDOMObject* obj : m_activeDOMObjects) {
+ if (obj->hasPendingActivity())
return true;
}
-
return false;
}
-} // namespace WebCore
+} // namespace blink