/*
 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
 * Copyright (C) 2011 Google 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,
        JSCustomDefineOwnProperty,
        CustomDeleteProperty,
        CustomGetOwnPropertySlot,
        CustomEnumerateProperty,
        JSCustomMarkFunction,
        JSCustomToNativeObject,
        CustomPutFunction,
        EventTarget,
        ExtendsDOMGlobalObject,
        JSGenerateToNativeObject,
        ReplaceableConstructor,
        JSLegacyParent=JSDOMWindowBase,
        V8CustomToJSObject
    ] DOMWindow {
        // DOM Level 0
        attribute [Replaceable] Screen screen;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGetter] 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;
        readonly attribute Crypto crypto;
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
        attribute [DoNotCheckDomainSecurity, CustomSetter, V8CustomSetter, V8Unforgeable] Location location;
#endif
        attribute [Replaceable, CustomGetter, V8CustomSetter] Event event;


        DOMSelection getSelection();

        readonly attribute [CheckAccessToNode] Element frameElement;

        [DoNotCheckDomainSecurity] void focus();
        [DoNotCheckDomainSecurity] void blur();
        [DoNotCheckDomainSecurity, CallWith=ScriptExecutionContext] 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 [Optional=DefaultIsUndefined] DOMString message);
        boolean confirm(in [Optional=DefaultIsUndefined] DOMString message);
        [TreatReturnedNullStringAs=Null] DOMString prompt(in [Optional=DefaultIsUndefined] DOMString message,
                                                    in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString defaultValue);

        boolean find(in [Optional=DefaultIsUndefined] DOMString string,
                     in [Optional=DefaultIsUndefined] boolean caseSensitive,
                     in [Optional=DefaultIsUndefined] boolean backwards,
                     in [Optional=DefaultIsUndefined] boolean wrap,
                     in [Optional=DefaultIsUndefined] boolean wholeWord,
                     in [Optional=DefaultIsUndefined] boolean searchInFrames,
                     in [Optional=DefaultIsUndefined] 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;

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

        readonly attribute [DoNotCheckDomainSecurity] boolean closed;

        attribute [Replaceable, DoNotCheckDomainSecurityOnGetter] 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, DoNotCheckDomainSecurityOnGetter] DOMWindow self;
        readonly attribute [DoNotCheckDomainSecurity, V8Unforgeable] DOMWindow window;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGetter] DOMWindow frames;

        attribute [Replaceable, DoNotCheckDomainSecurityOnGetter, V8CustomSetter] DOMWindow opener;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGetter] DOMWindow parent;
        attribute [Replaceable, DoNotCheckDomainSecurityOnGetter, V8Unforgeable, V8ReadOnly] DOMWindow top;

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

        // CSSOM View Module
        MediaQueryList matchMedia(in DOMString query);

        // styleMedia has been removed from the CSSOM View specification.
        readonly attribute StyleMedia styleMedia;

        // DOM Level 2 Style Interface
        CSSStyleDeclaration getComputedStyle(in [Optional=DefaultIsUndefined] Element element,
                                             in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString pseudoElement);

        // WebKit extensions
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        CSSRuleList getMatchedCSSRules(in [Optional=DefaultIsUndefined] Element element,
                                       in [Optional=DefaultIsUndefined] DOMString pseudoElement);
#endif

        attribute [Replaceable] double devicePixelRatio;
        
        WebKitPoint webkitConvertPointFromPageToNode(in [Optional=DefaultIsUndefined] Node node, 
                                                     in [Optional=DefaultIsUndefined] WebKitPoint p);
        WebKitPoint webkitConvertPointFromNodeToPage(in [Optional=DefaultIsUndefined] Node node, 
                                                     in [Optional=DefaultIsUndefined] WebKitPoint p);

        readonly attribute [V8EnabledAtRuntime] DOMApplicationCache applicationCache;

        readonly attribute [V8EnabledAtRuntime] Storage sessionStorage
            getter raises(DOMException);
        readonly attribute [V8EnabledAtRuntime] Storage localStorage
            getter raises(DOMException);

#if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS
        readonly attribute [V8EnabledAtRuntime] NotificationCenter webkitNotifications;
#endif
#if defined(ENABLE_FILE_SYSTEM) && ENABLE_FILE_SYSTEM
        const unsigned short TEMPORARY = 0;
        const unsigned short PERSISTENT = 1;
        [V8EnabledAtRuntime=FileSystem] void webkitRequestFileSystem(in unsigned short type, in long long size, in [Callback] FileSystemCallback successCallback, in [Callback, Optional] ErrorCallback errorCallback);
        [V8EnabledAtRuntime=FileSystem] void webkitResolveLocalFileSystemURL(in DOMString url, in [Callback, Optional] EntryCallback successCallback, in [Callback, Optional] ErrorCallback errorCallback);
#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 DOMString targetOrigin)
            raises(DOMException);
        [DoNotCheckDomainSecurity, Custom] void postMessage(in SerializedScriptValue message, in DOMString targetOrigin, in Array messagePorts)
            raises(DOMException);

        [DoNotCheckDomainSecurity, Custom] void webkitPostMessage(in SerializedScriptValue message, in DOMString targetOrigin)
            raises(DOMException);
        [DoNotCheckDomainSecurity, Custom] void webkitPostMessage(in SerializedScriptValue message, in DOMString targetOrigin, in Array transferList)
            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

#if defined(ENABLE_WEB_TIMING) && ENABLE_WEB_TIMING
        attribute [Replaceable] Performance performance;
#endif

        // Timers
        [Custom] long setTimeout(in [Optional=DefaultIsUndefined] TimeoutHandler handler, 
                                 in [Optional=DefaultIsUndefined] long timeout);
        // [Custom] long setTimeout(in TimeoutHandler handler, in long timeout, arguments...);
        // [Custom] long setTimeout(in DOMString code, in long timeout);
        void clearTimeout(in [Optional=DefaultIsUndefined] 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 [Optional=DefaultIsUndefined] long handle);

#if defined(ENABLE_REQUEST_ANIMATION_FRAME)
        // WebKit animation extensions, being standardized in the WebPerf WG
        long webkitRequestAnimationFrame(in [Callback] RequestAnimationFrameCallback callback, in [Optional=DefaultIsUndefined] Element element);
        void webkitCancelAnimationFrame(in long id);
        void webkitCancelRequestAnimationFrame(in long id); // This is a deprecated alias for webkitCancelAnimationFrame(). Remove this when removing vendor prefix.
#endif

        // Base64
        DOMString atob(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString string)
            raises(DOMException);
        DOMString btoa(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] 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 onpopstate;
        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 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
        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchstart;
        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchmove;
        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchend;
        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchcancel;

        attribute [Conditional=DEVICE_ORIENTATION,V8EnabledAtRuntime] EventListener ondevicemotion;
        attribute [Conditional=DEVICE_ORIENTATION,V8EnabledAtRuntime] EventListener ondeviceorientation;

        attribute [Conditional=MEDIA_STREAM,V8EnabledAtRuntime] PeerConnectionConstructor webkitPeerConnection;

        // EventTarget interface
        [Custom] void addEventListener(in DOMString type,
                                      in EventListener listener,
                                      in [Optional] boolean useCapture);
        [Custom] void removeEventListener(in DOMString type,
                                          in EventListener listener,
                                          in [Optional] 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;

#if defined(ENABLE_CSS_FILTERS) && ENABLE_CSS_FILTERS
        attribute WebKitCSSFilterValueConstructor WebKitCSSFilterValue;
#endif

        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 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 DOMSettableTokenListConstructor DOMSettableTokenList;
        attribute DOMTokenListConstructor DOMTokenList;
        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 [Conditional=SHADOW_DOM, V8EnabledAtRuntime=shadowDOM] ShadowRootConstructor WebKitShadowRoot;

        attribute HTMLDocumentConstructor HTMLDocument;
        attribute DOMWindowConstructor Window;

        attribute HTMLElementConstructor HTMLElement;
        attribute HTMLAnchorElementConstructor HTMLAnchorElement;
        attribute HTMLAppletElementConstructor HTMLAppletElement;
        attribute HTMLAreaElementConstructor HTMLAreaElement;
        attribute HTMLBRElementConstructor HTMLBRElement;
        attribute HTMLBaseElementConstructor HTMLBaseElement;
        attribute HTMLBaseFontElementConstructor HTMLBaseFontElement;
        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 HTMLKeygenElementConstructor HTMLKeygenElement;
        attribute HTMLLIElementConstructor HTMLLIElement;
        attribute HTMLLabelElementConstructor HTMLLabelElement;
        attribute HTMLLegendElementConstructor HTMLLegendElement;
        attribute HTMLLinkElementConstructor HTMLLinkElement;
        attribute HTMLMapElementConstructor HTMLMapElement;
        attribute HTMLMarqueeElementConstructor HTMLMarqueeElement;
        attribute HTMLMenuElementConstructor HTMLMenuElement;
        attribute HTMLMetaElementConstructor HTMLMetaElement;
#if defined(ENABLE_METER_TAG) && ENABLE_METER_TAG
        attribute HTMLMeterElementConstructor HTMLMeterElement;
#endif
        attribute HTMLModElementConstructor HTMLModElement;
        attribute HTMLOListElementConstructor HTMLOListElement;
        attribute HTMLObjectElementConstructor HTMLObjectElement;
        attribute HTMLOptGroupElementConstructor HTMLOptGroupElement;
        attribute HTMLOptionElementConstructor HTMLOptionElement;
        attribute HTMLOutputElementConstructor HTMLOutputElement;
        attribute HTMLParagraphElementConstructor HTMLParagraphElement;
        attribute HTMLParamElementConstructor HTMLParamElement;
        attribute HTMLPreElementConstructor HTMLPreElement;
#if defined(ENABLE_PROGRESS_TAG) && ENABLE_PROGRESS_TAG
        attribute HTMLProgressElementConstructor HTMLProgressElement;
#endif
        attribute HTMLQuoteElementConstructor HTMLQuoteElement;
        attribute HTMLScriptElementConstructor HTMLScriptElement;
        attribute HTMLSelectElementConstructor HTMLSelectElement;
        attribute HTMLSpanElementConstructor HTMLSpanElement;
        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 HTMLAllCollectionConstructor HTMLAllCollection;
        attribute [Conditional=MICRODATA] HTMLPropertiesCollectionConstructor HTMLPropertiesCollection;
        attribute HTMLUnknownElementConstructor HTMLUnknownElement;

        attribute [JSCustomGetter, CustomConstructor] HTMLImageElementConstructorConstructor Image; // Usable with new operator
        attribute [JSCustomGetter] HTMLOptionElementConstructorConstructor Option; // Usable with new operator

        attribute CanvasPatternConstructor CanvasPattern;
        attribute CanvasGradientConstructor CanvasGradient;
        attribute CanvasRenderingContext2DConstructor CanvasRenderingContext2D;
        attribute ImageDataConstructor ImageData;
        attribute [Conditional=WEBGL] WebGLActiveInfoConstructor WebGLActiveInfo;
        attribute [Conditional=WEBGL] WebGLBufferConstructor WebGLBuffer;
        attribute [Conditional=WEBGL] WebGLFramebufferConstructor WebGLFramebuffer;
        attribute [Conditional=WEBGL] WebGLProgramConstructor WebGLProgram;
        attribute [Conditional=WEBGL] WebGLRenderbufferConstructor WebGLRenderbuffer;
        attribute [Conditional=WEBGL] WebGLRenderingContextConstructor WebGLRenderingContext;
        attribute [Conditional=WEBGL] WebGLShaderConstructor WebGLShader;
        attribute [Conditional=WEBGL] WebGLTextureConstructor WebGLTexture;
        attribute [Conditional=WEBGL] WebGLUniformLocationConstructor WebGLUniformLocation;
        attribute TextMetricsConstructor TextMetrics;

        attribute DOMStringMapConstructor DOMStringMap;

        attribute ArrayBufferConstructor ArrayBuffer; // Usable with new operator
        attribute Int8ArrayConstructor Int8Array; // Usable with new operator
        attribute Uint8ArrayConstructor Uint8Array; // Usable with new operator
        attribute Uint8ClampedArrayConstructor Uint8ClampedArray; // Usable with new operator
        attribute Int16ArrayConstructor Int16Array; // Usable with new operator
        attribute Uint16ArrayConstructor Uint16Array; // Usable with new operator
        attribute Int32ArrayConstructor Int32Array; // Usable with new operator
        attribute Uint32ArrayConstructor Uint32Array; // Usable with new operator
        attribute Float32ArrayConstructor Float32Array; // Usable with new operator
        attribute Float64ArrayConstructor Float64Array; // Usable with new operator
        attribute DataViewConstructor DataView; // Usable with new operator

        // Event Constructors
        attribute EventConstructor Event;
        attribute BeforeLoadEventConstructor BeforeLoadEvent;
        attribute CompositionEventConstructor CompositionEvent;
        attribute CustomEventConstructor CustomEvent;
        attribute ErrorEventConstructor ErrorEvent;
        attribute HashChangeEventConstructor HashChangeEvent;
        attribute KeyboardEventConstructor KeyboardEvent;
        attribute MessageEventConstructor MessageEvent;
        attribute MouseEventConstructor MouseEvent;
        attribute MutationEventConstructor MutationEvent;
        attribute OverflowEventConstructor OverflowEvent;
        attribute PopStateEventConstructor PopStateEvent;
        attribute PageTransitionEventConstructor PageTransitionEvent;
        attribute ProgressEventConstructor ProgressEvent;
        attribute TextEventConstructor TextEvent;
        attribute UIEventConstructor UIEvent;
        attribute WebKitAnimationEventConstructor WebKitAnimationEvent;
        attribute WebKitTransitionEventConstructor WebKitTransitionEvent;
        attribute WheelEventConstructor WheelEvent;
        attribute XMLHttpRequestProgressEventConstructor XMLHttpRequestProgressEvent;
        attribute [Conditional=SVG] SVGZoomEventConstructor SVGZoomEvent;
        attribute [Conditional=DEVICE_ORIENTATION, V8EnabledAtRuntime] DeviceMotionEventConstructor DeviceMotionEvent;
        attribute [Conditional=DEVICE_ORIENTATION, V8EnabledAtRuntime] DeviceOrientationEventConstructor DeviceOrientationEvent;
        attribute [Conditional=TOUCH_EVENTS] TouchEventConstructor TouchEvent;
        attribute StorageEventConstructor StorageEvent;
        attribute [Conditional=INPUT_SPEECH] SpeechInputEventConstructor SpeechInputEvent;
        attribute [Conditional=MEDIA_STREAM] MediaStreamEventConstructor MediaStreamEvent;
        attribute [Conditional=WEBGL] WebGLContextEventConstructor WebGLContextEvent;

        attribute EventExceptionConstructor EventException;

        attribute WebKitCSSKeyframeRuleConstructor WebKitCSSKeyframeRule;
        attribute WebKitCSSKeyframesRuleConstructor WebKitCSSKeyframesRule;
        attribute WebKitCSSRegionRuleConstructor WebKitCSSRegionRule;

        attribute WebKitCSSMatrixConstructor WebKitCSSMatrix; // Usable with the new operator

        attribute WebKitPointConstructor WebKitPoint; // Usable with new the operator

        attribute ClipboardConstructor Clipboard;

        attribute FileConstructor File;
        attribute FileListConstructor FileList;
        attribute BlobConstructor Blob;

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

        attribute EventSourceConstructor EventSource; // Usable with new the operator

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

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

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

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

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

#if defined(ENABLE_VIDEO_TRACK) && ENABLE_VIDEO_TRACK
        attribute [V8EnabledAtRuntime=webkitVideoTrack] HTMLTrackElementConstructor HTMLTrackElement;
        attribute [V8EnabledAtRuntime=webkitVideoTrack] TextTrackConstructor TextTrack;
        attribute [V8EnabledAtRuntime=webkitVideoTrack] TextTrackCueConstructor TextTrackCue; // Usable with the new operator
        attribute [V8EnabledAtRuntime=webkitVideoTrack] TextTrackCueListConstructor TextTrackCueList;
        attribute [V8EnabledAtRuntime=webkitVideoTrack] TextTrackListConstructor TextTrackList;
        attribute [V8EnabledAtRuntime=webkitVideoTrack] TrackEventConstructor TrackEvent;
#endif

        attribute DOMPluginConstructor Plugin;
        attribute DOMPluginArrayConstructor PluginArray;

        attribute DOMMimeTypeConstructor MimeType;
        attribute DOMMimeTypeArrayConstructor MimeTypeArray;

        attribute ClientRectConstructor ClientRect;
        attribute ClientRectListConstructor ClientRectList;

        attribute StorageConstructor Storage;

        attribute [JSCustomGetter, Conditional=VIDEO, V8EnabledAtRuntime] HTMLAudioElementConstructorConstructor Audio; // Usable with the new operator
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLAudioElementConstructor HTMLAudioElement;
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLMediaElementConstructor HTMLMediaElement;
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLVideoElementConstructor HTMLVideoElement;
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] MediaErrorConstructor MediaError;
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] TimeRangesConstructor TimeRanges;
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLSourceElementConstructor HTMLSourceElement;
        attribute [Conditional=VIDEO, V8EnabledAtRuntime] MediaControllerConstructor MediaController;

#if defined(ENABLE_ANIMATION_API) && ENABLE_ANIMATION_API
        attribute WebKitAnimationConstructor WebKitAnimation;
        attribute WebKitAnimationListConstructor WebKitAnimationList;
#endif

        attribute XPathEvaluatorConstructor XPathEvaluator;
        attribute XPathResultConstructor XPathResult;
        attribute XPathExceptionConstructor XPathException;

#if defined(ENABLE_SVG) && ENABLE_SVG
        // Expose all implemented SVG 1.1 interfaces, excluding the SVG MI interfaces:
        // SVGAnimatedPathData, SVGAnimatedPoints, SVGExternalResourcesRequired,
        // SVGFilterPrimitiveStandardAttributes, SVGFitToViewBox, SVGLangSpace, SVGLocatable
        // SVGStylable, SVGTests, SVGTransformable, SVGURIReference, SVGZoomAndPan
        attribute SVGAElementConstructor SVGAElement;
        attribute SVGAngleConstructor SVGAngle;
        attribute SVGAnimatedAngleConstructor SVGAnimatedAngle;
        attribute SVGAnimatedBooleanConstructor SVGAnimatedBoolean;
        attribute SVGAnimatedEnumerationConstructor SVGAnimatedEnumeration;
        attribute SVGAnimatedIntegerConstructor SVGAnimatedInteger;
        attribute SVGAnimatedLengthConstructor SVGAnimatedLength;
        attribute SVGAnimatedLengthListConstructor SVGAnimatedLengthList;
        attribute SVGAnimatedNumberConstructor SVGAnimatedNumber;
        attribute SVGAnimatedNumberListConstructor SVGAnimatedNumberList;
        attribute SVGAnimatedPreserveAspectRatioConstructor SVGAnimatedPreserveAspectRatio;
        attribute SVGAnimatedRectConstructor SVGAnimatedRect;
        attribute SVGAnimatedStringConstructor SVGAnimatedString;
        attribute SVGAnimatedTransformListConstructor SVGAnimatedTransformList;
        attribute SVGCircleElementConstructor SVGCircleElement;
        attribute SVGClipPathElementConstructor SVGClipPathElement;
        attribute SVGColorConstructor SVGColor;
        attribute SVGCursorElementConstructor SVGCursorElement;
//      attribute SVGCSSRuleConstructor SVGCSSRule;
        attribute SVGDefsElementConstructor SVGDefsElement;
        attribute SVGDescElementConstructor SVGDescElement;
        attribute SVGDocumentConstructor SVGDocument;
        attribute SVGElementConstructor SVGElement;
        attribute SVGElementInstanceConstructor SVGElementInstance;
        attribute SVGElementInstanceListConstructor SVGElementInstanceList;
        attribute SVGEllipseElementConstructor SVGEllipseElement;
        attribute SVGForeignObjectElementConstructor SVGForeignObjectElement;
        attribute SVGExceptionConstructor SVGException;
        attribute SVGGElementConstructor SVGGElement;
        attribute SVGGradientElementConstructor SVGGradientElement;
        attribute SVGImageElementConstructor SVGImageElement;
        attribute SVGLengthConstructor SVGLength;
        attribute SVGLengthListConstructor SVGLengthList;
        attribute SVGLinearGradientElementConstructor SVGLinearGradientElement;
        attribute SVGLineElementConstructor SVGLineElement;
        attribute SVGMarkerElementConstructor SVGMarkerElement;
        attribute SVGMaskElementConstructor SVGMaskElement;
        attribute SVGMatrixConstructor SVGMatrix;
        attribute SVGMetadataElementConstructor SVGMetadataElement;
        attribute SVGNumberConstructor SVGNumber;
        attribute SVGNumberListConstructor SVGNumberList;
        attribute SVGPaintConstructor SVGPaint;
        attribute SVGPathElementConstructor SVGPathElement;
        attribute SVGPathSegConstructor SVGPathSeg;
        attribute SVGPathSegArcAbsConstructor SVGPathSegArcAbs;
        attribute SVGPathSegArcRelConstructor SVGPathSegArcRel;
        attribute SVGPathSegClosePathConstructor SVGPathSegClosePath;
        attribute SVGPathSegCurvetoCubicAbsConstructor SVGPathSegCurvetoCubicAbs;
        attribute SVGPathSegCurvetoCubicRelConstructor SVGPathSegCurvetoCubicRel;
        attribute SVGPathSegCurvetoCubicSmoothAbsConstructor SVGPathSegCurvetoCubicSmoothAbs;
        attribute SVGPathSegCurvetoCubicSmoothRelConstructor SVGPathSegCurvetoCubicSmoothRel;
        attribute SVGPathSegCurvetoQuadraticAbsConstructor SVGPathSegCurvetoQuadraticAbs;
        attribute SVGPathSegCurvetoQuadraticRelConstructor SVGPathSegCurvetoQuadraticRel;
        attribute SVGPathSegCurvetoQuadraticSmoothAbsConstructor SVGPathSegCurvetoQuadraticSmoothAbs;
        attribute SVGPathSegCurvetoQuadraticSmoothRelConstructor SVGPathSegCurvetoQuadraticSmoothRel;
        attribute SVGPathSegLinetoAbsConstructor SVGPathSegLinetoAbs;
        attribute SVGPathSegLinetoHorizontalAbsConstructor SVGPathSegLinetoHorizontalAbs;
        attribute SVGPathSegLinetoHorizontalRelConstructor SVGPathSegLinetoHorizontalRel;
        attribute SVGPathSegLinetoRelConstructor SVGPathSegLinetoRel;
        attribute SVGPathSegLinetoVerticalAbsConstructor SVGPathSegLinetoVerticalAbs;
        attribute SVGPathSegLinetoVerticalRelConstructor SVGPathSegLinetoVerticalRel;
        attribute SVGPathSegListConstructor SVGPathSegList;
        attribute SVGPathSegMovetoAbsConstructor SVGPathSegMovetoAbs;
        attribute SVGPathSegMovetoRelConstructor SVGPathSegMovetoRel;
        attribute SVGPatternElementConstructor SVGPatternElement;
        attribute SVGPointConstructor SVGPoint;
        attribute SVGPointListConstructor SVGPointList;
        attribute SVGPolygonElementConstructor SVGPolygonElement;
        attribute SVGPolylineElementConstructor SVGPolylineElement;
        attribute SVGPreserveAspectRatioConstructor SVGPreserveAspectRatio;
        attribute SVGRadialGradientElementConstructor SVGRadialGradientElement;
        attribute SVGRectConstructor SVGRect;
        attribute SVGRectElementConstructor SVGRectElement;
        attribute SVGRenderingIntentConstructor SVGRenderingIntent;
        attribute SVGScriptElementConstructor SVGScriptElement;
        attribute SVGStopElementConstructor SVGStopElement;
        attribute SVGStringListConstructor SVGStringList;
        attribute SVGStyleElementConstructor SVGStyleElement;
        attribute SVGSVGElementConstructor SVGSVGElement;
        attribute SVGSwitchElementConstructor SVGSwitchElement;
        attribute SVGSymbolElementConstructor SVGSymbolElement;
        attribute SVGTextContentElementConstructor SVGTextContentElement;
        attribute SVGTextElementConstructor SVGTextElement;
        attribute SVGTextPathElementConstructor SVGTextPathElement;
        attribute SVGTextPositioningElementConstructor SVGTextPositioningElement;
        attribute SVGTitleElementConstructor SVGTitleElement;
        attribute SVGTransformConstructor SVGTransform;
        attribute SVGTransformListConstructor SVGTransformList;
        attribute SVGTRefElementConstructor SVGTRefElement;
        attribute SVGTSpanElementConstructor SVGTSpanElement;
        attribute SVGUnitTypesConstructor SVGUnitTypes;
        attribute SVGUseElementConstructor SVGUseElement;
        attribute SVGViewElementConstructor SVGViewElement;
//      attribute SVGViewSpecConstructor SVGViewSpec;

        attribute SVGAnimateColorElementConstructor SVGAnimateColorElement;
        attribute SVGAnimateElementConstructor SVGAnimateElement;
        attribute SVGAnimateMotionElementConstructor SVGAnimateMotionElement;
        attribute SVGAnimateTransformElementConstructor SVGAnimateTransformElement;
        attribute SVGMPathElementConstructor SVGMPathElement;
        attribute SVGSetElementConstructor SVGSetElement;

#if defined(ENABLE_SVG_FONTS) && ENABLE_SVG_FONTS
        attribute SVGAltGlyphDefElementConstructor SVGAltGlyphDefElement;
        attribute SVGAltGlyphElementConstructor SVGAltGlyphElement;
        attribute SVGAltGlyphItemElementConstructor SVGAltGlyphItemElement;
//      attribute SVGDefinitionSrcElementConstructor SVGDefinitionSrcElement;
        attribute SVGFontElementConstructor SVGFontElement;
        attribute SVGFontFaceElementConstructor SVGFontFaceElement;
        attribute SVGFontFaceFormatElementConstructor SVGFontFaceFormatElement;
        attribute SVGFontFaceNameElementConstructor SVGFontFaceNameElement;
        attribute SVGFontFaceSrcElementConstructor SVGFontFaceSrcElement;
        attribute SVGFontFaceUriElementConstructor SVGFontFaceUriElement;
        attribute SVGGlyphElementConstructor SVGGlyphElement;
        attribute SVGGlyphRefElementConstructor SVGGlyphRefElement;
        attribute SVGHKernElementConstructor SVGHKernElement;
        attribute SVGMissingGlyphElementConstructor SVGMissingGlyphElement;
        attribute SVGVKernElementConstructor SVGVKernElement;
#endif

#if defined(ENABLE_FILTERS) && ENABLE_FILTERS
        attribute SVGComponentTransferFunctionElementConstructor SVGComponentTransferFunctionElement;
        attribute SVGFEBlendElementConstructor SVGFEBlendElement;
        attribute SVGFEColorMatrixElementConstructor SVGFEColorMatrixElement;
        attribute SVGFEComponentTransferElementConstructor SVGFEComponentTransferElement;
        attribute SVGFECompositeElementConstructor SVGFECompositeElement;
        attribute SVGFEConvolveMatrixElementConstructor SVGFEConvolveMatrixElement;
        attribute SVGFEDiffuseLightingElementConstructor SVGFEDiffuseLightingElement;
        attribute SVGFEDisplacementMapElementConstructor SVGFEDisplacementMapElement;
        attribute SVGFEDistantLightElementConstructor SVGFEDistantLightElement;
        attribute SVGFEDropShadowElementConstructor SVGFEDropShadowElement;
        attribute SVGFEFloodElementConstructor SVGFEFloodElement;
        attribute SVGFEFuncAElementConstructor SVGFEFuncAElement;
        attribute SVGFEFuncBElementConstructor SVGFEFuncBElement;
        attribute SVGFEFuncGElementConstructor SVGFEFuncGElement;
        attribute SVGFEFuncRElementConstructor SVGFEFuncRElement;
        attribute SVGFEGaussianBlurElementConstructor SVGFEGaussianBlurElement;
        attribute SVGFEImageElementConstructor SVGFEImageElement;
        attribute SVGFEMergeElementConstructor SVGFEMergeElement;
        attribute SVGFEMergeNodeElementConstructor SVGFEMergeNodeElement;
        attribute SVGFEMorphologyElementConstructor SVGFEMorphologyElement;
        attribute SVGFEOffsetElementConstructor SVGFEOffsetElement;
        attribute SVGFEPointLightElementConstructor SVGFEPointLightElement;
        attribute SVGFESpecularLightingElementConstructor SVGFESpecularLightingElement;
        attribute SVGFESpotLightElementConstructor SVGFESpotLightElement;
        attribute SVGFETileElementConstructor SVGFETileElement;
        attribute SVGFETurbulenceElementConstructor SVGFETurbulenceElement;
        attribute SVGFilterElementConstructor SVGFilterElement;
#endif
#endif

        attribute DOMFormDataConstructor FormData;

        attribute [Conditional=BLOB|FILE_SYSTEM] FileErrorConstructor FileError;
        attribute [Conditional=BLOB] FileReaderConstructor FileReader;

        attribute [Conditional=BLOB] WebKitBlobBuilderConstructor WebKitBlobBuilder;

        attribute [Conditional=BLOB] DOMURLConstructor webkitURL;

#if defined(ENABLE_QUOTA) && ENABLE_QUOTA
        readonly attribute [V8EnabledAtRuntime=Quota] StorageInfo webkitStorageInfo;
#endif

        attribute [Conditional=MUTATION_OBSERVERS] WebKitMutationObserverConstructor WebKitMutationObserver;

#endif // defined(LANGUAGE_JAVASCRIPT)

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

}

