# -*- Mode:Python; tab-width:8; indent-tabs-mode:nil -*- */
# vim: set ts=8 sts=4 et sw=4 tw=80: */
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# DOM Bindings Configuration.
#
# The WebIDL interfaces are defined in dom/webidl. For interfaces requiring
# special handling, there are corresponding entries in the configuration table
# below. The configuration table maps each interface name to a |descriptor|.
#
# Valid fields for all descriptors:
#   * nativeType - The native type (concrete class or XPCOM interface) that
#                  instances of this interface will unwrap to.  If not
#                  specified, defaults to 'nsIDOM' followed by the interface
#                  name for external interfaces and
#                  'mozilla::dom::InterfaceName' for everything else.
#   * headerFile - The file in which the nativeType is declared (defaults
#                  to an educated guess).
#   * concrete - Indicates whether there exist JS objects with this interface as
#                their primary interface (and hence whose prototype is this
#                interface's prototype object).  Always False for callback
#                interfaces.  Defaults to True otherwise.
#   * notflattened - The native type does not have nsIClassInfo, so when
#                    wrapping it the right IID needs to be passed in.
#                    Only relevant for callback interfaces.
#   * register - True if this binding should be registered.  Defaults to true.
#   * binaryNames - Dict for mapping method and attribute names to different
#                   names when calling the native methods (defaults to an empty
#                   dict). The keys are the property names as they appear in the
#                   .webidl file and the values are the names as they should be
#                   in the WebIDL.
#   * wrapperCache: True if this object is a wrapper cache.  Objects that are
#                   not can only be returned from a limited set of methods,
#                   cannot be prefable, and must ensure that they disallow
#                   XPConnect wrapping.  Always false for callback interfaces.
#                   Defaults to true for non-callback descriptors.
#
# The following fields are either a string, an array (defaults to an empty
# array) or a dictionary with three possible keys (all, getterOnly and
# setterOnly) each having such an array as the value
#
#   * implicitJSContext - attributes and methods specified in the .webidl file
#                         that require a JSContext as the first argument
#
# The value for an interface is a dictionary which specifies the
# descriptor to use when generating that interface's binding.

