/*
 * 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.
 */

[
    CheckSecurity,
    JSCustomDefineOwnProperty,
    CustomDeleteProperty,
    CustomGetOwnPropertySlot,
    CustomEnumerateProperty,
    JSCustomMarkFunction,
    JSCustomToNativeObject,
    CustomPutFunction,
    EventTarget,
    ExtendsDOMGlobalObject,
    JSGenerateToNativeObject,
    ReplaceableConstructor,
    JSLegacyParent=JSDOMWindowBase,
    V8CustomToJSObject,
    V8NoWrapperCache,
    InterfaceName=Window
] interface DOMWindow {
    // DOM Level 0
    [Replaceable] readonly attribute Screen screen;
    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute History history;
    [Replaceable] readonly attribute BarInfo locationbar;
    [Replaceable] readonly attribute BarInfo menubar;
    [Replaceable] readonly attribute BarInfo personalbar;
    [Replaceable] readonly attribute BarInfo scrollbars;
    [Replaceable] readonly attribute BarInfo statusbar;
    [Replaceable] readonly attribute BarInfo toolbar;
    [Replaceable] readonly attribute Navigator navigator;
    [Replaceable] readonly attribute Navigator clientInformation;
    readonly attribute Crypto crypto;
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
    attribute [DoNotCheckSecurity, CustomSetter, V8Unforgeable] Location location;
#endif
    [Replaceable, CustomGetter, V8CustomSetter] readonly attribute Event event;

    DOMSelection getSelection();

    readonly attribute [CheckSecurityForNode] Element frameElement;

    [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void focus();
    [DoNotCheckSecurity] void blur();
    [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void close();

    void print();
    void stop();

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

    [Custom] any showModalDialog(in DOMString url,
                                       in [Optional] any 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);

    [Replaceable] readonly attribute  boolean offscreenBuffering;

    [Replaceable] readonly attribute long outerHeight;
    [Replaceable] readonly attribute long outerWidth;
    [Replaceable] readonly attribute long innerHeight;
    [Replaceable] readonly attribute long innerWidth;
    [Replaceable] readonly attribute long screenX;
    [Replaceable] readonly attribute long screenY;
    [Replaceable] readonly attribute long screenLeft;
    [Replaceable] readonly attribute long screenTop;
    [Replaceable] readonly attribute long scrollX;
    [Replaceable] readonly attribute 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 [DoNotCheckSecurity] boolean closed;

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

    [Replaceable, DoNotCheckSecurityOnGetter, V8CustomSetter] readonly attribute DOMWindow opener;
    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute DOMWindow parent;
    [DoNotCheckSecurityOnGetter, V8Unforgeable] readonly attribute 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 [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString pseudoElement);
#endif

    [Replaceable] readonly attribute 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_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

    [Replaceable] readonly attribute Console console;

    // cross-document messaging
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
    [DoNotCheckSecurity, Custom] void postMessage(in SerializedScriptValue message, in DOMString targetOrigin, in [Optional] Array messagePorts)
        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.
    [DoNotCheckSecurity, Custom] void postMessage(in SerializedScriptValue message, in [Optional] MessagePort messagePort, in DOMString targetOrigin)
        raises(DOMException);
#endif

#if defined(ENABLE_WEB_TIMING) && ENABLE_WEB_TIMING
    [Replaceable] readonly attribute 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) && ENABLE_REQUEST_ANIMATION_FRAME
    [V8MeasureAs=UnprefixedRequestAnimationFrame] long requestAnimationFrame(in [Callback] RequestAnimationFrameCallback callback);
    void cancelAnimationFrame(in long id);
    [V8MeasureAs=PrefixedRequestAnimationFrame] long webkitRequestAnimationFrame(in [Callback] RequestAnimationFrameCallback callback);
    [ImplementedAs=cancelAnimationFrame] void webkitCancelAnimationFrame(in long id);
    [ImplementedAs=cancelAnimationFrame] 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);

    attribute [Replaceable,Conditional=CSS3_CONDITIONAL_RULES] DOMWindowCSS CSS;

    // 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;
    attribute EventListener ontransitionend;
#if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
    attribute EventListener onorientationchange;
#endif
    attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] EventListener ontouchstart;
    attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] EventListener ontouchmove;
    attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] EventListener ontouchend;
    attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] EventListener ontouchcancel;

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

    attribute [Conditional=PROXIMITY_EVENTS] EventListener onwebkitdeviceproximity;

    // 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] void captureEvents(/*in long eventFlags*/);
    [V8Custom] 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_SHADERS) && ENABLE_CSS_SHADERS
    attribute WebKitCSSFilterRuleConstructor WebKitCSSFilterRule;
    attribute WebKitCSSMixFunctionValueConstructor WebKitCSSMixFunctionValue;
#endif

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

#if defined(ENABLE_CSS_DEVICE_ADAPTATION) && ENABLE_CSS_DEVICE_ADAPTATION
    attribute WebKitCSSViewportRuleConstructor WebKitCSSViewportRule;
