18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All Rights Reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ActiveDOMObject_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ActiveDOMObject_h
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h>
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class ScriptExecutionContext;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class ActiveDOMObject {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ActiveDOMObject(ScriptExecutionContext*, void* upcastPointer);
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScriptExecutionContext* scriptExecutionContext() const { return m_scriptExecutionContext; }
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        virtual bool hasPendingActivity() const;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual void contextDestroyed();
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // canSuspend() is used by the caller if there is a choice between suspending and stopping.
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // For example, a page won't be suspended and placed in the back/forward cache if it has
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // the objects that can not be suspended.
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // However, 'suspend' can be called even if canSuspend() would return 'false'. That
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // happens in step-by-step JS debugging for example - in this case it would be incorrect
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // to stop the object. Exact semantics of suspend is up to the object then.
5168513a70bcd92384395513322f1b801e7bf9c729Steve Block        enum ReasonForSuspension {
5268513a70bcd92384395513322f1b801e7bf9c729Steve Block            JavaScriptDebuggerPaused,
5368513a70bcd92384395513322f1b801e7bf9c729Steve Block            WillShowDialog,
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block            DocumentWillBecomeInactive
5568513a70bcd92384395513322f1b801e7bf9c729Steve Block        };
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        virtual bool canSuspend() const;
5768513a70bcd92384395513322f1b801e7bf9c729Steve Block        virtual void suspend(ReasonForSuspension);
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        virtual void resume();
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual void stop();
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        template<class T> void setPendingActivity(T* thisObject)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(thisObject == this);
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObject->ref();
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_pendingActivityCount++;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        template<class T> void unsetPendingActivity(T* thisObject)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(m_pendingActivityCount > 0);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            --m_pendingActivityCount;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObject->deref();
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    protected:
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual ~ActiveDOMObject();
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScriptExecutionContext* m_scriptExecutionContext;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned m_pendingActivityCount;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ActiveDOMObject_h
86