blob: f00e4310e16690f7ec10c6f948f60f232134a12b [file] [log] [blame]
Ben Murdoch591b9582013-07-10 11:41:44 +01001/*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2013 Google Inc. All Rights Reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 */
27
28#include "config.h"
29#include "core/dom/ContextLifecycleNotifier.h"
30
Ben Murdoch0019e4e2013-07-18 11:57:54 +010031#include "core/dom/ScriptExecutionContext.h"
Ben Murdoch591b9582013-07-10 11:41:44 +010032#include "wtf/TemporaryChange.h"
33
34namespace WebCore {
35
36ContextLifecycleNotifier::ContextLifecycleNotifier(ScriptExecutionContext* context)
Ben Murdoch0019e4e2013-07-18 11:57:54 +010037 : LifecycleNotifier(context)
Ben Murdoch591b9582013-07-10 11:41:44 +010038{
39}
40
41ContextLifecycleNotifier::~ContextLifecycleNotifier()
42{
Ben Murdoch591b9582013-07-10 11:41:44 +010043}
44
Ben Murdoch0019e4e2013-07-18 11:57:54 +010045void ContextLifecycleNotifier::addObserver(LifecycleObserver* observer, LifecycleObserver::Type type)
Ben Murdoch591b9582013-07-10 11:41:44 +010046{
Ben Murdoch0019e4e2013-07-18 11:57:54 +010047 LifecycleNotifier::addObserver(observer, type);
48
Ben Murdoch591b9582013-07-10 11:41:44 +010049 RELEASE_ASSERT(m_iterating != IteratingOverContextObservers);
Ben Murdoch0019e4e2013-07-18 11:57:54 +010050 if (type == LifecycleObserver::ActiveDOMObjectType) {
Ben Murdoch591b9582013-07-10 11:41:44 +010051 RELEASE_ASSERT(m_iterating != IteratingOverActiveDOMObjects);
52 m_activeDOMObjects.add(static_cast<ActiveDOMObject*>(observer));
53 }
54}
55
Ben Murdoch0019e4e2013-07-18 11:57:54 +010056void ContextLifecycleNotifier::removeObserver(LifecycleObserver* observer, LifecycleObserver::Type type)
Ben Murdoch591b9582013-07-10 11:41:44 +010057{
Ben Murdoch0019e4e2013-07-18 11:57:54 +010058 LifecycleNotifier::removeObserver(observer, type);
59
Ben Murdoch591b9582013-07-10 11:41:44 +010060 RELEASE_ASSERT(m_iterating != IteratingOverContextObservers);
Ben Murdoch0019e4e2013-07-18 11:57:54 +010061 if (type == LifecycleObserver::ActiveDOMObjectType) {
Ben Murdoch591b9582013-07-10 11:41:44 +010062 RELEASE_ASSERT(m_iterating != IteratingOverActiveDOMObjects);
63 m_activeDOMObjects.remove(static_cast<ActiveDOMObject*>(observer));
64 }
65}
66
67void ContextLifecycleNotifier::notifyResumingActiveDOMObjects()
68{
69 TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects);
70 ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end();
71 for (ActiveDOMObjectSet::iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) {
Ben Murdoch0019e4e2013-07-18 11:57:54 +010072 ASSERT((*iter)->scriptExecutionContext() == context());
Ben Murdoch591b9582013-07-10 11:41:44 +010073 ASSERT((*iter)->suspendIfNeededCalled());
74 (*iter)->resume();
75 }
76}
77
78void ContextLifecycleNotifier::notifySuspendingActiveDOMObjects(ActiveDOMObject::ReasonForSuspension why)
79{
80 TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects);
81 ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end();
82 for (ActiveDOMObjectSet::iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) {
Ben Murdoch0019e4e2013-07-18 11:57:54 +010083 ASSERT((*iter)->scriptExecutionContext() == context());
Ben Murdoch591b9582013-07-10 11:41:44 +010084 ASSERT((*iter)->suspendIfNeededCalled());
85 (*iter)->suspend(why);
86 }
87}
88
89void ContextLifecycleNotifier::notifyStoppingActiveDOMObjects()
90{
91 TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects);
92 ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end();
93 for (ActiveDOMObjectSet::iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) {
Ben Murdoch0019e4e2013-07-18 11:57:54 +010094 ASSERT((*iter)->scriptExecutionContext() == context());
Ben Murdoch591b9582013-07-10 11:41:44 +010095 ASSERT((*iter)->suspendIfNeededCalled());
96 (*iter)->stop();
97 }
98}
99
100bool ContextLifecycleNotifier::canSuspendActiveDOMObjects()
101{
102 TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects);
103 ActiveDOMObjectSet::iterator activeObjectsEnd = m_activeDOMObjects.end();
104 for (ActiveDOMObjectSet::const_iterator iter = m_activeDOMObjects.begin(); iter != activeObjectsEnd; ++iter) {
Ben Murdoch0019e4e2013-07-18 11:57:54 +0100105 ASSERT((*iter)->scriptExecutionContext() == context());
Ben Murdoch591b9582013-07-10 11:41:44 +0100106 ASSERT((*iter)->suspendIfNeededCalled());
107 if (!(*iter)->canSuspend())
108 return false;
109 }
110
111 return true;
112}
113
114bool ContextLifecycleNotifier::hasPendingActivity() const
115{
116 ActiveDOMObjectSet::const_iterator activeObjectsEnd = activeDOMObjects().end();
117 for (ActiveDOMObjectSet::const_iterator iter = activeDOMObjects().begin(); iter != activeObjectsEnd; ++iter) {
118 if ((*iter)->hasPendingActivity())
119 return true;
120 }
121
122 return false;
123}
124
Ben Murdoch591b9582013-07-10 11:41:44 +0100125} // namespace WebCore
126