1591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch/* 2591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Copyright (C) 2013 Google Inc. All Rights Reserved. 4591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 5591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Redistribution and use in source and binary forms, with or without 6591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * modification, are permitted provided that the following conditions 7591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * are met: 8591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 1. Redistributions of source code must retain the above copyright 9591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * notice, this list of conditions and the following disclaimer. 10591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 11591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * notice, this list of conditions and the following disclaimer in the 12591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * documentation and/or other materials provided with the distribution. 13591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 14591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 26591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch */ 27591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "config.h" 29591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/ContextLifecycleNotifier.h" 30591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContext.h" 32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/TemporaryChange.h" 33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ContextLifecycleNotifier::ContextLifecycleNotifier(ExecutionContext* context) 37f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) : LifecycleNotifier<ExecutionContext>(context) 38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 39591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 40591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 41591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochContextLifecycleNotifier::~ContextLifecycleNotifier() 42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 45f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void ContextLifecycleNotifier::addObserver(ContextLifecycleNotifier::Observer* observer) 46591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) LifecycleNotifier<ExecutionContext>::addObserver(observer); 480019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 49591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RELEASE_ASSERT(m_iterating != IteratingOverContextObservers); 50f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (observer->observerType() == Observer::ActiveDOMObjectType) { 51591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RELEASE_ASSERT(m_iterating != IteratingOverActiveDOMObjects); 52591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_activeDOMObjects.add(static_cast<ActiveDOMObject*>(observer)); 53591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 54591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 55591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 56f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void ContextLifecycleNotifier::removeObserver(ContextLifecycleNotifier::Observer* observer) 57591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) LifecycleNotifier<ExecutionContext>::removeObserver(observer); 590019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 60591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RELEASE_ASSERT(m_iterating != IteratingOverContextObservers); 61f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (observer->observerType() == Observer::ActiveDOMObjectType) { 62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_activeDOMObjects.remove(static_cast<ActiveDOMObject*>(observer)); 63591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 64591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ContextLifecycleNotifier::notifyResumingActiveDOMObjects() 67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 68591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects); 69d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects; 70d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects); 71d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (Vector<ActiveDOMObject*>::iterator iter = snapshotOfActiveDOMObjects.begin(); iter != snapshotOfActiveDOMObjects.end(); iter++) { 72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // FIXME: Oilpan: At the moment, it's possible that the ActiveDOMObject is destructed 73d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // during the iteration. Once we move ActiveDOMObject to the heap and 74d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // make m_activeDOMObjects a HeapHashSet<WeakMember<ActiveDOMObject>>, 75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // it's no longer possible that ActiveDOMObject is destructed during the iteration, 76d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // so we can remove the hack (i.e., we can just iterate m_activeDOMObjects without 77d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // taking a snapshot). For more details, see https://codereview.chromium.org/247253002/. 78d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_activeDOMObjects.contains(*iter)) { 79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT((*iter)->executionContext() == context()); 80d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT((*iter)->suspendIfNeededCalled()); 81d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) (*iter)->resume(); 82d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 83591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 84591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 85591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ContextLifecycleNotifier::notifySuspendingActiveDOMObjects() 87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 88591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects); 89d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects; 90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects); 91d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (Vector<ActiveDOMObject*>::iterator iter = snapshotOfActiveDOMObjects.begin(); iter != snapshotOfActiveDOMObjects.end(); iter++) { 92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // It's possible that the ActiveDOMObject is already destructed. 93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // See a FIXME above. 94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_activeDOMObjects.contains(*iter)) { 95d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT((*iter)->executionContext() == context()); 96d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT((*iter)->suspendIfNeededCalled()); 97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) (*iter)->suspend(); 98d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 99591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 100591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 101591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 102591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ContextLifecycleNotifier::notifyStoppingActiveDOMObjects() 103591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 104591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverActiveDOMObjects); 105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Vector<ActiveDOMObject*> snapshotOfActiveDOMObjects; 106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) copyToVector(m_activeDOMObjects, snapshotOfActiveDOMObjects); 107d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (Vector<ActiveDOMObject*>::iterator iter = snapshotOfActiveDOMObjects.begin(); iter != snapshotOfActiveDOMObjects.end(); iter++) { 108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // It's possible that the ActiveDOMObject is already destructed. 109d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // See a FIXME above. 110d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_activeDOMObjects.contains(*iter)) { 111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT((*iter)->executionContext() == context()); 112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT((*iter)->suspendIfNeededCalled()); 113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) (*iter)->stop(); 114d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 115591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 116591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 117591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 118591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool ContextLifecycleNotifier::hasPendingActivity() const 119591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (ActiveDOMObjectSet::const_iterator iter = m_activeDOMObjects.begin(); iter != m_activeDOMObjects.end(); ++iter) { 121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if ((*iter)->hasPendingActivity()) 122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return true; 123591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 124591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 125591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 126591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 128