• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #ifndef DOMWindow_h
28 #define DOMWindow_h
29 
30 #include "bindings/v8/ScriptWrappable.h"
31 #include "core/events/EventTarget.h"
32 #include "core/frame/FrameDestructionObserver.h"
33 #include "platform/LifecycleContext.h"
34 #include "platform/Supplementable.h"
35 
36 #include "wtf/Forward.h"
37 
38 namespace WebCore {
39     class ApplicationCache;
40     class BarProp;
41     class CSSRuleList;
42     class CSSStyleDeclaration;
43     class Console;
44     class DOMPoint;
45     class DOMSelection;
46     class DOMURL;
47     class DOMWindowProperty;
48     class Database;
49     class DatabaseCallback;
50     class Document;
51     class DocumentInit;
52     class DOMWindowEventQueue;
53     class DOMWindowLifecycleNotifier;
54     class Element;
55     class EventListener;
56     class EventQueue;
57     class ExceptionState;
58     class FloatRect;
59     class Frame;
60     class History;
61     class IDBFactory;
62     class Location;
63     class MediaQueryList;
64     class MessageEvent;
65     class Navigator;
66     class Node;
67     class Page;
68     class PageConsole;
69     class Performance;
70     class PostMessageTimer;
71     class RequestAnimationFrameCallback;
72     class ScheduledAction;
73     class Screen;
74     class ScriptCallStack;
75     class SecurityOrigin;
76     class SerializedScriptValue;
77     class Storage;
78     class StyleMedia;
79     class DOMWindowCSS;
80 
81     struct WindowFeatures;
82 
83     typedef Vector<RefPtr<MessagePort>, 1> MessagePortArray;
84 
85 enum PageshowEventPersistence {
86     PageshowEventNotPersisted = 0,
87     PageshowEventPersisted = 1
88 };
89 
90     enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList };
91 
92     class DOMWindow : public RefCounted<DOMWindow>, public ScriptWrappable, public EventTargetWithInlineData, public FrameDestructionObserver, public Supplementable<DOMWindow>, public LifecycleContext<DOMWindow> {
93         REFCOUNTED_EVENT_TARGET(DOMWindow);
94     public:
95         static PassRefPtr<Document> createDocument(const String& mimeType, const DocumentInit&, bool forceXHTML);
create(Frame * frame)96         static PassRefPtr<DOMWindow> create(Frame* frame) { return adoptRef(new DOMWindow(frame)); }
97         virtual ~DOMWindow();
98 
99         PassRefPtr<Document> installNewDocument(const String& mimeType, const DocumentInit&, bool forceXHTML = false);
100 
101         virtual const AtomicString& interfaceName() const OVERRIDE;
102         virtual ExecutionContext* executionContext() const OVERRIDE;
103 
104         virtual DOMWindow* toDOMWindow();
105 
106         void registerProperty(DOMWindowProperty*);
107         void unregisterProperty(DOMWindowProperty*);
108 
109         void reset();
110 
111         PassRefPtr<MediaQueryList> matchMedia(const String&);
112 
113         unsigned pendingUnloadEventListeners() const;
114 
115         static FloatRect adjustWindowRect(Page*, const FloatRect& pendingChanges);
116 
117         bool allowPopUp(); // Call on first window, not target window.
118         static bool allowPopUp(Frame* firstFrame);
119         static bool canShowModalDialog(const Frame*);
120         static bool canShowModalDialogNow(const Frame*);
121 
122         // DOM Level 0
123 
124         Screen* screen() const;
125         History* history() const;
126         BarProp* locationbar() const;
127         BarProp* menubar() const;
128         BarProp* personalbar() const;
129         BarProp* scrollbars() const;
130         BarProp* statusbar() const;
131         BarProp* toolbar() const;
132         Navigator* navigator() const;
clientInformation()133         Navigator* clientInformation() const { return navigator(); }
134 
135         Location* location() const;
136         void setLocation(const String& location, DOMWindow* activeWindow, DOMWindow* firstWindow,
137             SetLocationLocking = LockHistoryBasedOnGestureState);
138 
139         DOMSelection* getSelection();
140 
141         Element* frameElement() const;
142 
143         void focus(ExecutionContext* = 0);
144         void blur();
145         void close(ExecutionContext* = 0);
146         void print();
147         void stop();
148 
149         PassRefPtr<DOMWindow> open(const String& urlString, const AtomicString& frameName, const String& windowFeaturesString,
150             DOMWindow* activeWindow, DOMWindow* firstWindow);
151 
152         typedef void (*PrepareDialogFunction)(DOMWindow*, void* context);
153         void showModalDialog(const String& urlString, const String& dialogFeaturesString,
154             DOMWindow* activeWindow, DOMWindow* firstWindow, PrepareDialogFunction, void* functionContext);
155 
156         void alert(const String& message);
157         bool confirm(const String& message);
158         String prompt(const String& message, const String& defaultValue);
159 
160         bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const;
161 
162         bool offscreenBuffering() const;
163 
164         int outerHeight() const;
165         int outerWidth() const;
166         int innerHeight() const;
167         int innerWidth() const;
168         int screenX() const;
169         int screenY() const;
screenLeft()170         int screenLeft() const { return screenX(); }
screenTop()171         int screenTop() const { return screenY(); }
172         int scrollX() const;
173         int scrollY() const;
pageXOffset()174         int pageXOffset() const { return scrollX(); }
pageYOffset()175         int pageYOffset() const { return scrollY(); }
176 
177         bool closed() const;
178 
179         unsigned length() const;
180 
181         const AtomicString& name() const;
182         void setName(const AtomicString&);
183 
184         String status() const;
185         void setStatus(const String&);
186         String defaultStatus() const;
187         void setDefaultStatus(const String&);
188 
189         // Self-referential attributes
190 
191         DOMWindow* self() const;
window()192         DOMWindow* window() const { return self(); }
frames()193         DOMWindow* frames() const { return self(); }
194 
195         DOMWindow* opener() const;
196         DOMWindow* parent() const;
197         DOMWindow* top() const;
198 
199         // DOM Level 2 AbstractView Interface
200 
201         Document* document() const;
202 
203         // CSSOM View Module
204 
205         PassRefPtr<StyleMedia> styleMedia() const;
206 
207         // DOM Level 2 Style Interface
208 
209         PassRefPtr<CSSStyleDeclaration> getComputedStyle(Element*, const String& pseudoElt) const;
210 
211         // WebKit extensions
212 
213         PassRefPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt, bool authorOnly = true) const;
214         double devicePixelRatio() const;
215 
216         PassRefPtr<DOMPoint> webkitConvertPointFromPageToNode(Node*, const DOMPoint*) const;
217         PassRefPtr<DOMPoint> webkitConvertPointFromNodeToPage(Node*, const DOMPoint*) const;
218 
219         Console* console() const;
220         PageConsole* pageConsole() const;
221 
222         void printErrorMessage(const String&);
223         String crossDomainAccessErrorMessage(DOMWindow* activeWindow);
224         String sanitizedCrossDomainAccessErrorMessage(DOMWindow* activeWindow);
225 
226         void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, DOMWindow* source, ExceptionState&);
227         void postMessageTimerFired(PassOwnPtr<PostMessageTimer>);
228         void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtr<Event>, PassRefPtr<ScriptCallStack>);
229 
230         void scrollBy(int x, int y) const;
231         void scrollTo(int x, int y) const;
scroll(int x,int y)232         void scroll(int x, int y) const { scrollTo(x, y); }
233 
234         void moveBy(float x, float y) const;
235         void moveTo(float x, float y) const;
236 
237         void resizeBy(float x, float y) const;
238         void resizeTo(float width, float height) const;
239 
240         // WebKit animation extensions
241         int requestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback>);
242         int webkitRequestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback>);
243         void cancelAnimationFrame(int id);
244 
245         DOMWindowCSS* css();
246 
247         // Events
248         // EventTarget API
249         virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) OVERRIDE;
250         virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) OVERRIDE;
251         virtual void removeAllEventListeners() OVERRIDE;
252 
253         using EventTarget::dispatchEvent;
254         bool dispatchEvent(PassRefPtr<Event> prpEvent, PassRefPtr<EventTarget> prpTarget);
255 
256         void dispatchLoadEvent();
257 
258         DEFINE_ATTRIBUTE_EVENT_LISTENER(animationend);
259         DEFINE_ATTRIBUTE_EVENT_LISTENER(animationiteration);
260         DEFINE_ATTRIBUTE_EVENT_LISTENER(animationstart);
261         DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
262         DEFINE_ATTRIBUTE_EVENT_LISTENER(transitionend);
263         DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
264 
265         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart);
266         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationiteration, webkitAnimationIteration);
267         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd);
268         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd);
269 
captureEvents()270         void captureEvents() { }
releaseEvents()271         void releaseEvents() { }
272 
273         void finishedLoading();
274 
275         DEFINE_ATTRIBUTE_EVENT_LISTENER(devicemotion);
276         DEFINE_ATTRIBUTE_EVENT_LISTENER(deviceorientation);
277 
278         // HTML 5 key/value storage
279         Storage* sessionStorage(ExceptionState&) const;
280         Storage* localStorage(ExceptionState&) const;
optionalSessionStorage()281         Storage* optionalSessionStorage() const { return m_sessionStorage.get(); }
optionalLocalStorage()282         Storage* optionalLocalStorage() const { return m_localStorage.get(); }
283 
284         ApplicationCache* applicationCache() const;
optionalApplicationCache()285         ApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); }
286 
287 #if ENABLE(ORIENTATION_EVENTS)
288         // This is the interface orientation in degrees. Some examples are:
289         //  0 is straight up; -90 is when the device is rotated 90 clockwise;
290         //  90 is when rotated counter clockwise.
291         int orientation() const;
292 
293         DEFINE_ATTRIBUTE_EVENT_LISTENER(orientationchange);
294 #endif
295 
296         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
297         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
298         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
299         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
300 
301         Performance* performance() const;
302 
303         // FIXME: When this DOMWindow is no longer the active DOMWindow (i.e.,
304         // when its document is no longer the document that is displayed in its
305         // frame), we would like to zero out m_frame to avoid being confused
306         // by the document that is currently active in m_frame.
307         bool isCurrentlyDisplayedInFrame() const;
308 
309         void willDetachDocumentFromFrame();
310         DOMWindow* anonymousIndexedGetter(uint32_t);
311 
312         bool isInsecureScriptAccess(DOMWindow* activeWindow, const String& urlString);
313 
314         PassOwnPtr<LifecycleNotifier<DOMWindow> > createLifecycleNotifier();
315 
316         EventQueue* eventQueue() const;
317         void enqueueWindowEvent(PassRefPtr<Event>);
318         void enqueueDocumentEvent(PassRefPtr<Event>);
319         void enqueuePageshowEvent(PageshowEventPersistence);
320         void enqueueHashchangeEvent(const String& oldURL, const String& newURL);
321         void enqueuePopstateEvent(PassRefPtr<SerializedScriptValue>);
322         void dispatchWindowLoadEvent();
323         void documentWasClosed();
324         void statePopped(PassRefPtr<SerializedScriptValue>);
325 
326         // FIXME: This shouldn't be public once DOMWindow becomes ExecutionContext.
327         void clearEventQueue();
328 
329     protected:
330         DOMWindowLifecycleNotifier& lifecycleNotifier();
331 
332     private:
333         explicit DOMWindow(Frame*);
334 
335         Page* page();
336 
337         virtual void frameDestroyed() OVERRIDE;
338         virtual void willDetachPage() OVERRIDE;
339 
340         void clearDocument();
341         void resetDOMWindowProperties();
342         void willDestroyDocumentInFrame();
343 
344         RefPtr<Document> m_document;
345 
346         bool m_shouldPrintWhenFinishedLoading;
347 
348         HashSet<DOMWindowProperty*> m_properties;
349 
350         mutable RefPtr<Screen> m_screen;
351         mutable RefPtr<History> m_history;
352         mutable RefPtr<BarProp> m_locationbar;
353         mutable RefPtr<BarProp> m_menubar;
354         mutable RefPtr<BarProp> m_personalbar;
355         mutable RefPtr<BarProp> m_scrollbars;
356         mutable RefPtr<BarProp> m_statusbar;
357         mutable RefPtr<BarProp> m_toolbar;
358         mutable RefPtr<Console> m_console;
359         mutable RefPtr<Navigator> m_navigator;
360         mutable RefPtr<Location> m_location;
361         mutable RefPtr<StyleMedia> m_media;
362 
363         String m_status;
364         String m_defaultStatus;
365 
366         mutable RefPtr<Storage> m_sessionStorage;
367         mutable RefPtr<Storage> m_localStorage;
368         mutable RefPtr<ApplicationCache> m_applicationCache;
369 
370         mutable RefPtr<Performance> m_performance;
371 
372         mutable RefPtr<DOMWindowCSS> m_css;
373 
374         RefPtr<DOMWindowEventQueue> m_eventQueue;
375         RefPtr<SerializedScriptValue> m_pendingStateObject;
376     };
377 
status()378     inline String DOMWindow::status() const
379     {
380         return m_status;
381     }
382 
defaultStatus()383     inline String DOMWindow::defaultStatus() const
384     {
385         return m_defaultStatus;
386     }
387 
388 } // namespace WebCore
389 
390 #endif // DOMWindow_h
391