Home | History | Annotate | Download | only in frame
      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);
     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;
    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;
    168     int screenLeft() const { return screenX(); }
    169     int screenTop() const { return screenY(); }
    170     double scrollX() const;
    171     double scrollY() const;
    172     double pageXOffset() const { return scrollX(); }
    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;
    190     LocalDOMWindow* window() const { return self(); }
    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;
    229     void scroll(double x, double y) const { scrollTo(x, y); }
    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 
    268     void captureEvents() { }
    269     void releaseEvents() { }
    270 
    271     void finishedLoading();
    272 
    273     // HTML 5 key/value storage
    274     Storage* sessionStorage(ExceptionState&) const;
    275     Storage* localStorage(ExceptionState&) const;
    276     Storage* optionalSessionStorage() const { return m_sessionStorage.get(); }
    277     Storage* optionalLocalStorage() const { return m_localStorage.get(); }
    278 
    279     ApplicationCache* applicationCache() const;
    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 
    392 inline String LocalDOMWindow::status() const
    393 {
    394     return m_status;
    395 }
    396 
    397 inline String LocalDOMWindow::defaultStatus() const
    398 {
    399     return m_defaultStatus;
    400 }
    401 
    402 } // namespace blink
    403 
    404 #endif // LocalDOMWindow_h
    405