/*
 * 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.
[
    Constructor(in [Callback] TestCallback testCallback),
    InterfaceName=TestObject
] interface TestObj {
    // Attributes
    readonly attribute long            readOnlyLongAttr;
    readonly attribute DOMString       readOnlyStringAttr;
    readonly attribute TestObj         readOnlyTestObjAttr;
#if defined(TESTING_JS) || defined(TESTING_V8)
    static readonly attribute long     staticReadOnlyLongAttr;
    static attribute DOMString         staticStringAttr;
    static readonly attribute TestSubObjConstructor TestSubObj;
#endif
    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 idbKey(in IDBKey key);
    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);
#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);
#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);
};
