Reviewed by 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., 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 Location;
38     class PausedTimeouts;
39     class ScheduledAction;
40 }
41
42 namespace KJS {
43
44     class DOMWindowTimer;
45     class Window;
46     class WindowFunc;
47     class WindowPrivate;
48
49   // This is the only WebCore JS binding which does not inherit from DOMObject
50   class Window : public JSGlobalObject {
51     friend class WebCore::JSLocation;
52     friend class WebCore::ScheduledAction;
53   protected:
54     Window(WebCore::DOMWindow*, JSValue* prototype);
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     enum {
130         // Attributes
131         Crypto, Event_, Location_, Navigator_,
132         ClientInformation,
133
134         // Event Listeners
135         Onabort, Onblur, Onchange, Onclick,
136         Ondblclick, Onerror, Onfocus, Onkeydown,
137         Onkeypress, Onkeyup, Onload, Onmousedown,
138         Onmousemove, Onmouseout, Onmouseover, Onmouseup,
139         OnWindowMouseWheel, Onreset, Onresize, Onscroll,
140         Onsearch, Onselect, Onsubmit, Onunload,
141         Onbeforeunload,
142
143         // Constructors
144         DOMException, Audio, Image, Option, XMLHttpRequest,
145         XSLTProcessor_
146     };
147
148   private:
149     JSValue* getListener(ExecState*, const WebCore::AtomicString& eventType) const;
150     void setListener(ExecState*, const WebCore::AtomicString& eventType, JSValue* func);
151
152     static JSValue* childFrameGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
153     static JSValue* namedFrameGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
154     static JSValue* indexGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
155     static JSValue* namedItemGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
156
157     void clearHelperObjectProperties();
158     void clearAllTimeouts();
159     int installTimeout(WebCore::ScheduledAction*, int interval, bool singleShot);
160
161     RefPtr<WebCore::DOMWindow> m_impl;
162     OwnPtr<WindowPrivate> d;
163   };
164
165 #define FOR_EACH_CLASS(macro) \
166     macro(WindowProtoFuncAToB) \
167     macro(WindowProtoFuncBToA) \
168     macro(WindowProtoFuncOpen) \
169     macro(WindowProtoFuncSetTimeout) \
170     macro(WindowProtoFuncClearTimeout) \
171     macro(WindowProtoFuncSetInterval) \
172     macro(WindowProtoFuncAddEventListener) \
173     macro(WindowProtoFuncRemoveEventListener) \
174     macro(WindowProtoFuncShowModalDialog) \
175     macro(WindowProtoFuncNotImplemented) \
176
177 FOR_EACH_CLASS(KJS_IMPLEMENT_PROTOTYPE_FUNCTION_WITH_CREATE)
178 #undef FOR_EACH_CLASS
179
180 } // namespace KJS
181
182 namespace WebCore {
183     KJS::JSValue* toJS(KJS::ExecState*, DOMWindow*);
184 } // namespace WebCore
185
186 #endif // kjs_window_h