Reviewed by Darin and Geoff.
[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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 <wtf/HashMap.h>
26
27 namespace WebCore {
28     class AtomicString;
29     class DOMWindow;
30     class Frame;
31     class FrameView;
32     class JSDOMWindow;
33     class Node;
34 }
35
36 namespace KJS {
37
38     class BarInfo;
39     class FrameArray;
40     class History;
41     class JSEventListener;
42     class JSLazyEventListener;
43     class JSUnprotectedEventListener;
44     class Location;
45     class PausedTimeout;
46     class ScheduledAction;
47     class Selection;
48     class Window;
49     class WindowFunc;
50
51     class PausedTimeouts {
52     public:
53         PausedTimeouts(PausedTimeout *a, size_t length) : m_array(a), m_length(length) { }
54         ~PausedTimeouts();
55
56         size_t numTimeouts() const { return m_length; }
57         PausedTimeout *takeTimeouts()
58             { PausedTimeout *a = m_array; m_array = 0; return a; }
59
60     private:
61         PausedTimeout *m_array;
62         size_t m_length;
63
64         PausedTimeouts(const PausedTimeouts&);
65         PausedTimeouts& operator=(const PausedTimeouts&);
66     };
67
68     class DOMWindowTimer;
69
70   class Screen : public DOMObject {
71   public:
72     enum { Height, Width, ColorDepth, PixelDepth, AvailLeft, AvailTop, AvailHeight, AvailWidth };
73     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
74     JSValue *getValueProperty(ExecState *exec, int token) const;
75     virtual const ClassInfo* classInfo() const { return &info; }
76     static const ClassInfo info;
77   private:
78     friend class Window;
79     Screen(ExecState*, WebCore::Frame*);
80     WebCore::Frame* m_frame;
81   };
82
83   class WindowPrivate;
84
85   class Window : public DOMObject {
86     friend class Location;
87     friend class WindowFunc;
88     friend class ScheduledAction;
89   protected:
90     Window(WebCore::DOMWindow*);
91   public:
92     ~Window();
93     WebCore::DOMWindow* impl() const;
94     void disconnectFrame();
95     /**
96      * Returns and registers a window object. In case there's already a Window
97      * for the specified frame p this will be returned in order to have unique
98      * bindings.
99      */
100     static JSValue* retrieve(WebCore::Frame*);
101     /**
102      * Returns the Window object for a given HTML frame
103      */
104     static Window* retrieveWindow(WebCore::Frame*);
105     /**
106      * returns a pointer to the Window object this javascript interpreting instance
107      * was called from.
108      */
109     static Window* retrieveActive(ExecState*);
110     WebCore::Frame* frame() const { return m_frame; }
111     virtual void mark();
112     virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
113     bool getOverridePropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
114     JSValue *getValueProperty(ExecState *exec, int token) const;
115     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
116     virtual bool toBoolean(ExecState*) const;
117
118     int installTimeout(const UString& handler, int t, bool singleShot);
119     int installTimeout(JSValue* function, const List& args, int t, bool singleShot);
120     void clearTimeout(int timerId, bool delAction = true);
121     PausedTimeouts* pauseTimeouts();
122     void resumeTimeouts(PausedTimeouts*);
123
124     void timerFired(DOMWindowTimer*);
125     
126     KJS::ScriptInterpreter *interpreter() const;
127
128     void scheduleClose();
129         
130     bool isSafeScript(ExecState*) const;
131     static bool isSafeScript(const ScriptInterpreter *origin, const ScriptInterpreter *target);
132     Location *location() const;
133     Selection *selection() const;
134     bool find(const WebCore::String&, bool, bool, bool, bool, bool, bool) const;
135     BarInfo *locationbar(ExecState*) const;
136     BarInfo *menubar(ExecState*) const;
137     BarInfo *personalbar(ExecState*) const;
138     BarInfo *scrollbars(ExecState*) const;
139     BarInfo *statusbar(ExecState*) const;
140     BarInfo *toolbar(ExecState*) const;
141
142     // Finds a wrapper of a JS EventListener, returns 0 if no existing one.
143     JSEventListener* findJSEventListener(JSValue*, bool html = false);
144
145     // Finds or creates a wrapper of a JS EventListener. JS EventListener object is GC-protected.
146     JSEventListener *findOrCreateJSEventListener(JSValue*, bool html = false);
147
148     // Finds a wrapper of a GC-unprotected JS EventListener, returns 0 if no existing one.
149     JSUnprotectedEventListener* findJSUnprotectedEventListener(JSValue*, bool html = false);
150
151     // Finds or creates a wrapper of a JS EventListener. JS EventListener object is *NOT* GC-protected.
152     JSUnprotectedEventListener *findOrCreateJSUnprotectedEventListener(JSValue*, bool html = false);
153
154     void clear();
155     virtual UString toString(ExecState *) const;
156
157     // Set the current "event" object
158     void setCurrentEvent(WebCore::Event*);
159
160     // Set a place to put a dialog return value when the window is cleared.
161     void setReturnValueSlot(JSValue **slot);
162
163     typedef HashMap<JSObject*, JSEventListener*> ListenersMap;
164     typedef HashMap<JSObject*, JSUnprotectedEventListener*> UnprotectedListenersMap;
165     
166     ListenersMap& jsEventListeners();
167     ListenersMap& jsHTMLEventListeners();
168     UnprotectedListenersMap& jsUnprotectedEventListeners();
169     UnprotectedListenersMap& jsUnprotectedHTMLEventListeners();
170     
171     virtual const ClassInfo* classInfo() const { return &info; }
172     static const ClassInfo info;
173     enum { AToB, BToA, Closed, Crypto, DefaultStatus, Status, DOMException, Frames, History_, Event_, InnerHeight,
174            InnerWidth, Length, Location_, Locationbar, Name, Navigator_, ClientInformation,
175            Menubar, OffscreenBuffering, Opener, OuterHeight, OuterWidth, PageXOffset, PageYOffset,
176            Parent, Personalbar, ScreenX, ScreenY, Scrollbars, Scroll, ScrollBy,
177            ScreenTop, ScreenLeft,
178            ScrollTo, ScrollX, ScrollY, MoveBy, MoveTo, ResizeBy, ResizeTo, Self, Window_, Top, Screen_,
179            Image, Option, Alert, Confirm, Prompt, Open, Print, SetTimeout, ClearTimeout,
180            Focus, GetSelection, Blur, Close, SetInterval, ClearInterval, CaptureEvents, 
181            ReleaseEvents, AddEventListener, RemoveEventListener,
182            XMLHttpRequest, XSLTProcessor_,
183            Onabort, Onblur, Onchange, Onclick, Ondblclick, Onerror, 
184            Onfocus, Onkeydown, Onkeypress, Onkeyup, Onload, Onmousedown, Onmousemove,
185            Onmouseout, Onmouseover, Onmouseup, OnWindowMouseWheel, Onreset, Onresize, Onscroll, Onsearch,
186            Onselect, Onsubmit, Onunload, Onbeforeunload,
187            Statusbar, Toolbar, FrameElement, ShowModalDialog, Find, Stop };
188
189   private:
190     JSValue* getListener(ExecState*, const WebCore::AtomicString& eventType) const;
191     void setListener(ExecState*, const WebCore::AtomicString& eventType, JSValue* func);
192
193     static JSValue *childFrameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
194     static JSValue *namedFrameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
195     static JSValue *indexGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
196     static JSValue *namedItemGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
197
198     void updateLayout() const;
199
200     void clearHelperObjectProperties();
201     void clearAllTimeouts();
202     int installTimeout(ScheduledAction*, int interval, bool singleShot);
203
204     WebCore::Frame* m_frame;
205     OwnPtr<WindowPrivate> d;
206   };
207
208   /**
209    * An action (either function or string) to be executed after a specified
210    * time interval, either once or repeatedly. Used for window.setTimeout()
211    * and window.setInterval()
212    */
213     class ScheduledAction {
214     public:
215         ScheduledAction(JSValue *func, const List& args)
216             : m_func(func), m_args(args) { }
217         ScheduledAction(const WebCore::String& code)
218             : m_code(code) { }
219         void execute(Window *);
220
221     private:
222         ProtectedPtr<JSValue> m_func;
223         List m_args;
224         WebCore::String m_code;
225     };
226
227   class Location : public DOMObject {
228   public:
229     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
230     JSValue *getValueProperty(ExecState *exec, int token) const;
231     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
232     virtual JSValue *toPrimitive(ExecState *exec, JSType preferred) const;
233     virtual UString toString(ExecState*) const;
234     enum { Hash, Href, Hostname, Host, Pathname, Port, Protocol, Search, 
235            Replace, Reload, ToString, Assign };
236     WebCore::Frame* frame() const { return m_frame; }
237     virtual const ClassInfo* classInfo() const { return &info; }
238     static const ClassInfo info;
239   private:
240     friend class Window;
241     Location(WebCore::Frame*);
242     WebCore::Frame* m_frame;
243   };
244
245   class Selection : public DOMObject {
246   public:
247     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
248     JSValue *getValueProperty(ExecState *exec, int token) const;
249     virtual JSValue *toPrimitive(ExecState *exec, JSType preferred) const;
250     virtual UString toString(ExecState*) const;
251     enum { AnchorNode, AnchorOffset, FocusNode, FocusOffset, BaseNode, BaseOffset, ExtentNode, ExtentOffset, 
252            IsCollapsed, _Type, RangeCount, Collapse, CollapseToEnd, CollapseToStart, Empty, ToString, 
253            SetBaseAndExtent, SetPosition, Modify, GetRangeAt, RemoveAllRanges, AddRange };
254     WebCore::Frame* frame() const { return m_frame; }
255     virtual const ClassInfo* classInfo() const { return &info; }
256     static const ClassInfo info;
257   private:
258     friend class Window;
259     Selection(WebCore::Frame*);
260     WebCore::Frame* m_frame;
261   };
262
263   class BarInfo : public DOMObject {
264   public:
265     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
266     JSValue *getValueProperty(ExecState *exec, int token) const;
267     enum { Visible };
268     enum Type { Locationbar, Menubar, Personalbar, Scrollbars, Statusbar, Toolbar };
269     WebCore::Frame* frame() const { return m_frame; }
270     virtual const ClassInfo* classInfo() const { return &info; }
271     static const ClassInfo info;
272   private:
273     friend class Window;
274     BarInfo(ExecState*, WebCore::Frame*, Type);
275     WebCore::Frame* m_frame;
276     Type m_type;
277   };
278
279 } // namespace
280
281 namespace WebCore {
282     KJS::JSValue* toJS(KJS::ExecState*, DOMWindow*);
283     DOMWindow* toDOMWindow(KJS::JSValue*);
284 } // namespace WebCore
285
286 #endif