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