/*
 * Copyright (C) 2009 Google Inc. All rights reserved.
 * Copyright (C) 2010 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary formstrArg, 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.
 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS 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.
 */

// This IDL file is for testing the bindings code generator and for tracking
// changes in its ouput.

enum TestEnumType { "", "EnumValue1", "EnumValue2", "EnumValue3" };

[
    Constructor(in [Callback] TestCallback testCallback),
    InterfaceName=TestObject
] interface TestObj {
    // Attributes
    readonly attribute long            readOnlyLongAttr;
    readonly attribute DOMString       readOnlyStringAttr;
    readonly attribute TestObj         readOnlyTestObjAttr;
    static readonly attribute long     staticReadOnlyLongAttr;
    static attribute DOMString         staticStringAttr;
    static readonly attribute TestSubObjConstructor TestSubObj;
    attribute TestEnumType             enumAttr;
    attribute short                    shortAttr;
    attribute unsigned short           unsignedShortAttr;
    attribute long                     longAttr;
    attribute long long                longLongAttr;
    attribute unsigned long long       unsignedLongLongAttr;
    attribute DOMString                stringAttr;
    [V8MeasureAs=TestFeature] attribute TestObj testObjAttr;

    // WK_ucfirst, WK_lcfirst exceptional cases.
    attribute TestObj                  XMLObjAttr;
    attribute boolean                  create;

    // Reflected DOM attributes
    [Reflect] attribute DOMString reflectedStringAttr;
    [Reflect] attribute long reflectedIntegralAttr;
    [Reflect] attribute unsigned long reflectedUnsignedIntegralAttr;
    [Reflect] attribute boolean reflectedBooleanAttr;
    [Reflect, URL] attribute DOMString reflectedURLAttr;
    [Reflect=customContentStringAttr] attribute DOMString reflectedStringAttr;
    [Reflect=customContentIntegralAttr] attribute long reflectedCustomIntegralAttr;
    [Reflect=customContentBooleanAttr] attribute boolean reflectedCustomBooleanAttr;
    [Reflect=customContentURLAttr, URL] attribute DOMString reflectedCustomURLAttr;

    // TypedArray attribute
    attribute Float32Array typedArrayAttr;

    // Methods
    void    voidMethod();
    void    voidMethodWithArgs(in long longArg, in DOMString strArg, in TestObj objArg);
    long    longMethod();
    long    longMethodWithArgs(in long longArg, in DOMString strArg, in TestObj objArg);
    [V8MeasureAs=TestFeature] TestObj objMethod();
    TestObj objMethodWithArgs(in long longArg, in DOMString strArg, in TestObj objArg);

    void methodWithSequenceArg(in sequence<ScriptProfile> sequenceArg);
    sequence<ScriptProfile> methodReturningSequence(in long longArg);

    TestObj methodThatRequiresAllArgsAndThrows(in DOMString strArg, in TestObj objArg)
        raises(DOMException);

    void serializedValue(in SerializedScriptValue serializedArg);
    void optionsObject(in Dictionary oo, in [Optional] Dictionary ooo);

    // Exceptions
    void methodWithException() raises(DOMException);
    attribute long attrWithGetterException getter raises(DOMException);
    attribute long attrWithSetterException setter raises(DOMException);
    attribute DOMString stringAttrWithGetterException getter raises(DOMException);
    attribute DOMString stringAttrWithSetterException setter raises(DOMException);

    // 'Custom' extended attribute
    [Custom] attribute long            customAttr;
    [Custom, V8MeasureAs=CustomTestFeature] void customMethod();
    [Custom] void customMethodWithArgs(in long longArg, in DOMString strArg, in TestObj objArg);

    void addEventListener(in DOMString type, 
                          in EventListener listener, 
                          in [Optional] boolean useCapture);
    void removeEventListener(in DOMString type, 
                             in EventListener listener, 
                             in [Optional] boolean useCapture);

    // 'CallWith' extended attribute
    [CallWith=ScriptState] void withScriptStateVoid();
    [CallWith=ScriptState] TestObj withScriptStateObj();
    [CallWith=ScriptState] void withScriptStateVoidException()
        raises(DOMException);
    [CallWith=ScriptState] TestObj withScriptStateObjException()
        raises(DOMException);
    [CallWith=ScriptExecutionContext] void withScriptExecutionContext();
    [CallWith=ScriptExecutionContext|ScriptState] void withScriptExecutionContextAndScriptState();
    [CallWith=ScriptExecutionContext|ScriptState] TestObj withScriptExecutionContextAndScriptStateObjException()
        raises(DOMException);
    [CallWith=  ScriptExecutionContext  |  ScriptState  ] TestObj withScriptExecutionContextAndScriptStateWithSpaces();
    [CallWith=ScriptArguments|CallStack] void withScriptArgumentsAndCallStack();

    [CallWith=ScriptState] attribute long withScriptStateAttribute;
    [CallWith=ScriptExecutionContext] attribute TestObj withScriptExecutionContextAttribute;
    [CallWith=ScriptState] attribute TestObj withScriptStateAttributeRaises
        getter raises(DOMException);
    [CallWith=ScriptExecutionContext] attribute TestObj withScriptExecutionContextAttributeRaises
        getter raises(DOMException);
    [CallWith=ScriptExecutionContext|ScriptState] attribute TestObj withScriptExecutionContextAndScriptStateAttribute;
    [CallWith=ScriptExecutionContext|ScriptState] attribute TestObj withScriptExecutionContextAndScriptStateAttributeRaises
        getter raises(DOMException);
    [CallWith=  ScriptExecutionContext  |  ScriptState  ] attribute TestObj withScriptExecutionContextAndScriptStateWithSpacesAttribute;
    [CallWith=ScriptArguments|CallStack] attribute TestObj withScriptArgumentsAndCallStackAttribute;

    // 'Optional' extended attribute
    void    methodWithOptionalArg(in [Optional] long opt);
    void    methodWithNonOptionalArgAndOptionalArg(in long nonOpt, in [Optional] long opt);
    void    methodWithNonOptionalArgAndTwoOptionalArgs(in long nonOpt, in [Optional] long opt1, in [Optional] long opt2);
    void    methodWithOptionalString(in [Optional] DOMString str);
    void    methodWithOptionalStringIsUndefined(in [Optional=DefaultIsUndefined] DOMString str);
    void    methodWithOptionalStringIsNullString(in [Optional=DefaultIsNullString] DOMString str);

#if defined(TESTING_V8) || defined(TESTING_JS)
    // 'Callback' extended attribute
    void    methodWithCallbackArg(in [Callback] TestCallback callback);
    void    methodWithNonCallbackArgAndCallbackArg(in long nonCallback, in [Callback] TestCallback callback);
    void    methodWithCallbackAndOptionalArg(in [Callback, Optional] TestCallback callback);
    // static methods with 'Callback' extended attribute
    static void    staticMethodWithCallbackAndOptionalArg(in [Callback, Optional] TestCallback callback);
    static void    staticMethodWithCallbackArg(in [Callback] TestCallback callback);
#endif

#if defined(TESTING_V8)
    // 'EnforceRange' extended attribute
    void    methodWithEnforceRangeInt32(in [EnforceRange] long value);
    void    methodWithEnforceRangeUInt32(in [EnforceRange] unsigned long value);
    void    methodWithEnforceRangeInt64(in [EnforceRange] long long value);
    void    methodWithEnforceRangeUInt64(in [EnforceRange] unsigned long long value);

    attribute [EnforceRange] long enforcedRangeLongAttr;
    attribute [EnforceRange] unsigned long enforcedRangeUnsignedLongAttr;
    attribute [EnforceRange] long long enforcedRangeLongLongAttr;
    attribute [EnforceRange] unsigned long long enforcedRangeUnsignedLongLongAttr;
#endif

    // 'Conditional' extended attribute
    [Conditional=Condition1] attribute long conditionalAttr1;
    [Conditional=Condition1&Condition2] attribute long conditionalAttr2;
    [Conditional=Condition1|Condition2] attribute long conditionalAttr3;

    // 'Conditional' extended method
    [Conditional=Condition1] DOMString conditionalMethod1();
    [Conditional=Condition1&Condition2] void conditionalMethod2();
    [Conditional=Condition1|Condition2] void conditionalMethod3();

    [Conditional=Condition1] attribute TestObjectAConstructor conditionalAttr4;
    [Conditional=Condition1&Condition2] attribute TestObjectBConstructor conditionalAttr5;
    [Conditional=Condition1|Condition2] attribute TestObjectCConstructor conditionalAttr6;

    [Conditional=Condition1] const unsigned short CONDITIONAL_CONST = 0;

#if defined(TESTING_V8) || defined(TESTING_JS)
    [CachedAttribute] readonly attribute any cachedAttribute1;
    [CachedAttribute] readonly attribute any cachedAttribute2;
#endif
    
    attribute any anyAttribute;

#if defined(TESTING_V8) || defined(TESTING_JS)
    // Overloads
    void    overloadedMethod(in TestObj? objArg, in [StrictTypeChecking] DOMString strArg);
    void    overloadedMethod(in TestObj? objArg, in [Optional] long longArg);
    void    overloadedMethod(in [StrictTypeChecking] DOMString strArg);
    void    overloadedMethod(in long longArg);
    void    overloadedMethod(in [Callback] TestCallback callback);
    void    overloadedMethod(in DOMStringList? listArg);
    void    overloadedMethod(in DOMString[]? arrayArg);
    void    overloadedMethod(in TestObj objArg);
    void    overloadedMethod(in DOMString[] arrayArg);
    void    overloadedMethod(in sequence<unsigned long> arrayArg);
    void    overloadedMethod(in DOMString strArg);
#endif

    // Class methods within JavaScript (like what's used for IDBKeyRange).
    static void classMethod();
    static long classMethodWithOptional(in [Optional] long arg);
    [Custom] static void classMethod2(in long arg);

    // Static method with conditional on overloaded methods
    [Conditional=Condition1] static void overloadedMethod1(in long arg);
    [Conditional=Condition1] static void overloadedMethod1(in [StrictTypeChecking] DOMString type);

    void classMethodWithClamp(in [Clamp] unsigned short objArgsShort, in [Clamp] unsigned long objArgsLong);

#if defined(TESTING_V8)
    // 'V8EnabledAtRuntime' methods and attributes.
    [V8EnabledAtRuntime] void enabledAtRuntimeMethod1(in long longArg);
    [V8EnabledAtRuntime=FeatureName] void enabledAtRuntimeMethod2(in long longArg);
    [V8EnabledAtRuntime] attribute long enabledAtRuntimeAttr1;
    [V8EnabledAtRuntime=FeatureName] attribute long enabledAtRuntimeAttr2;
    // 'V8EnabledPerContext' methods and attributes.
    [V8EnabledPerContext] void enabledPerContextMethod1(in long longArg);
    [V8EnabledPerContext=FeatureName] void enabledPerContextMethod2(in long longArg);
    [V8EnabledPerContext] attribute long enabledPerContextAttr1;
    [V8EnabledPerContext=FeatureName] attribute long enabledPerContextAttr2;
#endif


#if defined(TESTING_V8)
    attribute float[]                   floatArray;
    attribute double[]                  doubleArray;
#endif

#if defined(TESTING_JS)
    void methodWithUnsignedLongSequence(in sequence<unsigned long> unsignedLongSequence);
#endif
#if defined(TESTING_V8) || defined(TESTING_JS)
    DOMString[] stringArrayFunction(in DOMString[] values) raises(DOMException);
    DOMStringList domStringListFunction(in DOMStringList values) raises(DOMException);
#endif

    [CheckSecurityForNode] readonly attribute Document contentDocument;
    [CheckSecurityForNode] SVGDocument getSVGDocument()
        raises(DOMException);

    void convert1(in [TreatReturnedNullStringAs=Null] a value);
    void convert2(in [TreatReturnedNullStringAs=Undefined] b value);
    void convert4(in [TreatNullAs=NullString] d value);
    void convert5(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] e value);

    attribute SVGPoint mutablePoint;
    [Immutable] attribute SVGPoint immutablePoint;
    SVGPoint mutablePointFunction();
    [Immutable] SVGPoint immutablePointFunction();

    [ImplementedAs=banana] void orange();
    [ImplementedAs=blueberry] attribute long strawberry;

    [StrictTypeChecking] attribute float strictFloat;
    [StrictTypeChecking] bool strictFunction(in DOMString str, in float a, in long b)
        raises(DOMException);

    // ObjectiveC reserved words.
    readonly attribute long      description;
    attribute long               id;
    readonly attribute DOMString hash;

    // Check constants and enums.
    const unsigned short CONST_VALUE_0 = 0;
    const unsigned short CONST_VALUE_1 = 1;
    const unsigned short CONST_VALUE_2 = 2;
    const unsigned short CONST_VALUE_4 = 4;
    const unsigned short CONST_VALUE_8 = 8;
    const short CONST_VALUE_9 = -1;
    const DOMString CONST_VALUE_10 = "my constant string";
    const unsigned short CONST_VALUE_11 = 0xffffffff;
    const unsigned short CONST_VALUE_12 = 0x01;
    const unsigned short CONST_VALUE_13 = 0X20;
    const unsigned short CONST_VALUE_14 = 0x1abc;
    [Reflect=CONST_IMPL] const unsigned short CONST_JAVASCRIPT = 15;

    [Replaceable] readonly attribute long replaceableAttribute;

    void variadicStringMethod(in DOMString head, in DOMString... tail);
    void variadicDoubleMethod(in double head, in double... tail);
    void variadicNodeMethod(in Node head, in Node... tail);

    // Nullable attributes.
    readonly attribute double? nullableDoubleAttribute;
    readonly attribute long? nullableLongAttribute;
    readonly attribute boolean? nullableBooleanAttribute;
    readonly attribute DOMString? nullableStringAttribute;

    attribute long? nullableLongSettableAttribute;

    attribute long? nullableStringValue
        getter raises(DOMException);
};