DOMInterfaces = {

'AbstractWorker': {
    'concrete': False
},

'AddonManagerPermissions': {
    'wrapperCache': False,
    'concrete': False
},

'AnimationEffectReadOnly': {
    'concrete': False
},

'AnimationTimeline': {
    'concrete': False
},

'AnonymousContent': {
    'wrapperCache': False
},

'ArchiveReader': {
    'nativeType': 'mozilla::dom::archivereader::ArchiveReader',
},

'ArchiveRequest': {
    'nativeType': 'mozilla::dom::archivereader::ArchiveRequest',
},

'AudioChannelManager': {
    'nativeType': 'mozilla::dom::system::AudioChannelManager',
    'headerFile': 'AudioChannelManager.h'
},

'AudioBuffer': {
    'implicitJSContext': [ 'copyToChannel' ],
},

'AudioBufferSourceNode': {
    'implicitJSContext': [ 'buffer' ],
},

'AudioNode' : {
    'concrete': False,
    'binaryNames': {
        'channelCountMode': 'channelCountModeValue',
        'channelInterpretation': 'channelInterpretationValue',
    },
},

'BarProp': {
    'headerFile': 'mozilla/dom/BarProps.h',
},

'Blob': {
    'headerFile': 'mozilla/dom/File.h',
},

'BatteryManager': {
    'nativeType': 'mozilla::dom::battery::BatteryManager',
    'headerFile': 'BatteryManager.h'
},

'BoxObject': {
    'resultNotAddRefed': ['element'],
},

'Cache': {
    'implicitJSContext': [ 'add', 'addAll' ],
    'nativeType': 'mozilla::dom::cache::Cache',
},

'CacheStorage': {
    'nativeType': 'mozilla::dom::cache::CacheStorage',
},

'CanvasRenderingContext2D': {
    'implicitJSContext': [
        'createImageData', 'getImageData'
    ],
    'binaryNames': {
        'mozImageSmoothingEnabled': 'imageSmoothingEnabled'
    }
},

'CaretPosition' : {
    'nativeType': 'nsDOMCaretPosition',
},

'CharacterData': {
    'nativeType': 'nsGenericDOMDataNode',
    'concrete': False
},

'ChromeUtils': {
    # The codegen is dumb, and doesn't understand that this interface is only a
    # collection of static methods, so we have this `concrete: False` hack.
    'concrete': False,
},

'ChromeWindow': {
    'concrete': False,
},

'ChromeWorker': {
    'headerFile': 'mozilla/dom/WorkerPrivate.h',
    'nativeType': 'mozilla::dom::workers::ChromeWorkerPrivate',
},

'Client': {
    'nativeType': 'mozilla::dom::workers::ServiceWorkerClient',
    'headerFile': 'mozilla/dom/workers/bindings/ServiceWorkerClient.h',
},

'Clients': {
    'nativeType': 'mozilla::dom::workers::ServiceWorkerClients',
    'headerFile': 'mozilla/dom/workers/bindings/ServiceWorkerClients.h',
},

'console': {
    'nativeType': 'mozilla::dom::Console',
},

'ConvolverNode': {
    'implicitJSContext': [ 'buffer' ],
},

'Coordinates': {
    'headerFile': 'nsGeoPosition.h'
},

'Crypto' : {
    'headerFile': 'Crypto.h'
},

'CSS': {
    'concrete': False,
},

'CSS2Properties': {
    'nativeType': 'nsDOMCSSDeclaration'
},

'CSSLexer': {
    'wrapperCache': False
},

'CSSPrimitiveValue': {
    'nativeType': 'nsROCSSPrimitiveValue',
},

'CSSStyleDeclaration': {
    'nativeType': 'nsICSSDeclaration'
},

'CSSStyleSheet': {
    'nativeType': 'mozilla::StyleSheet',
    'binaryNames': { 'ownerRule': 'DOMOwnerRule' },
},

'CSSValue': {
    'concrete': False
},

'CSSValueList': {
    'nativeType': 'nsDOMCSSValueList'
},

'DataChannel': {
    'nativeType': 'nsDOMDataChannel',
},

'DedicatedWorkerGlobalScope': {
    'headerFile': 'mozilla/dom/WorkerScope.h',
},

'DeviceAcceleration': {
    'headerFile': 'mozilla/dom/DeviceMotionEvent.h',
},

'DeviceRotationRate': {
    'headerFile': 'mozilla/dom/DeviceMotionEvent.h',
},

'Document': {
    'nativeType': 'nsIDocument',
    'binaryNames': {
        'documentURI': 'documentURIFromJS',
        'URL': 'documentURIFromJS'
    }
},

'DominatorTree': {
    'nativeType': 'mozilla::devtools::DominatorTree'
},

'DOMException': {
    'binaryNames': {
        'message': 'messageMoz',
    },
    'implicitJSContext': [ 'filename', 'lineNumber', 'stack' ],
},

'DOMMatrixReadOnly': {
    'headerFile': 'mozilla/dom/DOMMatrix.h',
    'concrete': False,
},

'DOMPointReadOnly': {
    'headerFile': 'mozilla/dom/DOMPoint.h',
    'concrete': False,
},

'DOMRectList': {
    'headerFile': 'mozilla/dom/DOMRect.h',
},

'DOMRectReadOnly': {
    'headerFile': 'mozilla/dom/DOMRect.h',
},

'DOMRequest': {
    'implicitJSContext': [ 'then' ],
},

'DOMStringMap': {
    'nativeType': 'nsDOMStringMap'
},

'DOMTokenList': {
    'nativeType': 'nsDOMTokenList',
},

'DynamicsCompressorNode': {
    'binaryNames': {
        'release': 'getRelease'
    },
},

'Event': {
    'implicitJSContext': [ 'defaultPrevented', 'preventDefault' ],
},

'EventTarget': {
    # When we get rid of hasXPConnectImpls, we can get rid of the
    # couldBeDOMBinding stuff in GetOrCreateDOMReflector.
    #
    # We can also get rid of the UnwrapArg bits in
    # the dom QueryInterface (in BindingUtils.cpp) at that point.
    'hasXPConnectImpls': True,
    'concrete': False,
    'jsImplParent': 'mozilla::DOMEventTargetHelper',
    'implicitJSContext': [ 'dispatchEvent' ]
},

'Exception': {
    'headerFile': 'mozilla/dom/DOMException.h',
    'binaryNames': {
        'message': 'messageMoz',
    },
    'implicitJSContext': [ '__stringifier', 'filename', 'lineNumber', 'stack' ],
},

'ExtendableEvent': {
    'headerFile': 'mozilla/dom/ServiceWorkerEvents.h',
    'nativeType': 'mozilla::dom::workers::ExtendableEvent',
    'implicitJSContext': [ 'waitUntil' ],
},

'ExtendableMessageEvent': {
    'headerFile': 'mozilla/dom/ServiceWorkerEvents.h',
    'nativeType': 'mozilla::dom::workers::ExtendableMessageEvent',
},

'FetchEvent': {
    'headerFile': 'ServiceWorkerEvents.h',
    'nativeType': 'mozilla::dom::workers::FetchEvent',
    'binaryNames': {
        'request': 'request_'
    },
    'implicitJSContext': [ 'respondWith' ],
},

'FileReader': {
    'implicitJSContext': [ 'readAsArrayBuffer' ],
},

'FileReaderSync': {
    'wrapperCache': False,
},

'FlyWebFetchEvent': {
    'headerFile': 'FlyWebServerEvents.h',
},

'FlyWebWebSocketEvent': {
    'headerFile': 'FlyWebServerEvents.h',
},

'FontFaceSet': {
    'implicitJSContext': [ 'load' ],
},

'FontFaceSetIterator': {
    'wrapperCache': False,
},

'Geolocation': {
    'headerFile': 'nsGeolocation.h'
},

'HeapSnapshot': {
    'nativeType': 'mozilla::devtools::HeapSnapshot'
},

'History': {
    'headerFile': 'nsHistory.h',
    'nativeType': 'nsHistory'
},

'HTMLAppletElement': {
    'nativeType': 'mozilla::dom::HTMLSharedObjectElement'
},

'HTMLBaseElement': {
    'nativeType': 'mozilla::dom::HTMLSharedElement'
},

'HTMLCollection': {
    'nativeType': 'nsIHTMLCollection',
    # nsContentList.h pulls in nsIHTMLCollection.h
    'headerFile': 'nsContentList.h',
},

'HTMLDirectoryElement': {
    'nativeType': 'mozilla::dom::HTMLSharedElement'
},

'HTMLDListElement': {
    'nativeType' : 'mozilla::dom::HTMLSharedListElement'
},

'HTMLDocument': {
    'nativeType': 'nsHTMLDocument',
    'implicitJSContext': [ 'open', 'write', 'writeln' ]
},

'HTMLElement': {
    'nativeType': 'nsGenericHTMLElement',
},

'HTMLEmbedElement': {
    'nativeType': 'mozilla::dom::HTMLSharedObjectElement'
},

'HTMLHeadElement': {
    'nativeType': 'mozilla::dom::HTMLSharedElement'
},

'HTMLHtmlElement': {
    'nativeType': 'mozilla::dom::HTMLSharedElement'
},

'HTMLMediaElement': {
    'concrete': False
},

'HTMLOListElement': {
    'nativeType' : 'mozilla::dom::HTMLSharedListElement'
},

'HTMLParamElement': {
    'nativeType': 'mozilla::dom::HTMLSharedElement'
},

'HTMLQuoteElement': {
    'nativeType': 'mozilla::dom::HTMLSharedElement'
},

'HTMLTextAreaElement': {
    'binaryNames': {
        'textLength': 'getTextLength'
    }
},

'HTMLUListElement': {
    'nativeType' : 'mozilla::dom::HTMLSharedListElement'
},

'IDBCursor': {
    'implicitJSContext': [ 'delete' ],
    'binaryNames': {
        'direction': 'getDirection'
    }
},

'IDBCursorWithValue': {
    'nativeType': 'mozilla::dom::IDBCursor',
},

'IDBDatabase': {
    'implicitJSContext': [ 'transaction', 'createMutableFile',
                           'mozCreateFileHandle' ],
},

'IDBFactory': {
    'implicitJSContext': [ 'open', 'deleteDatabase', 'openForPrincipal',
                           'deleteForPrincipal' ],
},

'IDBIndex': {
    'binaryNames': {
        'mozGetAll': 'getAll',
        'mozGetAllKeys': 'getAllKeys',
    }
},

'IDBKeyRange': {
    'wrapperCache': False,
},

'IDBLocaleAwareKeyRange': {
    'headerFile': 'IDBKeyRange.h',
    'wrapperCache': False,
},

'IDBObjectStore': {
    'binaryNames': {
        'mozGetAll': 'getAll'
    },
    'implicitJSContext': [ 'clear' ],
},

'IDBOpenDBRequest': {
    'headerFile': 'IDBRequest.h'
},

'IDBVersionChangeEvent': {
    'headerFile': 'IDBEvents.h',
},

'IID': {
    'nativeType': 'nsIJSID',
    'headerFile': 'xpcjsid.h',
},

'ImageBitmap': {
    'implicitJSContext': [ 'mapDataInto' ],
},

'ImageCapture': {
    'binaryNames': { 'videoStreamTrack': 'GetVideoStreamTrack' }
},

'ImageData': {
    'wrapperCache': False,
},

'InputStream': {
    'nativeType': 'nsIInputStream',
    'notflattened': True
},

'IntersectionObserver': {
    'nativeType': 'mozilla::dom::DOMIntersectionObserver',
},

'IntersectionObserverEntry': {
    'nativeType': 'mozilla::dom::DOMIntersectionObserverEntry',
    'headerFile': 'DOMIntersectionObserver.h',
},

'KeyEvent': {
    'concrete': False
},

'KeyframeEffect': {
    'implicitJSContext': { 'setterOnly': [ 'spacing' ] }
},

'LegacyMozTCPSocket': {
    'headerFile': 'TCPSocket.h',
    'wrapperCache': False,
},

'LocalMediaStream': {
    'headerFile': 'DOMMediaStream.h',
    'nativeType': 'mozilla::DOMLocalMediaStream'
},

'MediaList': {
    'nativeType': 'nsMediaList',
    'headerFile': 'nsIMediaList.h',
},

'MediaKeys' : {
    'implicitJSContext': [ 'createSession']
},

'MediaStream': {
    'headerFile': 'DOMMediaStream.h',
    'nativeType': 'mozilla::DOMMediaStream'
},

'MediaStreamAudioDestinationNode': {
    'binaryNames': { 'stream': 'DOMStream' }
},

'MediaStreamList': {
    'headerFile': 'MediaStreamList.h',
},

'MediaStreamTrack': {
    'concrete': False
},

'MediaRecorder': {
    'headerFile': 'MediaRecorder.h',
},

'MimeType': {
    'headerFile' : 'nsMimeTypeArray.h',
    'nativeType': 'nsMimeType',
},

'MimeTypeArray': {
    'nativeType': 'nsMimeTypeArray',
},

'MozCanvasPrintState': {
    'headerFile': 'mozilla/dom/HTMLCanvasElement.h',
    'nativeType': 'mozilla::dom::HTMLCanvasPrintState',
},

'MozChannel': {
    'nativeType': 'nsIChannel',
    'notflattened': True
},

'MozSpeakerManager': {
    'nativeType': 'mozilla::dom::SpeakerManager',
    'headerFile': 'SpeakerManager.h'
},

'MozPowerManager': {
    'nativeType': 'mozilla::dom::PowerManager',
},

'MozWakeLock': {
    'nativeType': 'mozilla::dom::WakeLock',
},

'MozTimeManager': {
    'nativeType': 'mozilla::dom::time::TimeManager',
},

'MutationObserver': {
    'nativeType': 'nsDOMMutationObserver',
},

'MutationRecord': {
    'nativeType': 'nsDOMMutationRecord',
    'headerFile': 'nsDOMMutationObserver.h',
},

'NamedNodeMap': {
    'nativeType': 'nsDOMAttributeMap',
},

'NetworkInformation': {
    'nativeType': 'mozilla::dom::network::Connection',
},

'Node': {
    'nativeType': 'nsINode',
    'concrete': False,
    'binaryNames': {
        'baseURI': 'baseURIFromJS'
    }
},

'NodeIterator': {
    'wrapperCache': False,
},

'NodeList': {
    'nativeType': 'nsINodeList',
},

'NotificationEvent': {
    'headerFile': 'mozilla/dom/NotificationEvent.h',
    'nativeType': 'mozilla::dom::workers::NotificationEvent',
    'binaryNames': {
        'notification': 'notification_'
    }
},

'OfflineAudioContext': {
    'nativeType': 'mozilla::dom::AudioContext',
},

'OfflineResourceList': {
    'nativeType': 'nsDOMOfflineResourceList',
},

'PaintRequestList': {
    'headerFile': 'mozilla/dom/PaintRequest.h',
},

'Path2D': {
    'nativeType': 'mozilla::dom::CanvasPath',
    'headerFile': 'CanvasPath.h'
},

'PeerConnectionImpl': {
    'nativeType': 'mozilla::PeerConnectionImpl',
    'headerFile': 'PeerConnectionImpl.h',
    'wrapperCache': False
},

'Plugin': {
    'headerFile' : 'nsPluginArray.h',
    'nativeType': 'nsPluginElement',
},

'PluginArray': {
    'nativeType': 'nsPluginArray',
},

'PluginTag': {
    'nativeType': 'nsIPluginTag',
},

'PopupBoxObject': {
    'resultNotAddRefed': ['triggerNode', 'anchorNode'],
},

'Position': {
    'headerFile': 'nsGeoPosition.h'
},

'PositionError': {
    'headerFile': 'nsGeolocation.h'
},

'Promise': {
    'implicitJSContext': [ 'then', 'catch' ],
},

'PromiseDebugging': {
    'concrete': False,
},

'PromiseNativeHandler': {
    'wrapperCache': False,
},

'PushEvent': {
    'headerFile': 'ServiceWorkerEvents.h',
    'nativeType': 'mozilla::dom::workers::PushEvent',
},

'PushMessageData': {
    'headerFile': 'ServiceWorkerEvents.h',
    'nativeType': 'mozilla::dom::workers::PushMessageData',
},

'Range': {
    'nativeType': 'nsRange',
    'binaryNames': {
        '__stringifier': 'ToString'
    }
},

'Rect': {
    'nativeType': 'nsDOMCSSRect',
},

'Request': {
    'binaryNames': {
        'headers': 'headers_',
        'referrerPolicy': 'referrerPolicy_'
    },
},

'Response': {
    'binaryNames': { 'headers': 'headers_' },
},

'RGBColor': {
    'nativeType': 'nsDOMCSSRGBColor',
},

'Screen': {
    'nativeType': 'nsScreen',
},

'ServiceWorker': {
    'nativeType': 'mozilla::dom::workers::ServiceWorker',
    'headerFile': 'mozilla/dom/workers/bindings/ServiceWorker.h',
},

'ServiceWorkerGlobalScope': {
    'headerFile': 'mozilla/dom/WorkerScope.h',
},

'ServiceWorkerRegistration': {
    'implicitJSContext': [ 'pushManager' ],
},

'SharedWorker': {
    'nativeType': 'mozilla::dom::workers::SharedWorker',
    'headerFile': 'mozilla/dom/workers/bindings/SharedWorker.h',
    'implicitJSContext': [ 'constructor' ],
},

'SharedWorkerGlobalScope': {
    'headerFile': 'mozilla/dom/WorkerScope.h',
},

'Storage': {
    'nativeType': 'mozilla::dom::DOMStorage',
},

'StyleSheet': {
    'nativeType': 'mozilla::StyleSheet',
    'headerFile': 'mozilla/StyleSheetInlines.h',
},

'SVGAnimatedLengthList': {
    'nativeType': 'mozilla::DOMSVGAnimatedLengthList',
    'headerFile': 'DOMSVGAnimatedLengthList.h',
},

'SVGAnimatedNumberList': {
    'nativeType': 'mozilla::DOMSVGAnimatedNumberList',
    'headerFile': 'DOMSVGAnimatedNumberList.h'
},

'SVGAnimatedPreserveAspectRatio': {
    'nativeType': 'mozilla::dom::DOMSVGAnimatedPreserveAspectRatio',
    'headerFile': 'SVGAnimatedPreserveAspectRatio.h'
},

'SVGAnimationElement': {
    'concrete': False
},

'SVGComponentTransferFunctionElement': {
    'concrete': False,
},

'SVGElement': {
    'nativeType': 'nsSVGElement',
},

'SVGFEFuncAElement': {
    'headerFile': 'mozilla/dom/SVGComponentTransferFunctionElement.h',
},

'SVGFEFuncBElement': {
    'headerFile': 'mozilla/dom/SVGComponentTransferFunctionElement.h',
},

'SVGFEFuncGElement': {
    'headerFile': 'mozilla/dom/SVGComponentTransferFunctionElement.h',
},

'SVGFEFuncRElement': {
    'headerFile': 'mozilla/dom/SVGComponentTransferFunctionElement.h',
},

'SVGGraphicsElement': {
    'concrete': False,
},

'SVGGradientElement': {
    'concrete': False,
},

'SVGLength': {
    'nativeType': 'mozilla::DOMSVGLength',
    'headerFile': 'DOMSVGLength.h'
},

'SVGLengthList': {
    'nativeType': 'mozilla::DOMSVGLengthList',
    'headerFile': 'DOMSVGLengthList.h'
},

'SVGLinearGradientElement': {
    'headerFile': 'mozilla/dom/SVGGradientElement.h',
},

'SVGNumber': {
    'nativeType': 'mozilla::DOMSVGNumber',
    'headerFile': 'DOMSVGNumber.h',
},

'SVGNumberList': {
    'nativeType': 'mozilla::DOMSVGNumberList',
    'headerFile': 'DOMSVGNumberList.h'
},

'SVGPathSeg': {
    'nativeType': 'mozilla::DOMSVGPathSeg',
    'headerFile': 'DOMSVGPathSeg.h',
    'concrete': False,
},

'SVGPathSegClosePath': {
    'nativeType': 'mozilla::DOMSVGPathSegClosePath',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegMovetoAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegMovetoAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegMovetoRel': {
    'nativeType': 'mozilla::DOMSVGPathSegMovetoRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegLinetoAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegLinetoAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegLinetoRel': {
    'nativeType': 'mozilla::DOMSVGPathSegLinetoRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoCubicAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoCubicAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoCubicRel': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoCubicRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoQuadraticAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoQuadraticAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoQuadraticRel': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoQuadraticRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegArcAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegArcAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegArcRel': {
    'nativeType': 'mozilla::DOMSVGPathSegArcRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegLinetoHorizontalAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegLinetoHorizontalAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegLinetoHorizontalRel': {
    'nativeType': 'mozilla::DOMSVGPathSegLinetoHorizontalRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegLinetoVerticalAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegLinetoVerticalAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegLinetoVerticalRel': {
    'nativeType': 'mozilla::DOMSVGPathSegLinetoVerticalRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoCubicSmoothAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoCubicSmoothAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoCubicSmoothRel': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoCubicSmoothRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoQuadraticSmoothAbs': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoQuadraticSmoothAbs',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegCurvetoQuadraticSmoothRel': {
    'nativeType': 'mozilla::DOMSVGPathSegCurvetoQuadraticSmoothRel',
    'headerFile': 'DOMSVGPathSeg.h'
},

'SVGPathSegList': {
    'nativeType': 'mozilla::DOMSVGPathSegList',
    'headerFile': 'DOMSVGPathSegList.h'
},

'SVGPoint': {
    'nativeType': 'mozilla::nsISVGPoint',
    'headerFile': 'nsISVGPoint.h'
},

'SVGPointList': {
    'nativeType': 'mozilla::DOMSVGPointList',
    'headerFile': 'DOMSVGPointList.h'
},

'SVGPreserveAspectRatio': {
    'nativeType': 'mozilla::dom::DOMSVGPreserveAspectRatio',
    'headerFile': 'SVGPreserveAspectRatio.h'
},

'SVGRadialGradientElement': {
    'headerFile': 'mozilla/dom/SVGGradientElement.h',
},

'SVGRect': {
    'nativeType': 'mozilla::dom::SVGIRect'
},

'SVGTextContentElement': {
    'concrete': False
},

'SVGTextPositioningElement': {
    'concrete': False
},

'SVGTransform': {
    'binaryNames': {
        "matrix": "GetMatrix"
    }
},

'SVGTransformList': {
    'nativeType': 'mozilla::DOMSVGTransformList',
    'headerFile': 'DOMSVGTransformList.h'
},

'SVGStringList': {
    'nativeType': 'mozilla::DOMSVGStringList',
    'headerFile': 'DOMSVGStringList.h',
},

'SVGUnitTypes' : {
    'concrete': False,
},

'SVGZoomAndPan' : {
    'concrete': False,
},

'TestFunctions': {
    'wrapperCache': False
},

'Text': {
    # Total hack to allow binding code to realize that nsTextNode can
    # in fact be cast to Text.
    'headerFile': 'nsTextNode.h',
},

'TextDecoder': {
    'wrapperCache': False
},

'TextEncoder': {
    'wrapperCache': False
},

'TextMetrics': {
    'wrapperCache': False
},

'TCPSocket': {
    'implicitJSContext': ['send']
},

'ThreadSafeChromeUtils': {
    # The codegen is dumb, and doesn't understand that this interface is only a
    # collection of static methods, so we have this `concrete: False` hack.
    'concrete': False,
    'headerFile': 'mozilla/dom/ChromeUtils.h',
},

'TouchList': {
    'headerFile': 'mozilla/dom/TouchEvent.h',
},

'TreeColumn': {
    'nativeType': 'nsTreeColumn',
    'headerFile': 'nsTreeColumns.h',
},

'TreeColumns': {
    'nativeType': 'nsTreeColumns',
},

'TreeWalker': {
    'wrapperCache': False,
},

'VTTCue': {
    'nativeType': 'mozilla::dom::TextTrackCue'
},

'VTTRegion': {
  'nativeType': 'mozilla::dom::TextTrackRegion',
},

'WindowClient': {
    'nativeType': 'mozilla::dom::workers::ServiceWorkerWindowClient',
    'headerFile': 'mozilla/dom/workers/bindings/ServiceWorkerWindowClient.h',
},

'WebGLActiveInfo': {
    'nativeType': 'mozilla::WebGLActiveInfo',
    'headerFile': 'WebGLActiveInfo.h'
},

'WebGLBuffer': {
    'nativeType': 'mozilla::WebGLBuffer',
    'headerFile': 'WebGLBuffer.h'
},

'WEBGL_compressed_texture_atc': {
    'nativeType': 'mozilla::WebGLExtensionCompressedTextureATC',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_compressed_texture_etc': {
    'nativeType': 'mozilla::WebGLExtensionCompressedTextureES3',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_compressed_texture_etc1': {
    'nativeType': 'mozilla::WebGLExtensionCompressedTextureETC1',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_compressed_texture_pvrtc': {
    'nativeType': 'mozilla::WebGLExtensionCompressedTexturePVRTC',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_compressed_texture_s3tc': {
    'nativeType': 'mozilla::WebGLExtensionCompressedTextureS3TC',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_depth_texture': {
    'nativeType': 'mozilla::WebGLExtensionDepthTexture',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_debug_renderer_info': {
    'nativeType': 'mozilla::WebGLExtensionDebugRendererInfo',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_debug_shaders': {
    'nativeType': 'mozilla::WebGLExtensionDebugShaders',
    'headerFile': 'WebGLExtensions.h'
},

'OES_element_index_uint': {
    'nativeType': 'mozilla::WebGLExtensionElementIndexUint',
    'headerFile': 'WebGLExtensions.h'
},

'EXT_frag_depth': {
    'nativeType': 'mozilla::WebGLExtensionFragDepth',
    'headerFile': 'WebGLExtensions.h'
},

'WEBGL_lose_context': {
    'nativeType': 'mozilla::WebGLExtensionLoseContext',
    'headerFile': 'WebGLExtensions.h'
},

'EXT_sRGB': {
    'nativeType': 'mozilla::WebGLExtensionSRGB',
    'headerFile': 'WebGLExtensions.h'
},

'OES_standard_derivatives': {
    'nativeType': 'mozilla::WebGLExtensionStandardDerivatives',
    'headerFile': 'WebGLExtensions.h'
},

'EXT_shader_texture_lod': {
    'nativeType': 'mozilla::WebGLExtensionShaderTextureLod',
    'headerFile': 'WebGLExtensions.h'
},

'EXT_texture_filter_anisotropic': {
    'nativeType': 'mozilla::WebGLExtensionTextureFilterAnisotropic',
    'headerFile': 'WebGLExtensions.h'
},

'OES_texture_float': {
    'nativeType': 'mozilla::WebGLExtensionTextureFloat',
    'headerFile': 'WebGLExtensions.h'
},

'OES_texture_float_linear': {
    'nativeType': 'mozilla::WebGLExtensionTextureFloatLinear',
    'headerFile': 'WebGLExtensions.h'
},

'OES_texture_half_float': {
   'nativeType': 'mozilla::WebGLExtensionTextureHalfFloat',
   'headerFile': 'WebGLExtensions.h'
},

'OES_texture_half_float_linear': {
   'nativeType': 'mozilla::WebGLExtensionTextureHalfFloatLinear',
   'headerFile': 'WebGLExtensions.h'
},

'WEBGL_color_buffer_float': {
   'nativeType': 'mozilla::WebGLExtensionColorBufferFloat',
   'headerFile': 'WebGLExtensions.h'
},

'EXT_color_buffer_half_float': {
   'nativeType': 'mozilla::WebGLExtensionColorBufferHalfFloat',
   'headerFile': 'WebGLExtensions.h'
},

'EXT_color_buffer_float': {
   'nativeType': 'mozilla::WebGLExtensionEXTColorBufferFloat',
   'headerFile': 'WebGLExtensions.h'
},

'WEBGL_draw_buffers': {
    'nativeType': 'mozilla::WebGLExtensionDrawBuffers',
    'headerFile': 'WebGLExtensions.h'
},

'OES_vertex_array_object': {
    'nativeType': 'mozilla::WebGLExtensionVertexArray',
    'headerFile': 'WebGLExtensions.h'
},

'ANGLE_instanced_arrays': {
    'nativeType': 'mozilla::WebGLExtensionInstancedArrays',
    'headerFile': 'WebGLExtensions.h'
},

'EXT_blend_minmax': {
    'nativeType': 'mozilla::WebGLExtensionBlendMinMax',
    'headerFile': 'WebGLExtensions.h'
},

'EXT_disjoint_timer_query': {
    'nativeType': 'mozilla::WebGLExtensionDisjointTimerQuery',
    'headerFile': 'WebGLExtensions.h'
},

'WebGLFramebuffer': {
    'nativeType': 'mozilla::WebGLFramebuffer',
    'headerFile': 'WebGLFramebuffer.h'
},

'WebGLProgram': {
    'nativeType': 'mozilla::WebGLProgram',
    'headerFile': 'WebGLProgram.h'
},

'WebGLQuery': {
    'nativeType': 'mozilla::WebGLQuery',
    'headerFile': 'WebGLQuery.h'
},

'WebGLRenderbuffer': {
    'nativeType': 'mozilla::WebGLRenderbuffer',
    'headerFile': 'WebGLRenderbuffer.h'
},

'WebGLRenderingContext': {
    'nativeType': 'mozilla::WebGLContext',
    'headerFile': 'WebGLContext.h',
},

'WebGL2RenderingContext': {
    'nativeType': 'mozilla::WebGL2Context',
    'headerFile': 'WebGL2Context.h',
},

'WebGLSampler': {
    'nativeType': 'mozilla::WebGLSampler',
    'headerFile': 'WebGLSampler.h'
},

'WebGLShader': {
    'nativeType': 'mozilla::WebGLShader',
    'headerFile': 'WebGLShader.h'
},

'WebGLShaderPrecisionFormat': {
    'nativeType': 'mozilla::WebGLShaderPrecisionFormat',
    'headerFile': 'WebGLShaderPrecisionFormat.h',
    'wrapperCache': False
},

'WebGLSync': {
    'nativeType': 'mozilla::WebGLSync',
    'headerFile': 'WebGLSync.h'
},

'WebGLTexture': {
    'nativeType': 'mozilla::WebGLTexture',
    'headerFile': 'WebGLTexture.h'
},

'WebGLTransformFeedback': {
    'nativeType': 'mozilla::WebGLTransformFeedback',
    'headerFile': 'WebGLTransformFeedback.h'
},

'WebGLUniformLocation': {
    'nativeType': 'mozilla::WebGLUniformLocation',
    'headerFile': 'WebGLUniformLocation.h'
},

'WebGLVertexArrayObject': {
    'nativeType': 'mozilla::WebGLVertexArray',
    'headerFile': 'WebGLVertexArray.h'
},

'WebrtcGlobalInformation': {
    'nativeType': 'mozilla::dom::WebrtcGlobalInformation',
    'headerFile': 'WebrtcGlobalInformation.h',
    'wrapperCache': False,
    'concrete': False,
},

'Window': {
    'nativeType': 'nsGlobalWindow',
    'binaryNames': {
        'postMessage': 'postMessageMoz',
    },
    'implicitJSContext': [
        'requestIdleCallback'
    ],
},

'WindowProxy': {
    'nativeType': 'nsPIDOMWindowOuter',
    'headerFile': 'nsPIDOMWindow.h',
    'concrete': False
},

'WindowRoot': {
    'nativeType': 'nsWindowRoot'
},

'Worker': {
    'headerFile': 'mozilla/dom/WorkerPrivate.h',
    'nativeType': 'mozilla::dom::workers::WorkerPrivate',
},

'WorkerDebuggerGlobalScope': {
    'headerFile': 'mozilla/dom/WorkerScope.h',
    'implicitJSContext': [
        'dump', 'global', 'reportError', 'setConsoleEventHandler',
    ],
},

'WorkerGlobalScope': {
    'headerFile': 'mozilla/dom/WorkerScope.h',
    'concrete': False,
    'implicitJSContext': [
        'close',
    ],
    # Rename a few things so we don't have both classes and methods
    # with the same name
    'binaryNames': {
        'performance': 'getPerformance',
    },
},

'XMLHttpRequest': {
    'implicitJSContext': [ 'send'],
},

'XMLHttpRequestEventTarget': {
    'concrete': False
},

'XMLSerializer': {
    'nativeType': 'nsDOMSerializer',
},

'XPathEvaluator': {
    'wrapperCache': False
},

'XPathExpression': {
    'wrapperCache': False,
},

'XSLTProcessor': {
    'nativeType': 'txMozillaXSLTProcessor',
},

'XULDocument': {
    'headerFile': 'XULDocument.h'
},

'XULElement': {
    'nativeType': 'nsXULElement',
},

####################################
# Test Interfaces of various sorts #
####################################

'TestInterface' : {
        # Keep this in sync with TestExampleInterface
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        'binaryNames': { 'methodRenamedFrom': 'methodRenamedTo',
                         'attributeGetterRenamedFrom': 'attributeGetterRenamedTo',
                         'attributeRenamedFrom': 'attributeRenamedTo' }
        },

'TestParentInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestChildInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestCImplementedInterface' : {
        'headerFile': 'TestCImplementedInterface.h',
        'register': False,
        },

'TestCImplementedInterface2' : {
        'headerFile': 'TestCImplementedInterface.h',
        'register': False,
        },

'TestJSImplInterface' : {
        # Keep this in sync with TestExampleInterface
        'headerFile': 'TestJSImplGenBinding.h',
        'register': False,
        'binaryNames': { 'methodRenamedFrom': 'methodRenamedTo',
                         'attributeGetterRenamedFrom': 'attributeGetterRenamedTo',
                         'attributeRenamedFrom': 'attributeRenamedTo' }
        },

'TestJSImplInterface2' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register': False
        },

'TestJSImplInterface3' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register': False
        },

'TestJSImplInterface4' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register': False
        },

'TestJSImplInterface5' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register': False
        },

'TestJSImplInterface6' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register': False
        },

