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

    // '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);
};