#endif

    attribute CSSRuleConstructor CSSRule;
    attribute CSSCharsetRuleConstructor CSSCharsetRule;
    attribute CSSFontFaceRuleConstructor CSSFontFaceRule;
#if defined(ENABLE_SHADOW_DOM) && ENABLE_SHADOW_DOM
    attribute CSSHostRuleConstructor CSSHostRule;
#endif
    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;
    [Conditional=MICRODATA] attribute PropertyNodeListConstructor PropertyNodeList;
    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;
    [Conditional=CANVAS_PATH, V8EnabledAtRuntime=canvasPath] attribute DOMPathConstructor Path;
    attribute ProcessingInstructionConstructor ProcessingInstruction;
    [Conditional=SHADOW_DOM, V8EnabledAtRuntime=shadowDOM] attribute ShadowRootConstructor WebKitShadowRoot;
    [Conditional=SHADOW_DOM, V8EnabledAtRuntime=shadowDOM] attribute HTMLContentElementConstructor HTMLContentElement;
    [Conditional=SHADOW_DOM, V8EnabledAtRuntime=shadowDOM] attribute HTMLShadowElementConstructor HTMLShadowElement;

    attribute DOMSelectionConstructor Selection;
    attribute DOMWindowConstructor Window;

    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 HTMLBodyElementConstructor HTMLBodyElement;
    attribute HTMLButtonElementConstructor HTMLButtonElement;
    attribute HTMLCanvasElementConstructor HTMLCanvasElement;
    attribute HTMLDListElementConstructor HTMLDListElement;
    [Conditional=DATALIST_ELEMENT] attribute HTMLDataListElementConstructor HTMLDataListElement;
    [Conditional=DIALOG_ELEMENT, V8EnabledPerContext=dialogElement] attribute HTMLDialogElementConstructor HTMLDialogElement;
    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_ELEMENT) && ENABLE_METER_ELEMENT
    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_ELEMENT) && ENABLE_PROGRESS_ELEMENT
    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 [Conditional=TEMPLATE_ELEMENT] HTMLTemplateElementConstructor HTMLTemplateElement;
    attribute HTMLTextAreaElementConstructor HTMLTextAreaElement;
    attribute HTMLTitleElementConstructor HTMLTitleElement;
    attribute HTMLUListElementConstructor HTMLUListElement;

    attribute HTMLCollectionConstructor HTMLCollection;
    attribute HTMLAllCollectionConstructor HTMLAllCollection;
    attribute HTMLFormControlsCollectionConstructor HTMLFormControlsCollection;
    attribute HTMLOptionsCollectionConstructor HTMLOptionsCollection;
    [Conditional=MICRODATA] attribute HTMLPropertiesCollectionConstructor HTMLPropertiesCollection;
    attribute HTMLUnknownElementConstructor HTMLUnknownElement;

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

    [Conditional=ENCRYPTED_MEDIA, V8EnabledAtRuntime=encryptedMedia] attribute MediaKeyErrorConstructor MediaKeyError;
    [Conditional=ENCRYPTED_MEDIA, V8EnabledAtRuntime=encryptedMedia] attribute MediaKeyEventConstructor MediaKeyEvent;
    attribute [Conditional=ENCRYPTED_MEDIA_V2, V8EnabledAtRuntime=encryptedMedia] MediaKeysConstructor MediaKeys;
    attribute [Conditional=ENCRYPTED_MEDIA_V2, V8EnabledAtRuntime=encryptedMedia] MediaKeyErrorConstructor MediaKeyError;
    attribute [Conditional=ENCRYPTED_MEDIA_V2, V8EnabledAtRuntime=encryptedMedia] MediaKeyMessageEventConstructor MediaKeyMessageEvent;
    attribute [Conditional=ENCRYPTED_MEDIA_V2, V8EnabledAtRuntime=encryptedMedia] MediaKeyNeededEventConstructor MediaKeyNeededEvent;

    [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] attribute HTMLTrackElementConstructor HTMLTrackElement;
    [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] attribute TextTrackConstructor TextTrack;
    [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] attribute TextTrackCueConstructor TextTrackCue; // Usable with the new operator
    [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] attribute TextTrackCueListConstructor TextTrackCueList;
    [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] attribute TextTrackListConstructor TextTrackList;
    [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] attribute TrackEventConstructor TrackEvent;

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

    attribute CanvasPatternConstructor CanvasPattern;
    attribute CanvasGradientConstructor CanvasGradient;
    attribute CanvasRenderingContext2DConstructor CanvasRenderingContext2D;

    attribute ImageDataConstructor ImageData;
    attribute TextMetricsConstructor TextMetrics;

    [Conditional=WEBGL] attribute WebGLActiveInfoConstructor WebGLActiveInfo;
    [Conditional=WEBGL] attribute WebGLBufferConstructor WebGLBuffer;
    [Conditional=WEBGL] attribute WebGLFramebufferConstructor WebGLFramebuffer;
    [Conditional=WEBGL] attribute WebGLProgramConstructor WebGLProgram;
    [Conditional=WEBGL] attribute WebGLRenderbufferConstructor WebGLRenderbuffer;
    [Conditional=WEBGL] attribute WebGLRenderingContextConstructor WebGLRenderingContext;
    [Conditional=WEBGL] attribute WebGLShaderConstructor WebGLShader;
    [Conditional=WEBGL] attribute WebGLShaderPrecisionFormatConstructor WebGLShaderPrecisionFormat;
    [Conditional=WEBGL] attribute WebGLTextureConstructor WebGLTexture;
    [Conditional=WEBGL] attribute WebGLUniformLocationConstructor WebGLUniformLocation;

    attribute DOMStringMapConstructor DOMStringMap;

    attribute ArrayBufferConstructor ArrayBuffer; // Usable with new operator
    attribute ArrayBufferViewConstructor ArrayBufferView;
    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 FocusEventConstructor FocusEvent;
    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 TransitionEventConstructor TransitionEvent;
    attribute UIEventConstructor UIEvent;
    attribute WebKitAnimationEventConstructor WebKitAnimationEvent;
    attribute WebKitTransitionEventConstructor WebKitTransitionEvent;
    attribute WheelEventConstructor WheelEvent;
    attribute XMLHttpRequestProgressEventConstructor XMLHttpRequestProgressEvent;
    [Conditional=DEVICE_ORIENTATION, V8EnabledAtRuntime] attribute DeviceMotionEventConstructor DeviceMotionEvent;
    [Conditional=DEVICE_ORIENTATION, V8EnabledAtRuntime] attribute DeviceOrientationEventConstructor DeviceOrientationEvent;
    [Conditional=TOUCH_EVENTS, V8EnabledAtRuntime=touch] attribute TouchConstructor Touch;
    [Conditional=TOUCH_EVENTS, V8EnabledAtRuntime=touch] attribute TouchEventConstructor TouchEvent;
    [Conditional=TOUCH_EVENTS, V8EnabledAtRuntime=touch] attribute TouchListConstructor TouchList;
    attribute StorageEventConstructor StorageEvent;
    [Conditional=INPUT_SPEECH] attribute SpeechInputEventConstructor SpeechInputEvent;
    [Conditional=WEBGL] attribute WebGLContextEventConstructor WebGLContextEvent;
    [Conditional=PROXIMITY_EVENTS] attribute DeviceProximityEventConstructor DeviceProximityEvent;
    [Conditional=REQUEST_AUTOCOMPLETE] attribute AutocompleteErrorEventConstructor AutocompleteErrorEvent;

    attribute EventExceptionConstructor EventException;

    attribute WebKitCSSKeyframeRuleConstructor WebKitCSSKeyframeRule;
    attribute WebKitCSSKeyframesRuleConstructor WebKitCSSKeyframesRule;
    [Conditional=CSS_REGIONS, V8EnabledAtRuntime=cssRegions] attribute WebKitCSSRegionRuleConstructor WebKitCSSRegionRule;

    attribute WebKitCSSMatrixConstructor WebKitCSSMatrix; // Usable with the new operator

    attribute WebKitPointConstructor WebKitPoint; // Usable with new the operator

    attribute ClipboardConstructor Clipboard;

    [Conditional=WORKERS] attribute WorkerConstructor Worker; // Usable with the new operator
    [Conditional=SHARED_WORKERS, JSCustomGetter, V8EnabledAtRuntime] attribute SharedWorkerConstructor SharedWorker; // Usable with the new operator

    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;
    [Conditional=XSLT] attribute 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

    attribute DOMPluginConstructor Plugin;
    attribute DOMPluginArrayConstructor PluginArray;

    attribute DOMMimeTypeConstructor MimeType;
    attribute DOMMimeTypeArrayConstructor MimeTypeArray;

    attribute ClientRectConstructor ClientRect;
    attribute ClientRectListConstructor ClientRectList;

    attribute StorageConstructor Storage;

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

    [Conditional=SVG] attribute SVGZoomEventConstructor SVGZoomEvent;

#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
    // 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 SVGZoomAndPanConstructor SVGZoomAndPan;

    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;

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

    [Conditional=BLOB] attribute DOMURLConstructor URL;
    [Conditional=BLOB] attribute DOMURLConstructor webkitURL; // FIXME: deprecate this.

    attribute MutationObserverConstructor WebKitMutationObserver; // FIXME: Add metrics to determine when we can remove this.
    attribute MutationObserverConstructor MutationObserver;

    [Conditional=MEDIA_SOURCE, V8EnabledAtRuntime=mediaSource] attribute MediaSourceConstructor WebKitMediaSource;
    [Conditional=MEDIA_SOURCE, V8EnabledAtRuntime=mediaSource] attribute SourceBufferConstructor WebKitSourceBuffer;
    [Conditional=MEDIA_SOURCE, V8EnabledAtRuntime=mediaSource] attribute SourceBufferListConstructor WebKitSourceBufferList;

#endif // defined(LANGUAGE_JAVASCRIPT)

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