'TestNavigator' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register' : False
        },

'TestNavigatorWithConstructor' : {
        'headerFile': 'TestJSImplGenBinding.h',
        'register' : False
        },

'TestExternalInterface' : {
        'nativeType': 'mozilla::dom::TestExternalInterface',
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestNonWrapperCacheInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        'wrapperCache': False
        },

'IndirectlyImplementedInterface': {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        'castable': False,
        'concrete': False
        },

'OnlyForUseInConstructor' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'ImplementedInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False,
        },

'ImplementedInterfaceParent' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False
        },

'DiamondImplements' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False
        },

'DiamondBranch1A' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False
        },

'DiamondBranch1B' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False
        },

'DiamondBranch2A' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False
        },

'DiamondBranch2B' : {
        'headerFile': 'TestBindingHeader.h',
        'concrete': False,
        'register': False
        },

'TestIndexedGetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestNamedGetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestIndexedGetterAndSetterAndNamedGetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestIndexedAndNamedGetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestIndexedSetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestNamedSetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestIndexedAndNamedSetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestIndexedAndNamedGetterAndSetterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestRenamedInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        'nativeType': 'nsRenamedInterface'
        },

'TestNamedDeleterInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestNamedDeleterWithRetvalInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestCppKeywordNamedMethodsInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestExampleInterface' : {
        # Keep this in sync with TestInterface
        'headerFile': 'TestExampleInterface-example.h',
        'register': False,
        'binaryNames': { 'methodRenamedFrom': 'methodRenamedTo',
                         'attributeGetterRenamedFrom': 'attributeGetterRenamedTo',
                         'attributeRenamedFrom': 'attributeRenamedTo' }
        },

