7f9d1a8810e7727912e9e03eec26da0834d3469f
[WebKit-https.git] / WebCore / bindings / js / kjs_window.h
1 /*
2  *  Copyright (C) 2000 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reseved.
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 kjs_window_h
21 #define kjs_window_h
22
23 #include "PlatformString.h"
24 #include "kjs_binding.h"
25 #include <kjs/protect.h>
26 #include <wtf/HashMap.h>
27 #include <wtf/Noncopyable.h>
28 #include <wtf/OwnPtr.h>
29
30 namespace WebCore {
31     class AtomicString;
32     class DOMWindow;
33     class Frame;
34     class JSEventListener;
35     class JSLocation;
36     class JSUnprotectedEventListener;
37     class PausedTimeouts;
38     class ScheduledAction;
39 }
40
41 namespace KJS {
42
43     class DOMWindowTimer;
44     class Window;
45     class WindowFunc;
46     class WindowPrivate;
47
48   // This is the only WebCore JS binding which does not inherit from DOMObject
49   class Window : public JSGlobalObject {
50     typedef JSGlobalObject Base;
51
52     friend class WebCore::ScheduledAction;
53   protected:
54     Window(JSObject* prototype, WebCore::DOMWindow*);
55
56   public:
57     virtual ~Window();
58
59     WebCore::DOMWindow* impl() const { return m_impl.get(); }
60
61     void disconnectFrame();
62
63     // Returns and registers a window object. In case there's already a Window
64     // for the specified frame p this will be returned in order to have unique
65     // bindings.
66     static JSValue* retrieve(WebCore::Frame*);
67
68     // Returns the Window object for a given HTML frame
69     static Window* retrieveWindow(WebCore::Frame*);
70
71     // Returns a pointer to the Window object this javascript interpreting instance 
72     // was called from.
73     static Window* retrieveActive(ExecState*);
74
75     virtual void mark();
76
77     virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
78     JSValue* getValueProperty(ExecState*, int token) const;
79     virtual void put(ExecState*, const Identifier& propertyName, JSValue*, int attr = None);
80
81     int installTimeout(const UString& handler, int t, bool singleShot);
82     int installTimeout(JSValue* function, const List& args, int t, bool singleShot);
83     void clearTimeout(int timerId, bool delAction = true);
84     WebCore::PausedTimeouts* pauseTimeouts();
85     void resumeTimeouts(WebCore::PausedTimeouts*);
86
87     void timerFired(DOMWindowTimer*);
88
89     WebCore::JSLocation* location() const;
90
91     // Finds a wrapper of a JS EventListener, returns 0 if no existing one.
92     WebCore::JSEventListener* findJSEventListener(JSValue*, bool html = false);
93
94     // Finds or creates a wrapper of a JS EventListener. JS EventListener object is GC-protected.
95     WebCore::JSEventListener *findOrCreateJSEventListener(JSValue*, bool html = false);
96
97     // Finds a wrapper of a GC-unprotected JS EventListener, returns 0 if no existing one.
98     WebCore::JSUnprotectedEventListener* findJSUnprotectedEventListener(JSValue*, bool html = false);
99
100     // Finds or creates a wrapper of a JS EventListener. JS EventListener object is *NOT* GC-protected.
101     WebCore::JSUnprotectedEventListener *findOrCreateJSUnprotectedEventListener(JSValue*, bool html = false);
102
103     void clear();
104
105     void setCurrentEvent(WebCore::Event*);
106     WebCore::Event* currentEvent();
107
108     // Set a place to put a dialog return value when the window is cleared.
109     void setReturnValueSlot(JSValue** slot);
110
111     typedef HashMap<JSObject*, WebCore::JSEventListener*> ListenersMap;
112     typedef HashMap<JSObject*, WebCore::JSUnprotectedEventListener*> UnprotectedListenersMap;
113     
114     ListenersMap& jsEventListeners();
115     ListenersMap& jsHTMLEventListeners();
116     UnprotectedListenersMap& jsUnprotectedEventListeners();
117     UnprotectedListenersMap& jsUnprotectedHTMLEventListeners();
118     
119     virtual const ClassInfo* classInfo() const { return &info; }
120     static const ClassInfo info;
121
122     virtual ExecState* globalExec();
123
124     virtual bool shouldInterruptScript() const;
125
126     virtual bool allowsAccessFrom(const JSGlobalObject*) const;
127     bool allowsAccessFrom(ExecState* exec) const { return allowsAccessFrom(exec->dynamicGlobalObject()); }
128
129     virtual void getPropertyNames(ExecState*, PropertyNameArray&);
130
131     enum {
132         // Attributes
133         Crypto, Event_, Location_, Navigator_,
134         ClientInformation,
135
136         // Event Listeners
137         Onabort, Onblur, Onchange, Onclick,
138         Ondblclick, Onerror, Onfocus, Onkeydown,
139         Onkeypress, Onkeyup, Onload, Onmousedown,
140         Onmousemove, Onmouseout, Onmouseover, Onmouseup,
141         OnWindowMouseWheel, Onreset, Onresize, Onscroll,
142         Onsearch, Onselect, Onsubmit, Onunload,
143         Onbeforeunload,
144
145         // Constructors
146         DOMException, Audio, Image, Option, XMLHttpRequest,
147         XSLTProcessor_
148     };
149
150   private:
151     JSValue* getListener(ExecState*, const WebCore::AtomicString& eventType) const;
152     void setListener(ExecState*, const WebCore::AtomicString& eventType, JSValue* func);
153
154     static JSValue* childFrameGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
155     static JSValue* namedFrameGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
156     static JSValue* indexGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
157     static JSValue* namedItemGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
158
159     void clearHelperObjectProperties();
160     void clearAllTimeouts();
161     int installTimeout(WebCore::ScheduledAction*, int interval, bool singleShot);
162
163     RefPtr<WebCore::DOMWindow> m_impl;
164     OwnPtr<WindowPrivate> d;
165   };
166
167   // Functions
168   JSValue* windowProtoFuncAToB(ExecState*, JSObject*, const List&);
169   JSValue* windowProtoFuncBToA(ExecState*, JSObject*, const List&);
170   JSValue* windowProtoFuncOpen(ExecState*, JSObject*, const List&);
171   JSValue* windowProtoFuncSetTimeout(ExecState*, JSObject*, const List&);
172   JSValue* windowProtoFuncClearTimeout(ExecState*, JSObject*, const List&);
173   JSValue* windowProtoFuncSetInterval(ExecState*, JSObject*, const List&);
174   JSValue* windowProtoFuncAddEventListener(ExecState*, JSObject*, const List&);
175   JSValue* windowProtoFuncRemoveEventListener(ExecState*, JSObject*, const List&);
176   JSValue* windowProtoFuncShowModalDialog(ExecState*, JSObject*, const List&);
177   JSValue* windowProtoFuncNotImplemented(ExecState*, JSObject*, const List&);
178
179 } // namespace KJS
180
181 namespace WebCore {
182     KJS::JSValue* toJS(KJS::ExecState*, DOMWindow*);
183 } // namespace WebCore
184
185 #endif // kjs_window_h