/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

module window {

    interface [
        CheckDomainSecurity,
        CustomDefineGetter,
        CustomDefineSetter,
        CustomDeleteProperty,
        CustomGetOwnPropertySlot,
        CustomGetPropertyAttributes,
        CustomGetPropertyNames,
        CustomLookupGetter,
        CustomLookupSetter,
        CustomMarkFunction,
        CustomNativeConverter,
        CustomPutFunction,
        ExtendsDOMGlobalObject,
        GenerateNativeConverter,
        LegacyParent=JSDOMWindowBase
    ] DOMWindow {
        // DOM Level 0
        readonly attribute Screen screen;
        readonly attribute [DoNotCheckDomainSecurity] History history;
        attribute [Replaceable] BarInfo locationbar;
        attribute [Replaceable] BarInfo menubar;
        attribute [Replaceable] BarInfo personalbar;
        attribute [Replaceable] BarInfo scrollbars;
        attribute [Replaceable] BarInfo statusbar;
        attribute [Replaceable] BarInfo toolbar;
        attribute [Replaceable] Navigator navigator;
        attribute [Replaceable] Navigator clientInformation;
        attribute [DoNotCheckDomainSecurity, CustomSetter] Location location;

        DOMSelection getSelection();

        readonly attribute [CheckNodeSecurity] Element frameElement;

        [DoNotCheckDomainSecurity] void focus();
        [DoNotCheckDomainSecurity] void blur();
        [DoNotCheckDomainSecurity] void close();

        void print();
        void stop();

        void alert(in DOMString message);
        boolean confirm(in DOMString message);
        [ConvertNullStringTo=Null] DOMString prompt(in DOMString message,
                                                    in [ConvertUndefinedOrNullToNullString] DOMString defaultValue);

        boolean find(in DOMString string,
                     in boolean caseSensitive,
                     in boolean backwards,
                     in boolean wrap,
                     in boolean wholeWord,
                     in boolean searchInFrames,
                     in boolean showDialog);

        attribute [Replaceable] boolean offscreenBuffering;

        attribute [Replaceable] long outerHeight;
        attribute [Replaceable] long outerWidth;
        attribute [Replaceable] long innerHeight;
        attribute [Replaceable] long innerWidth;
        attribute [Replaceable] long screenX;
        attribute [Replaceable] long screenY;
        attribute [Replaceable] long screenLeft;
        attribute [Replaceable] long screenTop;
        attribute [Replaceable] long scrollX;
        attribute [Replaceable] long scrollY;
        readonly attribute long pageXOffset;
        readonly attribute long pageYOffset;

        [RequiresAllArguments] void scrollBy(in long x, in long y);
        [RequiresAllArguments] void scrollTo(in long x, in long y);
        [RequiresAllArguments] void scroll(in long x, in long y);
        [RequiresAllArguments] void moveBy(in float x, in float y); // FIXME: this should take longs not floats.
        [RequiresAllArguments] void moveTo(in float x, in float y); // FIXME: this should take longs not floats.
        [RequiresAllArguments] void resizeBy(in float x, in float y); // FIXME: this should take longs not floats.
        [RequiresAllArguments] void resizeTo(in float width, in float height); // FIXME: this should take longs not floats.

        readonly attribute [DoNotCheckDomainSecurity] boolean closed;

        attribute [Replaceable, DoNotCheckDomainSecurityOnGet] unsigned long length;

        attribute DOMString name;

        attribute DOMString status;
        attribute DOMString defaultStatus;
#if defined(LANGUAGE_JAVASCRIPT)
        // This attribute is an alias of defaultStatus and is necessary for legacy uses.
        attribute DOMString defaultstatus;
#endif

        // Self referential attributes
        attribute [Replaceable, DoNotCheckDomainSecurityOnGet] DOMWindow self;
        readonly attribute [DoNotCheckDomainSecurity] DOMWindow window;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGet] DOMWindow frames;

