#ifndef DOMWindow_h
#define DOMWindow_h
#include "bindings/v8/Dictionary.h"
#include "bindings/v8/ScriptWrappable.h"
#include "core/events/EventTarget.h"
#include "core/frame/FrameDestructionObserver.h"
#include "heap/Handle.h"
#include "platform/LifecycleContext.h"
#include "platform/Supplementable.h"
#include "wtf/Forward.h"
namespace WebCore {
    class ApplicationCache;
    class BarProp;
    class CSSRuleList;
    class CSSStyleDeclaration;
    class Console;
    class DOMPoint;
    class DOMSelection;
    class DOMURL;
    class DOMWindowProperty;
    class Database;
    class DatabaseCallback;
    class Document;
    class DocumentInit;
    class DOMWindowEventQueue;
    class DOMWindowLifecycleNotifier;
    class Element;
    class EventListener;
    class EventQueue;
    class ExceptionState;
    class FloatRect;
    class LocalFrame;
    class History;
    class IDBFactory;
    class Location;
    class MediaQueryList;
    class MessageEvent;
    class Navigator;
    class Node;
    class Page;
    class PageConsole;
    class Performance;
    class PostMessageTimer;
    class RequestAnimationFrameCallback;
    class ScheduledAction;
    class Screen;
    class ScriptCallStack;
    class SecurityOrigin;
    class SerializedScriptValue;
    class Storage;
    class StyleMedia;
    class DOMWindowCSS;
    struct WindowFeatures;
    typedef Vector<RefPtr<MessagePort>, 1> MessagePortArray;
enum PageshowEventPersistence {
    PageshowEventNotPersisted = 0,
    PageshowEventPersisted = 1
};
    enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList };
    class DOMWindow FINAL : public RefCountedWillBeRefCountedGarbageCollected<DOMWindow>, public ScriptWrappable, public EventTargetWithInlineData, public FrameDestructionObserver, public WillBeHeapSupplementable<DOMWindow>, public LifecycleContext<DOMWindow> {
        WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(DOMWindow);
        DEFINE_EVENT_TARGET_REFCOUNTING(RefCountedWillBeRefCountedGarbageCollected<DOMWindow>);
    public:
        static PassRefPtr<Document> createDocument(const String& mimeType, const DocumentInit&, bool forceXHTML);
        static PassRefPtrWillBeRawPtr<DOMWindow> create(LocalFrame& frame)
        {
            return adoptRefWillBeRefCountedGarbageCollected(new DOMWindow(frame));
        }
        virtual ~DOMWindow();
        PassRefPtr<Document> installNewDocument(const String& mimeType, const DocumentInit&, bool forceXHTML = false);
        virtual const AtomicString& interfaceName() const OVERRIDE;
        virtual ExecutionContext* executionContext() const OVERRIDE;
        virtual DOMWindow* toDOMWindow() OVERRIDE;
        void registerProperty(DOMWindowProperty*);
        void unregisterProperty(DOMWindowProperty*);
        void reset();
        PassRefPtrWillBeRawPtr<MediaQueryList> matchMedia(const String&);
        unsigned pendingUnloadEventListeners() const;
        static FloatRect adjustWindowRect(LocalFrame&, const FloatRect& pendingChanges);
        bool allowPopUp(); 
        static bool allowPopUp(LocalFrame& firstFrame);
        static bool canShowModalDialog(const LocalFrame*);
        static bool canShowModalDialogNow(const LocalFrame*);
        
        Screen& screen() const;
        History& history() const;
        BarProp& locationbar() const;
        BarProp& menubar() const;
        BarProp& personalbar() const;
        BarProp& scrollbars() const;
        BarProp& statusbar() const;
        BarProp& toolbar() const;
        Navigator& navigator() const;
        Navigator& clientInformation() const { return navigator(); }
        Location& location() const;
        void setLocation(const String& location, DOMWindow* callingWindow, DOMWindow* enteredWindow,
            SetLocationLocking = LockHistoryBasedOnGestureState);
        DOMSelection* getSelection();
        Element* frameElement() const;
        void focus(ExecutionContext* = 0);
        void blur();
        void close(ExecutionContext* = 0);
        void print();
        void stop();
        PassRefPtrWillBeRawPtr<DOMWindow> open(const String& urlString, const AtomicString& frameName, const String& windowFeaturesString,
            DOMWindow* callingWindow, DOMWindow* enteredWindow);
        typedef void (*PrepareDialogFunction)(DOMWindow*, void* context);
        void showModalDialog(const String& urlString, const String& dialogFeaturesString,
            DOMWindow* callingWindow, DOMWindow* enteredWindow, PrepareDialogFunction, void* functionContext);
        void alert(const String& message);
        bool confirm(const String& message);
        String prompt(const String& message, const String& defaultValue);
        bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const;
        bool offscreenBuffering() const;
        int outerHeight() const;
        int outerWidth() const;
        int innerHeight() const;
        int innerWidth() const;
        int screenX() const;
        int screenY() const;
        int screenLeft() const { return screenX(); }
        int screenTop() const { return screenY(); }
        int scrollX() const;
        int scrollY() const;
        int pageXOffset() const { return scrollX(); }
        int pageYOffset() const { return scrollY(); }
        bool closed() const;
        unsigned length() const;
        const AtomicString& name() const;
        void setName(const AtomicString&);
        String status() const;
        void setStatus(const String&);
        String defaultStatus() const;
        void setDefaultStatus(const String&);
        
        DOMWindow* self() const;
        DOMWindow* window() const { return self(); }
        DOMWindow* frames() const { return self(); }
        DOMWindow* opener() const;
        DOMWindow* parent() const;
        DOMWindow* top() const;
        
        Document* document() const;
        
        StyleMedia& styleMedia() const;
        
        PassRefPtr<CSSStyleDeclaration> getComputedStyle(Element*, const String& pseudoElt) const;
        
        PassRefPtrWillBeRawPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt) const;
        double devicePixelRatio() const;
        PassRefPtrWillBeRawPtr<DOMPoint> webkitConvertPointFromPageToNode(Node*, const DOMPoint*) const;
        PassRefPtrWillBeRawPtr<DOMPoint> webkitConvertPointFromNodeToPage(Node*, const DOMPoint*) const;
        Console& console() const;
        PageConsole* pageConsole() const;
        void printErrorMessage(const String&);
        String crossDomainAccessErrorMessage(DOMWindow* callingWindow);
        String sanitizedCrossDomainAccessErrorMessage(DOMWindow* callingWindow);
        void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, DOMWindow* source, ExceptionState&);
        void postMessageTimerFired(PassOwnPtr<PostMessageTimer>);
        void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtrWillBeRawPtr<Event>, PassRefPtr<ScriptCallStack>);
        void scrollBy(int x, int y, const Dictionary& scrollOptions, ExceptionState&) const;
        void scrollTo(int x, int y, const Dictionary& scrollOptions, ExceptionState&) const;
        void scroll(int x, int y, const Dictionary& scrollOptions, ExceptionState& exceptionState) const { scrollTo(x, y, scrollOptions, exceptionState); }
        void moveBy(float x, float y) const;
        void moveTo(float x, float y) const;
        void resizeBy(float x, float y) const;
        void resizeTo(float width, float height) const;
        
        int requestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback>);
        int webkitRequestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback>);
        void cancelAnimationFrame(int id);
        DOMWindowCSS& css() const;
        
        
        virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) OVERRIDE;
        virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture = false) OVERRIDE;
        virtual void removeAllEventListeners() OVERRIDE;
        using EventTarget::dispatchEvent;
        bool dispatchEvent(PassRefPtrWillBeRawPtr<Event> prpEvent, PassRefPtr<EventTarget> prpTarget);
        void dispatchLoadEvent();
        DEFINE_ATTRIBUTE_EVENT_LISTENER(animationend);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(animationiteration);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(animationstart);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(transitionend);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
        DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart);
        DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationiteration, webkitAnimationIteration);
        DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd);
        DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd);
        void captureEvents() { }
        void releaseEvents() { }
        void finishedLoading();
        
        Storage* sessionStorage(ExceptionState&) const;
        Storage* localStorage(ExceptionState&) const;
        Storage* optionalSessionStorage() const { return m_sessionStorage.get(); }
        Storage* optionalLocalStorage() const { return m_localStorage.get(); }
        ApplicationCache* applicationCache() const;
        ApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); }
        
        
        
        int orientation() const;
        DEFINE_ATTRIBUTE_EVENT_LISTENER(orientationchange);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
        DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
        Performance& performance() const;
        
        
        
        
        bool isCurrentlyDisplayedInFrame() const;
        void willDetachDocumentFromFrame();
        DOMWindow* anonymousIndexedGetter(uint32_t);
        bool isInsecureScriptAccess(DOMWindow& callingWindow, const String& urlString);
        PassOwnPtr<LifecycleNotifier<DOMWindow> > createLifecycleNotifier();
        EventQueue* eventQueue() const;
        void enqueueWindowEvent(PassRefPtrWillBeRawPtr<Event>);
        void enqueueDocumentEvent(PassRefPtrWillBeRawPtr<Event>);
        void enqueuePageshowEvent(PageshowEventPersistence);
        void enqueueHashchangeEvent(const String& oldURL, const String& newURL);
        void enqueuePopstateEvent(PassRefPtr<SerializedScriptValue>);
        void dispatchWindowLoadEvent();
        void documentWasClosed();
        void statePopped(PassRefPtr<SerializedScriptValue>);
        
        void clearEventQueue();
        void trace(Visitor*);
    protected:
        DOMWindowLifecycleNotifier& lifecycleNotifier();
    private:
        explicit DOMWindow(LocalFrame&);
        Page* page();
        virtual void frameDestroyed() OVERRIDE;
        virtual void willDetachFrameHost() OVERRIDE;
        void clearDocument();
        void resetDOMWindowProperties();
        void willDestroyDocumentInFrame();
        RefPtr<Document> m_document;
        bool m_shouldPrintWhenFinishedLoading;
        HashSet<DOMWindowProperty*> m_properties;
        mutable RefPtrWillBeMember<Screen> m_screen;
        mutable RefPtrWillBeMember<History> m_history;
        mutable RefPtrWillBeMember<BarProp> m_locationbar;
        mutable RefPtrWillBeMember<BarProp> m_menubar;
        mutable RefPtrWillBeMember<BarProp> m_personalbar;
        mutable RefPtrWillBeMember<BarProp> m_scrollbars;
        mutable RefPtrWillBeMember<BarProp> m_statusbar;
        mutable RefPtrWillBeMember<BarProp> m_toolbar;
        mutable RefPtrWillBeMember<Console> m_console;
        mutable RefPtrWillBeMember<Navigator> m_navigator;
        mutable RefPtrWillBeMember<Location> m_location;
        mutable RefPtrWillBeMember<StyleMedia> m_media;
        String m_status;
        String m_defaultStatus;
        mutable RefPtrWillBeMember<Storage> m_sessionStorage;
        mutable RefPtrWillBeMember<Storage> m_localStorage;
        mutable RefPtrWillBeMember<ApplicationCache> m_applicationCache;
        mutable RefPtrWillBeMember<Performance> m_performance;
        mutable RefPtrWillBeMember<DOMWindowCSS> m_css;
        RefPtr<DOMWindowEventQueue> m_eventQueue;
        RefPtr<SerializedScriptValue> m_pendingStateObject;
    };
    inline String DOMWindow::status() const
    {
        return m_status;
    }
    inline String DOMWindow::defaultStatus() const
    {
        return m_defaultStatus;
    }
} 
#endif