#
# This file describes all Blink IDL extended attributes and allowed values.
# If any IDL file uses an extended attribute or values not listed below, the
# build will fail.
# If you would like to add a new extended attribute or value, please:
#     (1) add the extended attribute or value to this file
#     (2) add an explanation to the Blink IDL extended attributes document:
#         http://www.chromium.org/blink/webidl/blink-idl-extended-attributes
#     (3) add appropriate test cases to run-bindings-tests
#
# 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].
#

ActiveDOMObject
CachedAttribute=*
CallWith=ExecutionContext|ScriptState|ScriptArguments|ActiveWindow|FirstWindow|ThisValue
CheckSecurity=Frame|Node|Window
Clamp
Conditional=*
Constructor
# FIXME: remove [ConstructorCallWith=Document], as can instead use
# [ConstructorCallWith=ExecutionContext] + toDocument(executionContext)
ConstructorCallWith=ExecutionContext|Document
Custom=|Getter|Setter|LegacyCallAsFunction|ToV8|VisitDOMWrapper|Wrap|PropertyGetter|PropertyEnumerator|PropertyQuery
CustomConstructor
CustomElementCallbacks
# Dartium specific attributes.
# DartCustom can have no value or New if New an additional method is added (V8 will not see this method)
DartCustom=|New|Setter|Getter
# DartName should have the alias name to be used to resolve.
DartName=*
# DartSuppress can have no value will suppress attribute/method, if attribute can also suppress
# just the DartSuppress=getter or DartSuppress=Setter
DartSuppress=|Getter|Setter
# No need to setup Dart API scope when a native function is invoked. 
DartNoAutoScope
# TODO(terry): Used in dart.idl - look at removing or using 
DartSupplemental
# TODO(terry): Used in dart.idl (look at eliminating).
DartForceOptional
# TODO(terry): Used in dart.idl (look at eliminating).
Callback
# TODO(terry): Used in dart.idl (look at eliminating).
DartStrictTypeChecking
# End of Dartium attributes.
Default=Undefined
DependentLifetime
DeprecateAs=*
DoNotCheckConstants
DoNotCheckSecurity=|Setter
DoNotCheckSignature
EnforceRange
EventConstructor
ExposeJSAccessors
Exposed=*
GarbageCollected
Global=|*
Immutable
ImplementedAs=*
ImplementedInPrivateScript
InitializedByEventConstructor
Iterable
LegacyTreatAsPartialInterface
LogActivity=|GetterOnly|SetterOnly
LogAllWorlds
MeasureAs=*
NamedConstructor=*
NoImplHeader
NoInterfaceObject
NotEnumerable
NotScriptWrappable
OnlyExposedToPrivateScript
OverrideBuiltins
PartialInterfaceImplementedAs=*
# Valid values for [PerContextEnabled] are Context Features, in
# ContextFeatures::FeatureType in Source/core/dom/ContextFeatures.h
PerContextEnabled=*
PerWorldBindings
PrimaryGlobal=|*
PutForwards=*
RaisesException=|Getter|Setter|Constructor
Reflect=|*
ReflectEmpty=*
ReflectInvalid=*
ReflectMissing=*
ReflectOnly=*
Replaceable
# Valid values for [RuntimeEnabled] are the Runtime Enabled Features, listed in
# Source/core/page/RuntimeEnabledFeatures.in
RuntimeEnabled=*
SetWrapperReferenceFrom=*
SetWrapperReferenceTo=*
SetterCallWith=ExecutionContext|ScriptArguments|ActiveWindow|FirstWindow
SpecialWrapFor=*
TreatNullAs=NullString|EmptyString
TreatReturnedNullStringAs=Null|Undefined
TreatUndefinedAs=NullString
TypeChecking=Interface|Unrestricted
URL
Unforgeable
WillBeGarbageCollected