        attribute [Replaceable, DoNotCheckDomainSecurityOnGet] DOMWindow opener;
        attribute [Replaceable, DoNotCheckDomainSecurity] DOMWindow parent;
        attribute [Replaceable, DoNotCheckDomainSecurity] DOMWindow top;

        // DOM Level 2 AbstractView Interface
        readonly attribute Document document;

        // DOM Level 2 Style Interface
        CSSStyleDeclaration getComputedStyle(in Element element,
                                             in DOMString pseudoElement);

        // WebKit extensions
        CSSRuleList getMatchedCSSRules(in Element element,
                                       in DOMString pseudoElement,
                                       in [Optional] boolean authorOnly);
        attribute [Replaceable] double devicePixelRatio;

#if ENABLE_OFFLINE_WEB_APPLICATIONS
        readonly attribute DOMApplicationCache applicationCache;
#endif    
#if ENABLE_DATABASE
        Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize)
            raises(DOMException);
#endif
#if ENABLE_DOM_STORAGE
        readonly attribute Storage sessionStorage;
        readonly attribute Storage localStorage;
#endif

                 attribute [Replaceable] Console console;

        // cross-document messaging
        [DoNotCheckDomainSecurity, Custom] void postMessage(in DOMString message, in [Optional] MessagePort messagePort, in DOMString targetOrigin)
            raises(DOMException);

        // Timers
        [Custom] long setTimeout(in TimeoutHandler handler, in long timeout);
        // [Custom] long setTimeout(in DOMString code, in long timeout);
        [Custom] void clearTimeout(in long handle);

        [Custom] long setInterval(in TimeoutHandler handler, in long timeout);
        // [Custom] long setInterval(in DOMString code, in long timeout);
        [Custom] void clearInterval(in long handle);

        // Base64
        [Custom] DOMString atob(in DOMString string)
            raises(DOMException);
        [Custom] DOMString btoa(in DOMString string)
            raises(DOMException);

        // Events
        attribute [ProtectedListener] EventListener onabort;
        attribute [ProtectedListener] EventListener onblur;
        attribute [ProtectedListener] EventListener onchange;
        attribute [ProtectedListener] EventListener onclick;
        attribute [ProtectedListener] EventListener ondblclick;
        attribute [ProtectedListener] EventListener onerror;
        attribute [ProtectedListener] EventListener onfocus;
        attribute [ProtectedListener] EventListener onkeydown;
        attribute [ProtectedListener] EventListener onkeypress;
        attribute [ProtectedListener] EventListener onkeyup;
        attribute [ProtectedListener] EventListener onload;
        attribute [ProtectedListener] EventListener onmousedown;
        attribute [ProtectedListener] EventListener onmousemove;
        attribute [ProtectedListener] EventListener onmouseout;
        attribute [ProtectedListener] EventListener onmouseover;
        attribute [ProtectedListener] EventListener onmouseup;
        attribute [ProtectedListener] EventListener onmousewheel;
        attribute [ProtectedListener] EventListener onreset;
        attribute [ProtectedListener] EventListener onresize;
        attribute [ProtectedListener] EventListener onscroll;
        attribute [ProtectedListener] EventListener onsearch;
        attribute [ProtectedListener] EventListener onselect;
        attribute [ProtectedListener] EventListener onsubmit;
        attribute [ProtectedListener] EventListener onunload;
        attribute [ProtectedListener] EventListener onbeforeunload;
        attribute [ProtectedListener] EventListener onwebkitanimationstart;
        attribute [ProtectedListener] EventListener onwebkitanimationiteration;
        attribute [ProtectedListener] EventListener onwebkitanimationend;
        attribute [ProtectedListener] EventListener onwebkittransitionend;

        // EventTarget interface
        [Custom] void addEventListener(in DOMString type, 
                                      in EventListener listener, 
                                      in boolean useCapture);
        [Custom] void removeEventListener(in DOMString type, 
                                          in EventListener listener, 
                                          in boolean useCapture);
        // FIXME: Implement dispatchEvent

