WebCore: Adding support for the optional creation callback that could be
[WebKit-https.git] / WebCore / page / DOMWindow.h
1 /*
2  * Copyright (C) 2006, 2007, 2009 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef DOMWindow_h
27 #define DOMWindow_h
28
29 #include "EventTarget.h"
30 #include "KURL.h"
31 #include "MessagePort.h"
32 #include "PlatformString.h"
33 #include "RegisteredEventListener.h"
34 #include "SecurityOrigin.h"
35 #include <wtf/Forward.h>
36 #include <wtf/RefCounted.h>
37 #include <wtf/RefPtr.h>
38
39 namespace WebCore {
40
41     class BarInfo;
42     class BeforeUnloadEvent;
43     class CSSRuleList;
44     class CSSStyleDeclaration;
45     class Console;
46     class DOMSelection;
47     class Database;
48     class DatabaseCallback;
49     class Document;
50     class Element;
51     class Event;
52     class EventListener;
53     class FloatRect;
54     class Frame;
55     class History;
56     class IndexedDatabaseRequest;
57     class InspectorTimelineAgent;
58     class Location;
59     class Media;
60     class Navigator;
61     class Node;
62     class NotificationCenter;
63     class PostMessageTimer;
64     class ScheduledAction;
65     class SerializedScriptValue;
66     class Screen;
67     class WebKitPoint;
68
69 #if ENABLE(DOM_STORAGE)
70     class Storage;
71 #endif
72
73 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
74     class DOMApplicationCache;
75 #endif
76
77     typedef int ExceptionCode;
78
79     class DOMWindow : public RefCounted<DOMWindow>, public EventTarget {
80     public:
81         static PassRefPtr<DOMWindow> create(Frame* frame) { return adoptRef(new DOMWindow(frame)); }
82         virtual ~DOMWindow();
83
84         virtual DOMWindow* toDOMWindow() { return this; }
85         virtual ScriptExecutionContext* scriptExecutionContext() const;
86
87         Frame* frame() const { return m_frame; }
88         void disconnectFrame();
89
90         void clear();
91
92 #if ENABLE(ORIENTATION_EVENTS)
93         // This is the interface orientation in degrees. Some examples are:
94         //  0 is straight up; -90 is when the device is rotated 90 clockwise;
95         //  90 is when rotated counter clockwise.
96         int orientation() const;
97 #endif
98
99         void setSecurityOrigin(SecurityOrigin* securityOrigin) { m_securityOrigin = securityOrigin; }
100         SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); }
101
102         void setURL(const KURL& url) { m_url = url; }
103         KURL url() const { return m_url; }
104
105         unsigned pendingUnloadEventListeners() const;
106
107         static bool dispatchAllPendingBeforeUnloadEvents();
108         static void dispatchAllPendingUnloadEvents();
109
110         static void adjustWindowRect(const FloatRect& screen, FloatRect& window, const FloatRect& pendingChanges);
111         static void parseModalDialogFeatures(const String& featuresArg, HashMap<String, String>& map);
112
113         static bool allowPopUp(Frame* activeFrame);
114         static bool canShowModalDialog(const Frame*);
115         static bool canShowModalDialogNow(const Frame*);
116
117         // DOM Level 0
118         Screen* screen() const;
119         History* history() const;
120         BarInfo* locationbar() const;
121         BarInfo* menubar() const;
122         BarInfo* personalbar() const;
123         BarInfo* scrollbars() const;
124         BarInfo* statusbar() const;
125         BarInfo* toolbar() const;
126         Navigator* navigator() const;
127         Navigator* clientInformation() const { return navigator(); }
128         Location* location() const;
129
130         DOMSelection* getSelection();
131
132         Element* frameElement() const;
133
134         void focus();
135         void blur();
136         void close();
137         void print();
138         void stop();
139
140         void alert(const String& message);
141         bool confirm(const String& message);
142         String prompt(const String& message, const String& defaultValue);
143         String btoa(const String& stringToEncode, ExceptionCode&);
144         String atob(const String& encodedString, ExceptionCode&);
145
146         bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const;
147
148         bool offscreenBuffering() const;
149
150         int outerHeight() const;
151         int outerWidth() const;
152         int innerHeight() const;
153         int innerWidth() const;
154         int screenX() const;
155         int screenY() const;
156         int screenLeft() const { return screenX(); }
157         int screenTop() const { return screenY(); }
158         int scrollX() const;
159         int scrollY() const;
160         int pageXOffset() const { return scrollX(); }
161         int pageYOffset() const { return scrollY(); }
162
163         bool closed() const;
164
165         unsigned length() const;
166
167         String name() const;
168         void setName(const String&);
169
170         String status() const;
171         void setStatus(const String&);
172         String defaultStatus() const;
173         void setDefaultStatus(const String&);
174         // This attribute is an alias of defaultStatus and is necessary for legacy uses.
175         String defaultstatus() const { return defaultStatus(); }
176         void setDefaultstatus(const String& status) { setDefaultStatus(status); }
177
178         // Self referential attributes
179         DOMWindow* self() const;
180         DOMWindow* window() const { return self(); }
181         DOMWindow* frames() const { return self(); }
182
183         DOMWindow* opener() const;
184         DOMWindow* parent() const;
185         DOMWindow* top() const;
186
187         // DOM Level 2 AbstractView Interface
188         Document* document() const;
189         // CSSOM View Module
190         PassRefPtr<Media> media() const;
191
192         // DOM Level 2 Style Interface
193         PassRefPtr<CSSStyleDeclaration> getComputedStyle(Element*, const String& pseudoElt) const;
194
195         // WebKit extensions
196         PassRefPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt, bool authorOnly = true) const;
197         double devicePixelRatio() const;
198
199         PassRefPtr<WebKitPoint> webkitConvertPointFromPageToNode(Node* node, const WebKitPoint* p) const;
200         PassRefPtr<WebKitPoint> webkitConvertPointFromNodeToPage(Node* node, const WebKitPoint* p) const;        
201
202 #if ENABLE(DATABASE)
203         // HTML 5 client-side database
204         PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode&);
205 #endif
206
207 #if ENABLE(DOM_STORAGE)
208         // HTML 5 key/value storage
209         Storage* sessionStorage() const;
210         Storage* localStorage() const;
211 #endif
212
213         Console* console() const;
214
215 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
216         DOMApplicationCache* applicationCache() const;
217 #endif
218
219 #if ENABLE(NOTIFICATIONS)
220         NotificationCenter* webkitNotifications() const;
221 #endif
222
223 #if ENABLE(INDEXED_DATABASE)
224         IndexedDatabaseRequest* indexedDB() const;
225 #endif
226
227         void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
228         // FIXME: remove this when we update the ObjC bindings (bug #28774).
229         void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
230         void postMessageTimerFired(PostMessageTimer*);
231
232         void scrollBy(int x, int y) const;
233         void scrollTo(int x, int y) const;
234         void scroll(int x, int y) const { scrollTo(x, y); }
235
236         void moveBy(float x, float y) const;
237         void moveTo(float x, float y) const;
238
239         void resizeBy(float x, float y) const;
240         void resizeTo(float width, float height) const;
241
242         // Timers
243         int setTimeout(PassOwnPtr<ScheduledAction>, int timeout, ExceptionCode&);
244         void clearTimeout(int timeoutId);
245         int setInterval(PassOwnPtr<ScheduledAction>, int timeout, ExceptionCode&);
246         void clearInterval(int timeoutId);
247
248         // Events
249         // EventTarget API
250         virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
251         virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
252         virtual void removeAllEventListeners();
253
254         using EventTarget::dispatchEvent;
255         bool dispatchEvent(PassRefPtr<Event> prpEvent, PassRefPtr<EventTarget> prpTarget);
256         void dispatchLoadEvent();
257
258         DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
259         DEFINE_ATTRIBUTE_EVENT_LISTENER(beforeunload);
260         DEFINE_ATTRIBUTE_EVENT_LISTENER(blur);
261         DEFINE_ATTRIBUTE_EVENT_LISTENER(canplay);
262         DEFINE_ATTRIBUTE_EVENT_LISTENER(canplaythrough);
263         DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
264         DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
265         DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu);
266         DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick);
267         DEFINE_ATTRIBUTE_EVENT_LISTENER(drag);
268         DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend);
269         DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter);
270         DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave);
271         DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover);
272         DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart);
273         DEFINE_ATTRIBUTE_EVENT_LISTENER(drop);
274         DEFINE_ATTRIBUTE_EVENT_LISTENER(durationchange);
275         DEFINE_ATTRIBUTE_EVENT_LISTENER(emptied);
276         DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
277         DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
278         DEFINE_ATTRIBUTE_EVENT_LISTENER(focus);
279         DEFINE_ATTRIBUTE_EVENT_LISTENER(hashchange);
280         DEFINE_ATTRIBUTE_EVENT_LISTENER(input);
281         DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid);
282         DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown);
283         DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress);
284         DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup);
285         DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
286         DEFINE_ATTRIBUTE_EVENT_LISTENER(loadeddata);
287         DEFINE_ATTRIBUTE_EVENT_LISTENER(loadedmetadata);
288         DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
289         DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
290         DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown);
291         DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove);
292         DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout);
293         DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover);
294         DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup);
295         DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel);
296         DEFINE_ATTRIBUTE_EVENT_LISTENER(offline);
297         DEFINE_ATTRIBUTE_EVENT_LISTENER(online);
298         DEFINE_ATTRIBUTE_EVENT_LISTENER(pagehide);
299         DEFINE_ATTRIBUTE_EVENT_LISTENER(pageshow);
300         DEFINE_ATTRIBUTE_EVENT_LISTENER(pause);
301         DEFINE_ATTRIBUTE_EVENT_LISTENER(play);
302         DEFINE_ATTRIBUTE_EVENT_LISTENER(playing);
303         DEFINE_ATTRIBUTE_EVENT_LISTENER(popstate);
304         DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
305         DEFINE_ATTRIBUTE_EVENT_LISTENER(ratechange);
306         DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
307         DEFINE_ATTRIBUTE_EVENT_LISTENER(resize);
308         DEFINE_ATTRIBUTE_EVENT_LISTENER(scroll);
309         DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
310         DEFINE_ATTRIBUTE_EVENT_LISTENER(seeked);
311         DEFINE_ATTRIBUTE_EVENT_LISTENER(seeking);
312         DEFINE_ATTRIBUTE_EVENT_LISTENER(select);
313         DEFINE_ATTRIBUTE_EVENT_LISTENER(stalled);
314         DEFINE_ATTRIBUTE_EVENT_LISTENER(storage);
315         DEFINE_ATTRIBUTE_EVENT_LISTENER(submit);
316         DEFINE_ATTRIBUTE_EVENT_LISTENER(suspend);
317         DEFINE_ATTRIBUTE_EVENT_LISTENER(timeupdate);
318         DEFINE_ATTRIBUTE_EVENT_LISTENER(unload);
319         DEFINE_ATTRIBUTE_EVENT_LISTENER(volumechange);
320         DEFINE_ATTRIBUTE_EVENT_LISTENER(waiting);
321         DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitbeginfullscreen);
322         DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitendfullscreen);
323
324 #if ENABLE(ORIENTATION_EVENTS)
325         DEFINE_ATTRIBUTE_EVENT_LISTENER(orientationchange);
326 #endif
327
328         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart);
329         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationiteration, webkitAnimationIteration);
330         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd);
331         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd);
332
333 #if ENABLE(TOUCH_EVENTS)
334         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
335         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
336         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
337         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
338 #endif
339         void captureEvents();
340         void releaseEvents();
341
342         // These methods are used for GC marking. See JSDOMWindow::markChildren(MarkStack&) in
343         // JSDOMWindowCustom.cpp.
344         Screen* optionalScreen() const { return m_screen.get(); }
345         DOMSelection* optionalSelection() const { return m_selection.get(); }
346         History* optionalHistory() const { return m_history.get(); }
347         BarInfo* optionalLocationbar() const { return m_locationbar.get(); }
348         BarInfo* optionalMenubar() const { return m_menubar.get(); }
349         BarInfo* optionalPersonalbar() const { return m_personalbar.get(); }
350         BarInfo* optionalScrollbars() const { return m_scrollbars.get(); }
351         BarInfo* optionalStatusbar() const { return m_statusbar.get(); }
352         BarInfo* optionalToolbar() const { return m_toolbar.get(); }
353         Console* optionalConsole() const { return m_console.get(); }
354         Navigator* optionalNavigator() const { return m_navigator.get(); }
355         Location* optionalLocation() const { return m_location.get(); }
356         Media* optionalMedia() const { return m_media.get(); }
357 #if ENABLE(DOM_STORAGE)
358         Storage* optionalSessionStorage() const { return m_sessionStorage.get(); }
359         Storage* optionalLocalStorage() const { return m_localStorage.get(); }
360 #endif
361 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
362         DOMApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); }
363 #endif
364
365         using RefCounted<DOMWindow>::ref;
366         using RefCounted<DOMWindow>::deref;
367
368     private:
369         DOMWindow(Frame*);
370
371         virtual void refEventTarget() { ref(); }
372         virtual void derefEventTarget() { deref(); }
373         virtual EventTargetData* eventTargetData();
374         virtual EventTargetData* ensureEventTargetData();
375         InspectorTimelineAgent* inspectorTimelineAgent();
376
377         RefPtr<SecurityOrigin> m_securityOrigin;
378         KURL m_url;
379
380         Frame* m_frame;
381         mutable RefPtr<Screen> m_screen;
382         mutable RefPtr<DOMSelection> m_selection;
383         mutable RefPtr<History> m_history;
384         mutable RefPtr<BarInfo> m_locationbar;
385         mutable RefPtr<BarInfo> m_menubar;
386         mutable RefPtr<BarInfo> m_personalbar;
387         mutable RefPtr<BarInfo> m_scrollbars;
388         mutable RefPtr<BarInfo> m_statusbar;
389         mutable RefPtr<BarInfo> m_toolbar;
390         mutable RefPtr<Console> m_console;
391         mutable RefPtr<Navigator> m_navigator;
392         mutable RefPtr<Location> m_location;
393         mutable RefPtr<Media> m_media;
394 #if ENABLE(DOM_STORAGE)
395         mutable RefPtr<Storage> m_sessionStorage;
396         mutable RefPtr<Storage> m_localStorage;
397 #endif
398 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
399         mutable RefPtr<DOMApplicationCache> m_applicationCache;
400 #endif
401 #if ENABLE(NOTIFICATIONS)
402         mutable RefPtr<NotificationCenter> m_notifications;
403 #endif
404
405         EventTargetData m_eventTargetData;
406     };
407
408 } // namespace WebCore
409
410 #endif // DOMWindow_h