'TestExampleWorkerInterface' : {
        'headerFile': 'TestExampleWorkerInterface-example.h',
        'register': False,
        },

'TestExampleProxyInterface' : {
        'headerFile': 'TestExampleProxyInterface-example.h',
        'register': False
        },

'TestDeprecatedInterface' : {
        # Keep this in sync with TestExampleInterface
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestInterfaceWithPromiseConstructorArg' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestSecureContextInterface' : {
        # Keep this in sync with TestExampleInterface
        'headerFile': 'TestBindingHeader.h',
        'register': False
        },

'TestNamespace' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestRenamedNamespace' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestProtoObjectHackedNamespace' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

'TestWorkerExposedInterface' : {
        'headerFile': 'TestBindingHeader.h',
        'register': False,
        },

}

# These are temporary, until they've been converted to use new DOM bindings
def addExternalIface(iface, nativeType=None, headerFile=None,
                     notflattened=False):
    if iface in DOMInterfaces:
        raise Exception('Interface declared both as WebIDL and External interface')
    domInterface = {
        'concrete': False
    }
    if not nativeType is None:
        domInterface['nativeType'] = nativeType
    if not headerFile is None:
        domInterface['headerFile'] = headerFile
    domInterface['notflattened'] = notflattened
    DOMInterfaces[iface] = domInterface