#if defined(LANGUAGE_JAVASCRIPT)
        // Global constructors
        attribute StyleSheetConstructor StyleSheet;
        attribute CSSStyleSheetConstructor CSSStyleSheet;

        attribute CSSValueConstructor CSSValue;
        attribute CSSPrimitiveValueConstructor CSSPrimitiveValue;
        attribute CSSValueListConstructor CSSValueList;
        attribute WebKitCSSTransformValueConstructor WebKitCSSTransformValue;

        attribute CSSRuleConstructor CSSRule;
        attribute CSSCharsetRuleConstructor CSSCharsetRule;
        attribute CSSFontFaceRuleConstructor CSSFontFaceRule;
        attribute CSSImportRuleConstructor CSSImportRule;
        attribute CSSMediaRuleConstructor CSSMediaRule;
        attribute CSSPageRuleConstructor CSSPageRule;
        attribute CSSStyleRuleConstructor CSSStyleRule;
        
        attribute CSSVariablesRuleConstructor CSSVariablesRule;
        attribute CSSVariablesDeclarationConstructor CSSVariablesDeclaration;

        attribute CSSStyleDeclarationConstructor CSSStyleDeclaration;
        attribute MediaListConstructor MediaList;
        attribute CounterConstructor Counter;
        attribute CSSRuleListConstructor CSSRuleList;
        attribute RectConstructor Rect;
        attribute StyleSheetListConstructor StyleSheetList;

        // FIXME: Implement the commented-out global constructors for interfaces listed in DOM Level 3 Core specification.
        attribute DOMCoreExceptionConstructor DOMException;
        attribute DOMStringListConstructor DOMStringList;
//        attribute NameListConstructor NameList;
//        attribute DOMImplementationListConstructor DOMImplementationList;
//        attribute DOMImplementationSourceConstructor DOMImplementationSource;
        attribute DOMImplementationConstructor DOMImplementation;
        attribute DocumentFragmentConstructor DocumentFragment;
        attribute DocumentConstructor Document;
        attribute NodeConstructor Node;
        attribute NodeListConstructor NodeList;
        attribute NamedNodeMapConstructor NamedNodeMap;
        attribute CharacterDataConstructor CharacterData;
        attribute AttrConstructor Attr;
        attribute ElementConstructor Element;
        attribute TextConstructor Text;
        attribute CommentConstructor Comment;
