• 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 LocalDOMWindow_h
28 #define LocalDOMWindow_h
29 
30 #include "core/events/EventTarget.h"
31 #include "core/frame/DOMWindowBase64.h"
32 #include "core/frame/FrameDestructionObserver.h"
33 #include "platform/LifecycleContext.h"
34 #include "platform/Supplementable.h"
35 #include "platform/heap/Handle.h"
36 #include "platform/scroll/ScrollableArea.h"
37 
38 #include "wtf/Forward.h"
39 
40 namespace blink {
41 
42 class ApplicationCache;
43 class BarProp;
44 class CSSRuleList;
45 class CSSStyleDeclaration;
46 class Console;
47 class DOMSelection;
48 class DOMWindowCSS;
49 class DOMWindowEventQueue;
50 class DOMWindowLifecycleNotifier;
51 class DOMWindowProperty;
52 class Document;
53 class DocumentInit;
54 class Element;
55 class EventListener;
56 class EventQueue;
57 class ExceptionState;
58 class FloatRect;
59 class FrameConsole;
60 class History;
61 class LocalFrame;
62 class Location;
63 class MediaQueryList;
64 class Navigator;
65 class Page;
66 class Performance;
67 class PostMessageTimer;
68 class RequestAnimationFrameCallback;
69 class Screen;
70 class ScrollOptions;
71 class ScriptCallStack;
72 class SecurityOrigin;
73 class SerializedScriptValue;
74 class Storage;
75 class StyleMedia;
76 
77 typedef WillBeHeapVector<RefPtrWillBeMember<MessagePort>, 1> MessagePortArray;
78 
79 enum PageshowEventPersistence {
80     PageshowEventNotPersisted = 0,
81     PageshowEventPersisted = 1
82 };
83 
84 enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList };
85 
86 class LocalDOMWindow FINAL : public RefCountedWillBeGarbageCollectedFinalized<LocalDOMWindow>, public EventTargetWithInlineData, public DOMWindowBase64, public FrameDestructionObserver, public WillBeHeapSupplementable<LocalDOMWindow>, public LifecycleContext<LocalDOMWindow> {
87     DEFINE_WRAPPERTYPEINFO();
88     REFCOUNTED_EVENT_TARGET(LocalDOMWindow);
89     WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(LocalDOMWindow);
90 public:
91     static PassRefPtrWillBeRawPtr<Document> createDocument(const String& mimeType, const DocumentInit&, bool forceXHTML);
create(LocalFrame & frame)92     static PassRefPtrWillBeRawPtr<LocalDOMWindow> create(LocalFrame& frame)
93     {
94         return adoptRefWillBeNoop(new LocalDOMWindow(frame));
95     }
96     virtual ~LocalDOMWindow();
97 
98     PassRefPtrWillBeRawPtr<Document> installNewDocument(const String& mimeType, const DocumentInit&, bool forceXHTML = false);
99 
100     virtual const AtomicString& interfaceName() const OVERRIDE;
101     virtual ExecutionContext* executionContext() const OVERRIDE;
102 
103     virtual LocalDOMWindow* toDOMWindow() OVERRIDE;
104 
105     void registerProperty(DOMWindowProperty*);
106     void unregisterProperty(DOMWindowProperty*);
107 
108     void reset();
109 
110     PassRefPtrWillBeRawPtr<MediaQueryList> matchMedia(const String&);
111 
112     unsigned pendingUnloadEventListeners() const;
113 
114     static FloatRect adjustWindowRect(LocalFrame&, const FloatRect& pendingChanges);
115 
116     bool allowPopUp(); // Call on first window, not target window.
117     static bool allowPopUp(LocalFrame& firstFrame);
118     static bool canShowModalDialogNow(const LocalFrame*);
119 
120     // DOM Level 0
121 
122     Screen& screen() const;
123     History& history() const;
124     BarProp& locationbar() const;
125     BarProp& menubar() const;
126     BarProp& personalbar() const;
127     BarProp& scrollbars() const;
128     BarProp& statusbar() const;
129     BarProp& toolbar() const;
130     Navigator& navigator() const;
clientInformation()131     Navigator& clientInformation() const { return navigator(); }
132 
133     Location& location() const;
134     void setLocation(const String& location, LocalDOMWindow* callingWindow, LocalDOMWindow* enteredWindow,
135         SetLocationLocking = LockHistoryBasedOnGestureState);
136 
137     DOMSelection* getSelection();
138 
139     Element* frameElement() const;
140 
141     void focus(ExecutionContext* = 0);
142     void blur();
143     void close(ExecutionContext* = 0);
144     void print();
145     void stop();
146 
147     PassRefPtrWillBeRawPtr<LocalDOMWindow> open(const String& urlString, const AtomicString& frameName, const String& windowFeaturesString,
148         LocalDOMWindow* callingWindow, LocalDOMWindow* enteredWindow);
149 
150     typedef void (*PrepareDialogFunction)(LocalDOMWindow*, void* context);
151     void showModalDialog(const String& urlString, const String& dialogFeaturesString,
152         LocalDOMWindow* callingWindow, LocalDOMWindow* enteredWindow, PrepareDialogFunction, void* functionContext);
153 
154     void alert(const String& message = String());
155     bool confirm(const String& message);
156     String prompt(const String& message, const String& defaultValue);
157 
158     bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const;
159 
160     bool offscreenBuffering() const;
161 
162     int outerHeight() const;
163     int outerWidth() const;
164     int innerHeight() const;
165     int innerWidth() const;
166     int screenX() const;
167     int screenY() const;
screenLeft()168     int screenLeft() const { return screenX(); }
screenTop()169     int screenTop() const { return screenY(); }
170     double scrollX() const;
171     double scrollY() const;
pageXOffset()172     double pageXOffset() const { return scrollX(); }
pageYOffset()173     double pageYOffset() const { return scrollY(); }
174 
175     bool closed() const;
176 
177     unsigned length() const;
178 
179     const AtomicString& name() const;
180     void setName(const AtomicString&);
181 
182     String status() const;
183     void setStatus(const String&);
184     String defaultStatus() const;
185     void setDefaultStatus(const String&);
186 
187     // Self-referential attributes
188 
189     LocalDOMWindow* self() const;
window()190     LocalDOMWindow* window() const { return self(); }
frames()191     LocalDOMWindow* frames() const { return self(); }
192 
193     LocalDOMWindow* opener() const;
194     LocalDOMWindow* parent() const;
195     LocalDOMWindow* top() const;
196 
197     // DOM Level 2 AbstractView Interface
198 
199     Document* document() const;
200 
201     // CSSOM View Module
202 
203     StyleMedia& styleMedia() const;
204 
205     // DOM Level 2 Style Interface
206 
207     PassRefPtrWillBeRawPtr<CSSStyleDeclaration> getComputedStyle(Element*, const String& pseudoElt) const;
208 
209     // WebKit extensions
210 
211     PassRefPtrWillBeRawPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt) const;
212     double devicePixelRatio() const;
213 
214     Console& console() const;
215     FrameConsole* frameConsole() const;
216 
217     void printErrorMessage(const String&);
218     String crossDomainAccessErrorMessage(LocalDOMWindow* callingWindow);
219     String sanitizedCrossDomainAccessErrorMessage(LocalDOMWindow* callingWindow);
220 
221     void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, LocalDOMWindow* source, ExceptionState&);
222     void postMessageTimerFired(PostMessageTimer*);
223     void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtrWillBeRawPtr<Event>, PassRefPtrWillBeRawPtr<ScriptCallStack>);
224 
225     void scrollBy(double x, double y, ScrollBehavior = ScrollBehaviorAuto) const;
226     void scrollBy(double x, double y, const ScrollOptions&, ExceptionState&) const;
227     void scrollTo(double x, double y, ScrollBehavior = ScrollBehaviorAuto) const;
228     void scrollTo(double x, double y, const ScrollOptions&, ExceptionState&) const;
scroll(double x,double y)229     void scroll(double x, double y) const { scrollTo(x, y); }
scroll(double x,double y,const ScrollOptions & scrollOptions,ExceptionState & exceptionState)230     void scroll(double x, double y, const ScrollOptions& scrollOptions, ExceptionState& exceptionState) const { scrollTo(x, y, scrollOptions, exceptionState); }
231 
232     void moveBy(float x, float y) const;
233     void moveTo(float x, float y) const;
234 
235     void resizeBy(float x, float y) const;
236     void resizeTo(float width, float height) const;
237 
238     // WebKit animation extensions
239     int requestAnimationFrame(RequestAnimationFrameCallback*);
240     int webkitRequestAnimationFrame(RequestAnimationFrameCallback*);
241     void cancelAnimationFrame(int id);
242 
243     DOMWindowCSS& css() const;
244 
245     // Events
246     // EventTarget API
247     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) OVERRIDE;
248     virtual bool removeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) OVERRIDE;
249     virtual void removeAllEventListeners() OVERRIDE;
250 
251     using EventTarget::dispatchEvent;
252     bool dispatchEvent(PassRefPtrWillBeRawPtr<Event> prpEvent, PassRefPtrWillBeRawPtr<EventTarget> prpTarget);
253 
254     void dispatchLoadEvent();
255 
256     DEFINE_ATTRIBUTE_EVENT_LISTENER(animationend);
257     DEFINE_ATTRIBUTE_EVENT_LISTENER(animationiteration);
258     DEFINE_ATTRIBUTE_EVENT_LISTENER(animationstart);
259     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
260     DEFINE_ATTRIBUTE_EVENT_LISTENER(transitionend);
261     DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
262 
263     DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart);
264     DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationiteration, webkitAnimationIteration);
265     DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd);
266     DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd);
267 
captureEvents()268     void captureEvents() { }
releaseEvents()269     void releaseEvents() { }
270 
271     void finishedLoading();
272 
273     // HTML 5 key/value storage
274     Storage* sessionStorage(ExceptionState&) const;
275     Storage* localStorage(ExceptionState&) const;
optionalSessionStorage()276     Storage* optionalSessionStorage() const { return m_sessionStorage.get(); }
optionalLocalStorage()277     Storage* optionalLocalStorage() const { return m_localStorage.get(); }
278 
279     ApplicationCache* applicationCache() const;
optionalApplicationCache()280     ApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); }
281 
282     // This is the interface orientation in degrees. Some examples are:
283     //  0 is straight up; -90 is when the device is rotated 90 clockwise;
284     //  90 is when rotated counter clockwise.
285     int orientation() const;
286 
287     DEFINE_ATTRIBUTE_EVENT_LISTENER(orientationchange);
288     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
289     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
290     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
291     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
292 
293     Performance& performance() const;
294 
295     // FIXME: When this LocalDOMWindow is no longer the active LocalDOMWindow (i.e.,
296     // when its document is no longer the document that is displayed in its
297     // frame), we would like to zero out m_frame to avoid being confused
298     // by the document that is currently active in m_frame.
299     bool isCurrentlyDisplayedInFrame() const;
300 
301     void willDetachDocumentFromFrame();
302     LocalDOMWindow* anonymousIndexedGetter(uint32_t);
303 
304     bool isInsecureScriptAccess(LocalDOMWindow& callingWindow, const String& urlString);
305 
306     PassOwnPtr<LifecycleNotifier<LocalDOMWindow> > createLifecycleNotifier();
307 
308     EventQueue* eventQueue() const;
309     void enqueueWindowEvent(PassRefPtrWillBeRawPtr<Event>);
310     void enqueueDocumentEvent(PassRefPtrWillBeRawPtr<Event>);
311     void enqueuePageshowEvent(PageshowEventPersistence);
312     void enqueueHashchangeEvent(const String& oldURL, const String& newURL);
313     void enqueuePopstateEvent(PassRefPtr<SerializedScriptValue>);
314     void dispatchWindowLoadEvent();
315     void documentWasClosed();
316     void statePopped(PassRefPtr<SerializedScriptValue>);
317 
318     // FIXME: This shouldn't be public once LocalDOMWindow becomes ExecutionContext.
319     void clearEventQueue();
320 
321     void acceptLanguagesChanged();
322 
323     virtual void trace(Visitor*) OVERRIDE;
324 
325     virtual v8::Handle<v8::Object> wrap(v8::Handle<v8::Object> creationContext, v8::Isolate*) OVERRIDE;
326 
327 protected:
328     DOMWindowLifecycleNotifier& lifecycleNotifier();
329 
330 private:
331     explicit LocalDOMWindow(LocalFrame&);
332 
333     Page* page();
334 
335     // FrameDestructionObserver
336     virtual void willDetachFrameHost() OVERRIDE;
337 
338     void clearDocument();
339     void willDestroyDocumentInFrame();
340 
341     // FIXME: Oilpan: the need for this internal method will fall
342     // away when EventTargets are no longer using refcounts and
343     // window properties are also on the heap. Inline the minimal
344     // do-not-broadcast handling then and remove the enum +
345     // removeAllEventListenersInternal().
346     enum BroadcastListenerRemoval {
347         DoNotBroadcastListenerRemoval,
348         DoBroadcastListenerRemoval
349     };
350 
351     void removeAllEventListenersInternal(BroadcastListenerRemoval);
352 
353     RefPtrWillBeMember<Document> m_document;
354 
355     bool m_shouldPrintWhenFinishedLoading;
356 #if ENABLE(ASSERT)
357     bool m_hasBeenReset;
358 #endif
359 
360     WillBeHeapHashSet<RawPtrWillBeWeakMember<DOMWindowProperty> > m_properties;
361 
362     mutable RefPtrWillBeMember<Screen> m_screen;
363     mutable RefPtrWillBeMember<History> m_history;
364     mutable RefPtrWillBeMember<BarProp> m_locationbar;
365     mutable RefPtrWillBeMember<BarProp> m_menubar;
366     mutable RefPtrWillBeMember<BarProp> m_personalbar;
367     mutable RefPtrWillBeMember<BarProp> m_scrollbars;
368     mutable RefPtrWillBeMember<BarProp> m_statusbar;
369     mutable RefPtrWillBeMember<BarProp> m_toolbar;
370     mutable RefPtrWillBeMember<Console> m_console;
371     mutable RefPtrWillBeMember<Navigator> m_navigator;
372     mutable RefPtrWillBeMember<Location> m_location;
373     mutable RefPtrWillBeMember<StyleMedia> m_media;
374 
375     String m_status;
376     String m_defaultStatus;
377 
378     mutable RefPtrWillBeMember<Storage> m_sessionStorage;
379     mutable RefPtrWillBeMember<Storage> m_localStorage;
380     mutable RefPtrWillBeMember<ApplicationCache> m_applicationCache;
381 
382     mutable RefPtrWillBeMember<Performance> m_performance;
383 
384     mutable RefPtrWillBeMember<DOMWindowCSS> m_css;
385 
386     RefPtrWillBeMember<DOMWindowEventQueue> m_eventQueue;
387     RefPtr<SerializedScriptValue> m_pendingStateObject;
388 
389     HashSet<OwnPtr<PostMessageTimer> > m_postMessageTimers;
390 };
391 
status()392 inline String LocalDOMWindow::status() const
393 {
394     return m_status;
395 }
396 
defaultStatus()397 inline String LocalDOMWindow::defaultStatus() const
398 {
399     return m_defaultStatus;
400 }
401 
402 } // namespace blink
403 
404 #endif // LocalDOMWindow_h
405