f3e413fbe4532541960bd1818ef65ed60939ef80
[WebKit-https.git] / WebCore / bindings / js / JSEventListener.h
1 /*
2  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
3  *  Copyright (C) 2003, 2008 Apple Inc. All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #ifndef JSEventListener_h
21 #define JSEventListener_h
22
23 #include "EventListener.h"
24 #include <runtime/Protect.h>
25
26 namespace WebCore {
27
28     class Event;
29     class JSDOMGlobalObject;
30     class Node;
31
32     class JSAbstractEventListener : public EventListener {
33     public:
34         virtual void handleEvent(Event*, bool isWindowEvent);
35         virtual bool isInline() const;
36         virtual JSC::JSObject* listenerObj() const = 0;
37         virtual JSDOMGlobalObject* globalObject() const = 0;
38
39     protected:
40         JSAbstractEventListener(bool isInline)
41             : m_isInline(isInline)
42         {
43         }
44
45     private:
46         bool m_isInline;
47     };
48
49     class JSEventListener : public JSAbstractEventListener {
50     public:
51         static PassRefPtr<JSEventListener> create(JSC::JSObject* listener, JSDOMGlobalObject* globalObject, bool isInline)
52         {
53             return adoptRef(new JSEventListener(listener, globalObject, isInline));
54         }
55         virtual ~JSEventListener();
56
57         virtual JSC::JSObject* listenerObj() const;
58         virtual JSDOMGlobalObject* globalObject() const;
59         void clearGlobalObject();
60         void mark();
61
62     private:
63         JSEventListener(JSC::JSObject* listener, JSDOMGlobalObject*, bool isInline);
64
65         JSC::JSObject* m_listener;
66         JSDOMGlobalObject* m_globalObject;
67     };
68
69     class JSProtectedEventListener : public JSAbstractEventListener {
70     public:
71         static PassRefPtr<JSProtectedEventListener> create(JSC::JSObject* listener, JSDOMGlobalObject* globalObject, bool isInline)
72         {
73             return adoptRef(new JSProtectedEventListener(listener, globalObject, isInline));
74         }
75         virtual ~JSProtectedEventListener();
76
77         virtual JSC::JSObject* listenerObj() const;
78         virtual JSDOMGlobalObject* globalObject() const;
79         void clearGlobalObject();
80
81     protected:
82         JSProtectedEventListener(JSC::JSObject* listener, JSDOMGlobalObject*, bool isInline);
83
84         mutable JSC::ProtectedPtr<JSC::JSObject> m_listener;
85
86     private:
87         JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
88     };
89
90 } // namespace WebCore
91
92 #endif // JSEventListener_h