Home | History | Annotate | Download | only in platform
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  *
     25  */
     26 
     27 #ifndef LifecycleObserver_h
     28 #define LifecycleObserver_h
     29 
     30 #include "wtf/Assertions.h"
     31 
     32 namespace blink {
     33 
     34 template<typename T>
     35 class LifecycleObserver {
     36 public:
     37     typedef T Context;
     38 
     39     enum Type {
     40         ActiveDOMObjectType,
     41         DocumentLifecycleObserverType,
     42         GenericType,
     43         PageLifecycleObserverType,
     44         DOMWindowLifecycleObserverType
     45     };
     46 
     47     explicit LifecycleObserver(Context* context, Type type = GenericType)
     48         : m_lifecycleContext(0)
     49         , m_observerType(type)
     50     {
     51         observeContext(context);
     52     }
     53 
     54     virtual ~LifecycleObserver()
     55     {
     56         observeContext(0);
     57     }
     58 
     59     virtual void contextDestroyed() { m_lifecycleContext = 0; }
     60 
     61 
     62     Context* lifecycleContext() const { return m_lifecycleContext; }
     63     Type observerType() const { return m_observerType; }
     64 
     65 protected:
     66     void observeContext(Context*);
     67 
     68     Context* m_lifecycleContext;
     69     Type m_observerType;
     70 };
     71 
     72 //
     73 // These functions should be specialized for each LifecycleObserver instances.
     74 //
     75 template<typename T> void observerContext(T*, LifecycleObserver<T>*) { ASSERT_NOT_REACHED(); }
     76 template<typename T> void unobserverContext(T*, LifecycleObserver<T>*) { ASSERT_NOT_REACHED(); }
     77 
     78 
     79 template<typename T>
     80 inline void LifecycleObserver<T>::observeContext(typename LifecycleObserver<T>::Context* context)
     81 {
     82     if (m_lifecycleContext)
     83         unobserverContext(m_lifecycleContext, this);
     84 
     85     m_lifecycleContext = context;
     86 
     87     if (m_lifecycleContext)
     88         observerContext(m_lifecycleContext, this);
     89 }
     90 
     91 } // namespace blink
     92 
     93 #endif // LifecycleObserver_h
     94