//        attribute TypeInfoConstructor TypeInfo;
//        attribute UserDataHandlerConstructor UserDataHandler;
//        attribute DOMErrorConstructor DOMError;
//        attribute DOMErrorHandlerConstructor DOMErrorHandler
//        attribute DOMLocatorConstructor DOMLocator;
//        attribute DOMConfigurationConstructor DOMConfiguration;
        attribute CDATASectionConstructor CDATASection;
        attribute DocumentTypeConstructor DocumentType;
        attribute NotationConstructor Notation;
        attribute EntityConstructor Entity;
        attribute EntityReferenceConstructor EntityReference;
        attribute ProcessingInstructionConstructor ProcessingInstruction;

        attribute HTMLDocumentConstructor HTMLDocument;

        attribute HTMLElementConstructor HTMLElement;
        attribute HTMLAnchorElementConstructor HTMLAnchorElement;
        attribute HTMLAppletElementConstructor HTMLAppletElement;
        attribute HTMLAreaElementConstructor HTMLAreaElement;
        attribute HTMLBRElementConstructor HTMLBRElement;
        attribute HTMLBaseElementConstructor HTMLBaseElement;
        attribute HTMLBaseFontElementConstructor HTMLBaseFontElement;
        attribute HTMLBlockquoteElementConstructor HTMLBlockquoteElement;
        attribute HTMLBodyElementConstructor HTMLBodyElement;
        attribute HTMLButtonElementConstructor HTMLButtonElement;
        attribute HTMLCanvasElementConstructor HTMLCanvasElement;
        attribute HTMLDListElementConstructor HTMLDListElement;
        attribute HTMLDirectoryElementConstructor HTMLDirectoryElement;
        attribute HTMLDivElementConstructor HTMLDivElement;
        attribute HTMLEmbedElementConstructor HTMLEmbedElement;
        attribute HTMLFieldSetElementConstructor HTMLFieldSetElement;
        attribute HTMLFontElementConstructor HTMLFontElement;
        attribute HTMLFormElementConstructor HTMLFormElement;
        attribute HTMLFrameElementConstructor HTMLFrameElement;
        attribute HTMLFrameSetElementConstructor HTMLFrameSetElement;
        attribute HTMLHRElementConstructor HTMLHRElement;
        attribute HTMLHeadElementConstructor HTMLHeadElement;
        attribute HTMLHeadingElementConstructor HTMLHeadingElement;
        attribute HTMLHtmlElementConstructor HTMLHtmlElement;
        attribute HTMLIFrameElementConstructor HTMLIFrameElement;
        attribute HTMLImageElementConstructor HTMLImageElement;
        attribute HTMLInputElementConstructor HTMLInputElement;
        attribute HTMLIsIndexElementConstructor HTMLIsIndexElement;
        attribute HTMLLIElementConstructor HTMLLIElement;
        attribute HTMLLabelElementConstructor HTMLLabelElement;
        attribute HTMLLegendElementConstructor HTMLLegendElement;
        attribute HTMLLinkElementConstructor HTMLLinkElement;
        attribute HTMLMapElementConstructor HTMLMapElement;
        attribute HTMLMarqueeElementConstructor HTMLMarqueeElement;
        attribute HTMLMenuElementConstructor HTMLMenuElement;
        attribute HTMLMetaElementConstructor HTMLMetaElement;
        attribute HTMLModElementConstructor HTMLModElement;
        attribute HTMLOListElementConstructor HTMLOListElement;
        attribute HTMLObjectElementConstructor HTMLObjectElement;
        attribute HTMLOptGroupElementConstructor HTMLOptGroupElement;
        attribute HTMLOptionElementConstructor HTMLOptionElement;
        attribute HTMLParagraphElementConstructor HTMLParagraphElement;
        attribute HTMLParamElementConstructor HTMLParamElement;
        attribute HTMLPreElementConstructor HTMLPreElement;
        attribute HTMLQuoteElementConstructor HTMLQuoteElement;
        attribute HTMLScriptElementConstructor HTMLScriptElement;
        attribute HTMLSelectElementConstructor HTMLSelectElement;
        attribute HTMLStyleElementConstructor HTMLStyleElement;
        attribute HTMLTableCaptionElementConstructor HTMLTableCaptionElement;
        attribute HTMLTableCellElementConstructor HTMLTableCellElement;
        attribute HTMLTableColElementConstructor HTMLTableColElement;
        attribute HTMLTableElementConstructor HTMLTableElement;
        attribute HTMLTableRowElementConstructor HTMLTableRowElement;
        attribute HTMLTableSectionElementConstructor HTMLTableSectionElement;
        attribute HTMLTextAreaElementConstructor HTMLTextAreaElement;
        attribute HTMLTitleElementConstructor HTMLTitleElement;
        attribute HTMLUListElementConstructor HTMLUListElement;

        attribute HTMLCollectionConstructor HTMLCollection;

        attribute CanvasRenderingContext2DConstructor CanvasRenderingContext2D;
        attribute TextMetricsConstructor TextMetrics;

        attribute EventConstructor Event;
        attribute KeyboardEventConstructor KeyboardEvent;
        attribute MouseEventConstructor MouseEvent;
        attribute MutationEventConstructor MutationEvent;
        attribute OverflowEventConstructor OverflowEvent;
        attribute ProgressEventConstructor ProgressEvent;
        attribute TextEventConstructor TextEvent;
        attribute UIEventConstructor UIEvent;
        attribute WebKitAnimationEventConstructor WebKitAnimationEvent;
        attribute WebKitTransitionEventConstructor WebKitTransitionEvent;
        attribute WheelEventConstructor WheelEvent;
        attribute MessageEventConstructor MessageEvent;
        attribute EventExceptionConstructor EventException;

        attribute WebKitCSSKeyframeRuleConstructor WebKitCSSKeyframeRule;
        attribute WebKitCSSKeyframesRuleConstructor WebKitCSSKeyframesRule;