addExternalIface('ApplicationCache', nativeType='nsIDOMOfflineResourceList')
addExternalIface('Counter')
addExternalIface('CSSRule')
addExternalIface('RTCDataChannel', nativeType='nsIDOMDataChannel')
addExternalIface('HitRegionOptions', nativeType='nsISupports')
addExternalIface('imgINotificationObserver', nativeType='imgINotificationObserver')
addExternalIface('imgIRequest', nativeType='imgIRequest', notflattened=True)
addExternalIface('MenuBuilder', nativeType='nsIMenuBuilder', notflattened=True)
addExternalIface('MozControllers', nativeType='nsIControllers')
addExternalIface('MozFrameLoader', nativeType='nsIFrameLoader', notflattened=True)
addExternalIface('MozObserver', nativeType='nsIObserver', notflattened=True)
addExternalIface('MozRDFCompositeDataSource', nativeType='nsIRDFCompositeDataSource',
                 notflattened=True)
addExternalIface('MozRDFResource', nativeType='nsIRDFResource', notflattened=True)
addExternalIface('MozTreeView', nativeType='nsITreeView',
                  headerFile='nsITreeView.h', notflattened=True)
addExternalIface('MozWakeLockListener', headerFile='nsIDOMWakeLockListener.h')
addExternalIface('MozXULTemplateBuilder', nativeType='nsIXULTemplateBuilder')
addExternalIface('nsIBrowserDOMWindow', nativeType='nsIBrowserDOMWindow',
                 notflattened=True)
