# This file describes all Web IDL extended attributes that are supported by the
# Cobalt bindings code generation pipeline. Using an extended attribute not
# listed below will cause the build to fail.
# Extended attributes include attributes listed in the Web IDL specification
# (http://heycam.github.io/webidl/#idl-extended-attributes) and custom
# attributes that we need to support Cobalt's bindings implementation.
#
# This file and format is derived from Blink IDL extended attribute whitelist,
# which can be found under
# third_party/blink/Source/bindings/IDLExtendedAttributes.txt
#
# If you introduce a new extended attribute or value:
#     (1) add the extended attribute or value to this file
#     (2) add test cases to run-bindings-tests to exercise the new attribute,
#         if appropriate.
#
# The syntax of this file is as follows:
#     - One extended attribute per one line: Name and (optionally) Values.
#     - "Attr" means that the Attr does not take a value, i.e. [Attr].
#     - "Attr=X" means that Attr takes a required value, which must be X;
#       i.e. [Attr=X].
#     - "Attr=X|Y|Z" means that Attr takes a required value, and the valid
#       values are X, Y, and Z, and combinations thereof;
#       e.g. [Attr=X], [Attr=Y], [Attr=X|Z].
#       The separator must be | or &, so [Attr=X&Z] is also valid; the
#       separator makes a difference for Conditional, but otherwise is simply
#       a style convention.
#     - "Attr=|X|Y|Z" means that Attr takes an optional value, whose valid
#       values (if present) are X, Y, and Z, and combinations thereof; e.g.
#       [Attr], [Attr=X], [Attr=Y], [Attr=X|Z], [Attr=X|Y|Z], [Attr=X&Z].
#       Note that including an empty value in the list, as in [Attr=X||Y],
#       is NOT valid: the value is optional, but empty values are not allowed.
#     - "Attr=*" means that Attr takes a required value, which can be
#       arbitrary, and combinations thereof, e.g. [Attr=IndexedDB],
#       [Attr=DeleteFunction], [Attr=X|Y].
#     - "Attr=|*" means that Attr takes an optional value, which can be
#       arbitrary, e.g. [Attr], [Attr=X].
#     - "Attr=X|*" means that Attr takes an required value, which can be
#       arbitrary, but that "X" is standard, e.g. [Attr=X], [Attr=Foo].
#

# An Interface Object for this interface will not be created.
# https://www.w3.org/TR/WebIDL/#NoInterfaceObject
NoInterfaceObject

# This interface will be used as a global object. PrimaryGlobal s intended to be
# used by the Window interface, but is also used for TestWindow in unit tests.
# http://heycam.github.io/webidl/#Global
Global
PrimaryGlobal

# This interface is exposed on the specified global interface, rather than
# the default of Window.
# This is generally used for exposing interfaces to Worker interfaces, but it is
# also used in Cobalt to expose interfaces used in unit tests to a TestWindow
# global interface, rather than the default Window global interface.
# http://heycam.github.io/webidl/#Exposed
Exposed=*

# Call the Cobalt function this property is bound to with the corresponding
# object added to the head of the function's parameters.
# StackTrace is a custom addition to CallWith for the purpose of testing
# GetStackTrace, and is not specified in the spec.
CallWith=EnvironmentSettings|StackTrace
ConstructorCallWith=EnvironmentSettings

# The constructor/attribute/operation may raise an exception. A pointer to an
# ExceptionState interface will be passed to the implementation at the end of
# the parameter list.
RaisesException=|Constructor|Setter

# The Constructor keyword exposes a Constructor to JavaScript.
Constructor

# The Constructor for an interface is different from the interface name.
NamedConstructor=*

# When set on a DOMString type, null will be converted to the empty string
# rather than the string "null".
TreatNullAs=EmptyString

# When TreatUndefinedAs=EmptyString is set on a DOMString type, undefined will
# be converted to the empty string rather than the string "undefined".
TreatUndefinedAs=EmptyString

# Surround the affected code in #if defined(CONDITIONAL_VALUE). Can be applied
# to interfaces and individual properties.
Conditional=*

# Marks an interface or properties of an interface as not supported. Such
# properties are not visible from JavaScript. Attempts to access them will
# trigger a notification.
NotSupported

# If the Clamp extended attribute appears on an operation argument,
# writable attribute or dictionary member whose type is one of the
# integer types, it indicates that when an ECMAScript Number is
# converted to the IDL type, out of range values will be clamped to the
# range of valid values, rather than using the operators that use a
# module operation.
Clamp

# Not yet supported
ArrayClass
LenientThis
OverrideBuiltins
PutForwards=*
Replaceable
Unforgeable

# Ignored attributes. We do not perform any additional logic in the bindings
# when these attributes are present
NewObject
SameObject

# Allows to specify an alternate method name for an attribute implementation.
# Can be used to avoid using reserved keywords for method names.
ImplementedAs=*
