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