/*
 * 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.
module test {
    interface [
        Constructor(in [Callback] TestCallback testCallback),
        InterfaceName=TestObject
    ] TestObj {
        // Attributes
        readonly attribute long            readOnlyIntAttr;
        readonly attribute DOMString       readOnlyStringAttr;
        readonly attribute TestObj         readOnlyTestObjAttr;
        attribute short                    shortAttr;
        attribute unsigned short           unsignedShortAttr;
        attribute long                     intAttr;
        attribute long long                longLongAttr;
        attribute unsigned long long       unsignedLongLongAttr;
        attribute DOMString                stringAttr;
        attribute TestObj                  testObjAttr;

        // Sequence Attributes
        attribute sequence<ScriptProfile>  sequenceAttr;
        attribute sequence<int> intSequenceAttr;
        attribute sequence<short> shortSequenceAttr;
        attribute sequence<long> longSequenceAttr;
        attribute sequence<long long> longLongSequenceAttr;
        attribute sequence<unsigned int> unsignedIntSequenceAttr;
        attribute sequence<unsigned short> unsignedShortSequenceAttr;
        attribute sequence<unsigned long> unsignedLongSequenceAttr;
        attribute sequence<unsigned long long> unsignedLongLongSequenceAttr;
        attribute sequence<float> floatSequenceAttr;
        attribute sequence<double> doubleSequenceAttr;
        attribute sequence<boolean> booleanSequenceAttr;
        attribute sequence<void> voidSequenceAttr;
        attribute sequence<Date> dateSequenceAttr;

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

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

        // Methods
        void    voidMethod();
        void    voidMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);
        long    intMethod();
        long    intMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);
        TestObj objMethod();
        TestObj objMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);

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

        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
        attribute [Custom] long            customAttr;
        [Custom] void customMethod();
        [Custom] void customMethodWithArgs(in long intArg, 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();

        attribute [CallWith=ScriptState] long withScriptStateAttribute;
        attribute [CallWith=ScriptExecutionContext] TestObj withScriptExecutionContextAttribute;
        attribute [CallWith=ScriptState] TestObj withScriptStateAttributeRaises
            getter raises(DOMException);
        attribute [CallWith=ScriptExecutionContext] TestObj withScriptExecutionContextAttributeRaises
            getter raises(DOMException);
        attribute [CallWith=ScriptExecutionContext|ScriptState] TestObj withScriptExecutionContextAndScriptStateAttribute;
        attribute [CallWith=ScriptExecutionContext|ScriptState] TestObj withScriptExecutionContextAndScriptStateAttributeRaises
            getter raises(DOMException);
        attribute [CallWith=  ScriptExecutionContext  |  ScriptState  ] TestObj withScriptExecutionContextAndScriptStateWithSpacesAttribute;
        attribute [CallWith=ScriptArguments|CallStack] 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
        attribute [Conditional=Condition1] long conditionalAttr1;
        attribute [Conditional=Condition1&Condition2] long conditionalAttr2;
        attribute [Conditional=Condition1|Condition2] long conditionalAttr3;

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

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

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

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

#if defined(TESTING_V8) || defined(TESTING_JS)
        // Overloads
        void    overloadedMethod(in TestObj objArg, in DOMString strArg);
        void    overloadedMethod(in TestObj objArg, in [Optional] long intArg);
        void    overloadedMethod(in DOMString strArg);
        void    overloadedMethod(in long intArg);
        void    overloadedMethod(in [Callback] TestCallback callback);
        void    overloadedMethod(in DOMStringList listArg);
        void    overloadedMethod(in DOMString[] arrayArg);
#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 DOMString type);

#if defined(TESTING_V8)
        // 'V8EnabledAtRuntime' methods and attributes.
        [V8EnabledAtRuntime] void enabledAtRuntimeMethod1(in int intArg);
        [V8EnabledAtRuntime=FeatureName] void enabledAtRuntimeMethod2(in int intArg);
        attribute [V8EnabledAtRuntime] long enabledAtRuntimeAttr1;
        attribute [V8EnabledAtRuntime=FeatureName] long enabledAtRuntimeAttr2;
        // V8EnabledPerContext currently only supports attributes.
        attribute [V8EnabledPerContext] long enabledAtContextAttr1;
        attribute [V8EnabledPerContext=FeatureName] long enabledAtContextAttr2;
#endif


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

#if defined(TESTING_JS)
        void methodWithUnsignedLongArray(in unsigned long[] unsignedLongArray);
#endif

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

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

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

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

        attribute [StrictTypeChecking] float strictFloat;
        [StrictTypeChecking] bool strictFunction(in DOMString str, in float a, in int 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;
    };
}
