/*
 * 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 [
        LegacyParent=KJS::Window,
        DoNotCache,
        CheckDomainSecurity,
        GenerateNativeConverter,
        CustomGetOwnPropertySlot,
        CustomPutFunction,
        CustomDeleteProperty,
        CustomGetPropertyNames
    ] 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;

        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 defined(ENABLE_DATABASE)
        Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize)
            raises(DOMException);
#endif

                 attribute [Replaceable] Console console;

#if defined(ENABLE_CROSS_DOCUMENT_MESSAGING)
        // cross-document messaging
        [DoNotCheckDomainSecurity, Custom] void postMessage(in DOMString message);
#endif

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

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

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

        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 EventConstructor Event;
        attribute KeyboardEventConstructor KeyboardEvent;
        attribute MouseEventConstructor MouseEvent;
        attribute MutationEventConstructor MutationEvent;
        attribute OverflowEventConstructor OverflowEvent;
        attribute ProgressEventConstructor ProgressEvent;
        attribute TextEventConstructor TextEvent;
        attribute UIEventConstructor UIEvent;
        attribute WheelEventConstructor WheelEvent;
        attribute EventExceptionConstructor EventException;

        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 XMLHttpRequestExceptionConstructor XMLHttpRequestException;

#if defined(ENABLE_CROSS_DOCUMENT_MESSAGING)
        attribute MessageEventConstructor MessageEvent;
#endif

#if defined(ENABLE_VIDEO)
        attribute HTMLAudioElementConstructor HTMLAudioElement;
        attribute HTMLMediaElementConstructor HTMLMediaElement;
        attribute HTMLVideoElementConstructor HTMLVideoElement;
        attribute MediaErrorConstructor MediaError;
#endif

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

#if defined(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 defined(ENABLED_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)
    };

}
