5f26c3b153485dc76fabb86d5924f426fd3dde7e
[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 "PlatformString.h"
25 #include <runtime/Protect.h>
26
27 namespace WebCore {
28
29     class Event;
30     class JSDOMGlobalObject;
31     class Node;
32
33     class JSAbstractEventListener : public EventListener {
34     public:
35         virtual void handleEvent(Event*, bool isWindowEvent);
36         virtual bool isInline() const;
37         virtual JSC::JSObject* listenerObj() const = 0;
38         virtual JSDOMGlobalObject* globalObject() const = 0;
39
40     protected:
41         JSAbstractEventListener(bool isInline)
42             : m_isInline(isInline)
43         {
44         }
45
46     private:
47         bool m_isInline;
48     };
49
50     class JSEventListener : public JSAbstractEventListener {
51     public:
52         static PassRefPtr<JSEventListener> create(JSC::JSObject* listener, JSDOMGlobalObject* globalObject, bool isInline)
53         {
54             return adoptRef(new JSEventListener(listener, globalObject, isInline));
55         }
56         virtual ~JSEventListener();
57
58         virtual JSC::JSObject* listenerObj() const;
59         virtual JSDOMGlobalObject* globalObject() const;
60         void clearGlobalObject();
61         void mark();
62
63     private:
64         JSEventListener(JSC::JSObject* listener, JSDOMGlobalObject*, bool isInline);
65
66         JSC::JSObject* m_listener;
67         JSDOMGlobalObject* m_globalObject;
68     };
69
70     class JSProtectedEventListener : public JSAbstractEventListener {
71     public:
72         static PassRefPtr<JSProtectedEventListener> create(JSC::JSObject* listener, JSDOMGlobalObject* globalObject, bool isInline)
73         {
74             return adoptRef(new JSProtectedEventListener(listener, globalObject, isInline));
75         }
76         virtual ~JSProtectedEventListener();
77
78         virtual JSC::JSObject* listenerObj() const;
79         virtual JSDOMGlobalObject* globalObject() const;
80         void clearGlobalObject();
81
82     protected:
83         JSProtectedEventListener(JSC::JSObject* listener, JSDOMGlobalObject*, bool isInline);
84
85         mutable JSC::ProtectedPtr<JSC::JSObject> m_listener;
86
87     private:
88         JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
89     };
90
91     class JSLazyEventListener : public JSProtectedEventListener {
92     public:
93         enum LazyEventListenerType {
94             HTMLLazyEventListener
95 #if ENABLE(SVG)
96             , SVGLazyEventListener
97 #endif
98         };
99
100         virtual bool wasCreatedFromMarkup() const { return true; }
101
102         static PassRefPtr<JSLazyEventListener> create(LazyEventListenerType type, const String& functionName, const String& code, JSDOMGlobalObject* globalObject, Node* node, int lineNumber)
103         {
104             return adoptRef(new JSLazyEventListener(type, functionName, code, globalObject, node, lineNumber));
105         }
106         virtual JSC::JSObject* listenerObj() const;
107
108     protected:
109         JSLazyEventListener(LazyEventListenerType type, const String& functionName, const String& code, JSDOMGlobalObject*, Node*, int lineNumber);
110
111     private:
112         void parseCode() const;
113
114         mutable String m_functionName;
115         mutable String m_code;
116         mutable bool m_parsed;
117         int m_lineNumber;
118         Node* m_originalNode;
119
120         LazyEventListenerType m_type;
121     };
122
123 } // namespace WebCore
124
125 #endif // JSEventListener_h