/*
 * Copyright (C) 2006, 2007, 2008, 2009 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,
        EventTarget,
        GenerateNativeConverter,
        LegacyParent=JSDOMWindowBase
    ] DOMWindow {
        // DOM Level 0
        readonly attribute Screen screen;
        readonly attribute [DoNotCheckDomainSecurity, JSCCustomGetter] 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, JSCCustom, V8CustomSetter, V8DisallowShadowing] Location location;

        attribute [Replaceable, CustomGetter, V8CustomSetter] Event event;

        readonly attribute [Custom] Crypto crypto;

        DOMSelection getSelection();

        readonly attribute [CheckNodeSecurity] Element frameElement;

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

        void print();
        void stop();

        [Custom] DOMWindow open(in DOMString url,
                                in DOMString name,
                                in [Optional] DOMString options);

        [Custom] DOMObject showModalDialog(in DOMString url,
                                           in [Optional] DOMObject dialogArgs,
                                           in [Optional] DOMString featureArgs);

        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) && 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, V8DisallowShadowing] DOMWindow window;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGet] DOMWindow frames;

        attribute [Replaceable, DoNotCheckDomainSecurityOnGet, V8CustomSetter] DOMWindow opener;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGet] DOMWindow parent;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGet, V8DisallowShadowing, V8ReadOnly] DOMWindow top;

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

        // CSSOM View Module
        readonly attribute Media media;

        // 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;
        
        WebKitPoint webkitConvertPointFromPageToNode(in Node node, in WebKitPoint p);
        WebKitPoint webkitConvertPointFromNodeToPage(in Node node, in WebKitPoint p);

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

#if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
        // This is the interface orientation in degrees. Some examples are:
        //  0 is straight up; -90 is when the device is rotated 90 clockwise;
        //  90 is when rotated counter clockwise.
        readonly attribute long orientation;
#endif

                 attribute [Replaceable] Console console;

        // cross-document messaging
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        [DoNotCheckDomainSecurity, Custom] void postMessage(in SerializedScriptValue message, in [Optional] Array messagePorts, in DOMString targetOrigin)
            raises(DOMException);
#else
        // There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
        [DoNotCheckDomainSecurity, Custom] void postMessage(in SerializedScriptValue message, in [Optional] MessagePort messagePort, in DOMString targetOrigin)
            raises(DOMException);
#endif

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

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

        // Events
        attribute EventListener onabort;
        attribute EventListener onbeforeunload;
        attribute EventListener onblur;
        attribute EventListener oncanplay;
        attribute EventListener oncanplaythrough;
        attribute EventListener onchange;
        attribute EventListener onclick;
        attribute EventListener oncontextmenu;
        attribute EventListener ondblclick;
        attribute EventListener ondrag;
        attribute EventListener ondragend;
        attribute EventListener ondragenter;
        attribute EventListener ondragleave;
        attribute EventListener ondragover;
        attribute EventListener ondragstart;
        attribute EventListener ondrop;
        attribute EventListener ondurationchange;
        attribute EventListener onemptied;
        attribute EventListener onended;
        attribute EventListener onerror;
        attribute EventListener onfocus;
        attribute EventListener onhashchange;
        attribute EventListener oninput;
        attribute EventListener oninvalid;
        attribute EventListener onkeydown;
        attribute EventListener onkeypress;
        attribute EventListener onkeyup;
        attribute EventListener onload;
        attribute EventListener onloadeddata;
        attribute EventListener onloadedmetadata;
        attribute EventListener onloadstart;
        attribute EventListener onmessage;
        attribute EventListener onmousedown;
        attribute EventListener onmousemove;
        attribute EventListener onmouseout;
        attribute EventListener onmouseover;
        attribute EventListener onmouseup;
        attribute EventListener onmousewheel;
        attribute EventListener onoffline;
        attribute EventListener ononline;
        attribute EventListener onpagehide;
        attribute EventListener onpageshow;
        attribute EventListener onpause;
        attribute EventListener onplay;
        attribute EventListener onplaying;
        attribute EventListener onprogress;
        attribute EventListener onratechange;
        attribute EventListener onresize;
        attribute EventListener onscroll;
        attribute EventListener onseeked;
        attribute EventListener onseeking;
        attribute EventListener onselect;
        attribute EventListener onstalled;
        attribute EventListener onstorage;
        attribute EventListener onsubmit;
        attribute EventListener onsuspend;
        attribute EventListener ontimeupdate;
        attribute EventListener onunload;
        attribute EventListener onvolumechange;
        attribute EventListener onwaiting;

        // Not implemented yet.
        // attribute EventListener onafterprint;
        // attribute EventListener onbeforeprint;
        // attribute EventListener onformchange;
        // attribute EventListener onforminput;
        // attribute EventListener onpopstate;
        // attribute EventListener onreadystatechange;
        // attribute EventListener onredo;
        // attribute EventListener onshow;
        // attribute EventListener onundo;

        // Webkit extensions
        attribute EventListener onreset;
        attribute EventListener onsearch;
        attribute EventListener onwebkitanimationend;
        attribute EventListener onwebkitanimationiteration;
        attribute EventListener onwebkitanimationstart;
        attribute EventListener onwebkittransitionend;
#if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
        attribute EventListener onorientationchange;
#endif

        // 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);
        boolean dispatchEvent(in Event evt)
            raises(EventException);

        [V8Custom=DOMWindowNOP] void captureEvents(/*in long eventFlags*/);
        [V8Custom=DOMWindowNOP] void releaseEvents(/*in long eventFlags*/);