#if ENABLE_CHANNEL_MESSAGING
        attribute MessagePortConstructor MessagePort;
#endif

        attribute ClipboardConstructor Clipboard;

        attribute FileConstructor File;
        attribute FileListConstructor FileList;

        attribute NodeFilterConstructor NodeFilter;
        attribute RangeConstructor Range;
        attribute RangeExceptionConstructor RangeException;

        // Mozilla has a separate XMLDocument object for XML documents. 
        // We just use Document for this.
        attribute DocumentConstructor XMLDocument;

        attribute DOMParserConstructor DOMParser;
        attribute XMLSerializerConstructor XMLSerializer;

        attribute XMLHttpRequestUploadConstructor XMLHttpRequestUpload;
        attribute XMLHttpRequestExceptionConstructor XMLHttpRequestException;

        attribute PluginConstructor Plugin;
        attribute PluginArrayConstructor PluginArray;

        attribute MimeTypeConstructor MimeType;
        attribute MimeTypeArrayConstructor MimeTypeArray;

#if ENABLE_DOM_STORAGE
        attribute StorageConstructor Storage;
        attribute StorageEventConstructor StorageEvent;
#endif

        attribute [Conditional=VIDEO] HTMLAudioElementConstructor HTMLAudioElement;
        attribute [Conditional=VIDEO] HTMLMediaElementConstructor HTMLMediaElement;
        attribute [Conditional=VIDEO] HTMLVideoElementConstructor HTMLVideoElement;
        attribute [Conditional=VIDEO] MediaErrorConstructor MediaError;

#if ENABLE_XPATH
        attribute XPathEvaluatorConstructor XPathEvaluator;
        attribute XPathResultConstructor XPathResult;
        attribute XPathExceptionConstructor XPathException;
#endif

#if ENABLE_SVG
        attribute SVGAngleConstructor SVGAngle;
        attribute SVGColorConstructor SVGColor;
//      attribute SVGCSSRuleConstructor SVGCSSRule;
        attribute SVGExceptionConstructor SVGException;
        attribute SVGGradientElementConstructor SVGGradientElement;
        attribute SVGLengthConstructor SVGLength;
        attribute SVGMarkerElementConstructor SVGMarkerElement;
        attribute SVGPaintConstructor SVGPaint;
        attribute SVGPathSegConstructor SVGPathSeg;
        attribute SVGPreserveAspectRatioConstructor SVGPreserveAspectRatio;
        attribute SVGRenderingIntentConstructor SVGRenderingIntent;
        attribute SVGTextContentElementConstructor SVGTextContentElement;
        attribute SVGTextPathElementConstructor SVGTextPathElement;
        attribute SVGTransformConstructor SVGTransform;
        attribute SVGUnitTypesConstructor SVGUnitTypes;
//      attribute SVGZoomAndPanConstructor SVGZoomAndPan;
#endif

#if ENABLE_SVG_FILTERS
        attribute SVGComponentTransferFunctionElementConstructor SVGComponentTransferFunctionElement;
        attribute SVGFEBlendElementConstructor SVGFEBlendElement;
        attribute SVGFEColorMatrixElementConstructor SVGFEColorMatrixElement;
        attribute SVGFECompositeElementConstructor SVGFECompositeElement;
//      attribute SVGFEConvolveMatrixElementConstructor SVGFEConvolveMatrixElement;
        attribute SVGFEDisplacementMapElementConstructor SVGFEDisplacementMapElement;
//      attribute SVGFEMorphologyElementConstructor SVGFEMorphologyElement;
        attribute SVGFETurbulenceElementConstructor SVGFETurbulenceElement;
#endif

#endif // defined(LANGUAGE_JAVASCRIPT)
    };

}
