b6f82bebefbee0a6a6721bd0f5be95b5a5966eff
[WebKit-https.git] / WebCore / bindings / js / JSDOMWindowBase.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 JSDOMWindowBase_h
21 #define JSDOMWindowBase_h
22
23 #include "PlatformString.h"
24 #include "JSDOMBinding.h"
25 #include <kjs/protect.h>
26 #include <wtf/HashMap.h>
27 #include <wtf/OwnPtr.h>
28
29 namespace KJS {
30     class ExecState;
31 }
32
33 namespace WebCore {
34
35     class AtomicString;
36     class DOMWindow;
37     class DOMWindowTimer;
38     class Frame;
39     class JSDOMWindow;
40     class JSDOMWindowShell;
41     class JSEventListener;
42     class JSLocation;
43     class JSUnprotectedEventListener;
44     class PausedTimeouts;
45     class ScheduledAction;
46     class SecurityOrigin;
47
48     class JSDOMWindowBasePrivate;
49
50     // This is the only WebCore JS binding which does not inherit from DOMObject
51     class JSDOMWindowBase : public KJS::JSGlobalObject {
52         typedef KJS::JSGlobalObject Base;
53
54         friend class ScheduledAction;
55     protected:
56         JSDOMWindowBase(KJS::JSObject* prototype, DOMWindow*, JSDOMWindowShell*);
57
58     public:
59         virtual ~JSDOMWindowBase();
60
61         void updateDocument();
62
63         DOMWindow* impl() const { return m_impl.get(); }
64
65         void disconnectFrame();
66
67         virtual bool getOwnPropertySlot(KJS::ExecState*, const KJS::Identifier&, KJS::PropertySlot&);
68         KJS::JSValue* getValueProperty(KJS::ExecState*, int token) const;
69         virtual void put(KJS::ExecState*, const KJS::Identifier& propertyName, KJS::JSValue*);
70
71         int installTimeout(const KJS::UString& handler, int t, bool singleShot);
72         int installTimeout(KJS::JSValue* function, const KJS::ArgList& args, int t, bool singleShot);
73         void clearTimeout(int timerId, bool delAction = true);
74         PausedTimeouts* pauseTimeouts();
75         void resumeTimeouts(PausedTimeouts*);
76
77         void timerFired(DOMWindowTimer*);
78
79         // Finds a wrapper of a JS EventListener, returns 0 if no existing one.
80         JSEventListener* findJSEventListener(KJS::JSValue*, bool html = false);
81
82         // Finds or creates a wrapper of a JS EventListener. JS EventListener object is GC-protected.
83         PassRefPtr<JSEventListener> findOrCreateJSEventListener(KJS::ExecState*, KJS::JSValue*, bool html = false);
84
85         // Finds a wrapper of a GC-unprotected JS EventListener, returns 0 if no existing one.
86         JSUnprotectedEventListener* findJSUnprotectedEventListener(KJS::ExecState*, KJS::JSValue*, bool html = false);
87
88         // Finds or creates a wrapper of a JS EventListener. JS EventListener object is *NOT* GC-protected.
89         PassRefPtr<JSUnprotectedEventListener> findOrCreateJSUnprotectedEventListener(KJS::ExecState*, KJS::JSValue*, bool html = false);
90
91         void clear();
92
93         void setCurrentEvent(Event*);
94         Event* currentEvent();
95
96         // Set a place to put a dialog return value when the window is cleared.
97         void setReturnValueSlot(KJS::JSValue** slot);
98
99         typedef HashMap<KJS::JSObject*, JSEventListener*> ListenersMap;
100         typedef HashMap<KJS::JSObject*, JSUnprotectedEventListener*> UnprotectedListenersMap;
101
102         ListenersMap& jsEventListeners();
103         ListenersMap& jsHTMLEventListeners();
104         UnprotectedListenersMap& jsUnprotectedEventListeners();
105         UnprotectedListenersMap& jsUnprotectedHTMLEventListeners();
106
107         virtual const KJS::ClassInfo* classInfo() const { return &s_info; }
108         static const KJS::ClassInfo s_info;
109
110         virtual KJS::ExecState* globalExec();
111
112         virtual bool shouldInterruptScript() const;
113
114         bool allowsAccessFrom(KJS::ExecState*) const;
115         bool allowsAccessFromNoErrorMessage(KJS::ExecState*) const;
116         bool allowsAccessFrom(KJS::ExecState*, String& message) const;
117
118         void printErrorMessage(const String&) const;
119
120         // Don't call this version of allowsAccessFrom -- it's a slightly incorrect implementation used only by WebScriptObject
121         virtual bool allowsAccessFrom(const KJS::JSGlobalObject*) const;
122
123         virtual KJS::JSObject* toThisObject(KJS::ExecState*) const;
124         JSDOMWindowShell* shell() const;
125
126         static KJS::JSGlobalData* commonJSGlobalData();
127
128         enum {
129             // Attributes
130             Crypto, Event_,
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             Audio, Image, Option, XMLHttpRequest,
143             XSLTProcessor
144         };
145
146     private:
147         KJS::JSValue* getListener(KJS::ExecState*, const AtomicString& eventType) const;
148         void setListener(KJS::ExecState*, const AtomicString& eventType, KJS::JSValue* function);
149
150         static KJS::JSValue* childFrameGetter(KJS::ExecState*, const KJS::Identifier&, const KJS::PropertySlot&);
151         static KJS::JSValue* indexGetter(KJS::ExecState*, const KJS::Identifier&, const KJS::PropertySlot&);
152         static KJS::JSValue* namedItemGetter(KJS::ExecState*, const KJS::Identifier&, const KJS::PropertySlot&);
153
154         void clearHelperObjectProperties();
155         void clearAllTimeouts();
156         int installTimeout(ScheduledAction*, int interval, bool singleShot);
157
158         bool allowsAccessFromPrivate(const KJS::JSGlobalObject*) const;
159         String crossDomainAccessErrorMessage(const KJS::JSGlobalObject*) const;
160
161         RefPtr<DOMWindow> m_impl;
162         OwnPtr<JSDOMWindowBasePrivate> d;
163     };
164
165     // Returns a JSDOMWindow or jsNull()
166     KJS::JSValue* toJS(KJS::ExecState*, DOMWindow*);
167
168     // Returns JSDOMWindow or 0
169     JSDOMWindow* toJSDOMWindow(Frame*);
170     JSDOMWindow* toJSDOMWindow(KJS::JSValue*);
171
172 } // namespace WebCore
173
174 #endif // JSDOMWindowBase_h