#if defined(LANGUAGE_JAVASCRIPT) && 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 RGBColorConstructor RGBColor;
        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 [Conditional=DATAGRID] HTMLDataGridElementConstructor HTMLDataGridElement;
        attribute [Conditional=DATAGRID] HTMLDataGridCellElementConstructor HTMLDataGridCellElement;
        attribute [Conditional=DATAGRID] HTMLDataGridColElementConstructor HTMLDataGridColElement;
        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 [CustomGetter] HTMLImageElementConstructor Image; // Usable with new operator
        attribute [CustomGetter] HTMLOptionElementConstructor Option; // Usable with new operator

        attribute CanvasRenderingContext2DConstructor CanvasRenderingContext2D;
        attribute [Conditional=3D_CANVAS] CanvasRenderingContext3DConstructor CanvasRenderingContext3D;
        attribute TextMetricsConstructor TextMetrics;

        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasArrayBufferConstructor CanvasArrayBuffer; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasByteArrayConstructor CanvasByteArray; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasUnsignedByteArrayConstructor CanvasUnsignedByteArray; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasShortArrayConstructor CanvasShortArray; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasUnsignedShortArrayConstructor CanvasUnsignedShortArray; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasIntArrayConstructor CanvasIntArray; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasUnsignedIntArrayConstructor CanvasUnsignedIntArray; // Usable with new operator
        attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasFloatArrayConstructor CanvasFloatArray; // Usable with new operator

        attribute EventConstructor Event;
        attribute BeforeLoadEventConstructor BeforeLoadEvent;
        attribute KeyboardEventConstructor KeyboardEvent;
        attribute MouseEventConstructor MouseEvent;
        attribute MutationEventConstructor MutationEvent;
        attribute OverflowEventConstructor OverflowEvent;
        attribute PageTransitionEventConstructor PageTransitionEvent;
        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;

        attribute [JSCCustomGetter] WebKitCSSMatrixConstructor WebKitCSSMatrix; // Usable with the new operator

        attribute [JSCCustomGetter] WebKitPointConstructor WebKitPoint; // Usable with new the operator

        attribute ClipboardConstructor Clipboard;

        attribute FileConstructor File;
        attribute FileListConstructor FileList;

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

#if ENABLE_EVENTSOURCE
        attribute [JSCCustomGetter] EventSourceConstructor EventSource; // Usable with new the operator
#endif

        // 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 [JSCCustomGetter] XMLHttpRequestConstructor XMLHttpRequest; // Usable with the new operator
        attribute XMLHttpRequestUploadConstructor XMLHttpRequestUpload;
        attribute XMLHttpRequestExceptionConstructor XMLHttpRequestException;

        attribute [JSCCustomGetter,Conditional=XSLT] XSLTProcessorConstructor XSLTProcessor; // Usable with the new operator

#if defined(ENABLE_CHANNEL_MESSAGING) && ENABLE_CHANNEL_MESSAGING
        attribute MessagePortConstructor MessagePort;
        attribute [JSCCustomGetter] MessageChannelConstructor MessageChannel; // Usable with the new operator
#endif

#if defined(ENABLE_WORKERS) && ENABLE_WORKERS
        attribute [JSCCustomGetter] WorkerConstructor Worker; // Usable with the new operator
#endif

#if defined(ENABLE_SHARED_WORKERS) && ENABLE_SHARED_WORKERS
        attribute [JSCCustomGetter, EnabledAtRuntime] SharedWorkerConstructor SharedWorker; // Usable with the new operator
#endif

#if defined(ENABLE_WEB_SOCKETS) && ENABLE_WEB_SOCKETS
        attribute [JSCCustomGetter,EnabledAtRuntime] WebSocketConstructor WebSocket; // Usable with the new operator
#endif

        attribute PluginConstructor Plugin;
        attribute PluginArrayConstructor PluginArray;

        attribute MimeTypeConstructor MimeType;
        attribute MimeTypeArrayConstructor MimeTypeArray;

        attribute ClientRectConstructor ClientRect;
        attribute ClientRectListConstructor ClientRectList;

#if defined(ENABLE_DOM_STORAGE) && ENABLE_DOM_STORAGE
        attribute StorageConstructor Storage;
        attribute StorageEventConstructor StorageEvent;
#endif

        attribute [CustomGetter, Conditional=VIDEO, EnabledAtRuntime] HTMLAudioElementConstructor Audio; // Usable with the new operator
        attribute [Conditional=VIDEO, EnabledAtRuntime] HTMLAudioElementConstructor HTMLAudioElement;
        attribute [Conditional=VIDEO, EnabledAtRuntime] HTMLMediaElementConstructor HTMLMediaElement;
        attribute [Conditional=VIDEO, EnabledAtRuntime] HTMLVideoElementConstructor HTMLVideoElement;
        attribute [Conditional=VIDEO, EnabledAtRuntime] MediaErrorConstructor MediaError;

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

#if defined(ENABLE_SVG) && 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;

#if defined(ENABLE_FILTERS) && ENABLE_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

#endif // defined(LANGUAGE_JAVASCRIPT)

#if defined(V8_BINDING) && V8_BINDING
        // window.toString() requires special handling in V8
        [V8DoNotCheckSignature, DoNotCheckDomainSecurity, Custom, DontEnum] DOMString toString();
#endif // defined(V8_BINDING)
    };

}