addExternalIface('nsIControllers', nativeType='nsIControllers')
addExternalIface('nsIDOMCrypto', nativeType='nsIDOMCrypto',
                 headerFile='Crypto.h')
addExternalIface('nsIFile', nativeType='nsIFile', notflattened=True)
addExternalIface('nsILoadGroup', nativeType='nsILoadGroup',
                 headerFile='nsILoadGroup.h', notflattened=True)
addExternalIface('nsIMessageBroadcaster', nativeType='nsIMessageBroadcaster',
                 headerFile='nsIMessageManager.h', notflattened=True)
addExternalIface('nsISelectionListener', nativeType='nsISelectionListener')
addExternalIface('nsIStreamListener', nativeType='nsIStreamListener', notflattened=True)
addExternalIface('nsITransportProvider', nativeType='nsITransportProvider')
addExternalIface('nsISupports', nativeType='nsISupports')
addExternalIface('nsIDocShell', nativeType='nsIDocShell', notflattened=True)
addExternalIface('nsIEditor', nativeType='nsIEditor', notflattened=True)
addExternalIface('nsIVariant', nativeType='nsIVariant', notflattened=True)
addExternalIface('nsIScriptableRegion', nativeType='nsIScriptableRegion', notflattened=True)
addExternalIface('OutputStream', nativeType='nsIOutputStream',
                 notflattened=True)
addExternalIface('Principal', nativeType='nsIPrincipal',
                 headerFile='nsIPrincipal.h', notflattened=True)
addExternalIface('StackFrame', nativeType='nsIStackFrame',
                 headerFile='nsIException.h', notflattened=True)
addExternalIface('URI', nativeType='nsIURI', headerFile='nsIURI.h',
                 notflattened=True)
addExternalIface('XULCommandDispatcher')