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

        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, NonEmpty, URL] DOMString reflectedNonEmptyURLAttr;
        attribute [Reflect=customContentStringAttr] DOMString reflectedStringAttr;
        attribute [Reflect=customContentIntegralAttr] long reflectedCustomIntegralAttr;
        attribute [Reflect=customContentBooleanAttr] boolean reflectedCustomBooleanAttr;
        attribute [Reflect=customContentURLAttr, URL] DOMString reflectedCustomURLAttr;
        attribute [Reflect=customContentNonEmptyURLAttr, NonEmpty, URL] DOMString reflectedCustomNonEmptyURLAttr;

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

        [RequiresAllArguments] TestObj methodThatRequiresAllArgs(in DOMString strArg, in TestObj objArg);
        [RequiresAllArguments=Raise] TestObj methodThatRequiresAllArgsAndThrows(in DOMString strArg, in TestObj objArg)
            raises(DOMException);

        void serializedValue(in SerializedScriptValue serializedArg);
        void idbKey(in IDBKey key);
        void optionsObject(in OptionsObject oo, in [Optional] OptionsObject 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);

        [CustomArgumentHandling] void customArgsAndException(in log intArg)
            raises(DOMException);

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

        // 'CallWith' extended attribute
        [CallWith=DynamicFrame] void withDynamicFrame();
        [CallWith=DynamicFrame] void withDynamicFrameAndArg(in long intArg);
        [CallWith=DynamicFrame] void withDynamicFrameAndOptionalArg(in long intArg, in [Optional] long optionalArg);
        [NeedsUserGestureCheck, CallWith=DynamicFrame] void withDynamicFrameAndUserGesture(in long intArg);
        [NeedsUserGestureCheck, CallWith=DynamicFrame] void withDynamicFrameAndUserGestureASAD(in long intArg, in [Optional] long optionalArg);
        [CallWith=ScriptState] void withScriptStateVoid();
        [CallWith=ScriptState] TestObj withScriptStateObj();
        [CallWith=ScriptState] void withScriptStateVoidException()
            raises(DOMException);
        [CallWith=ScriptState] TestObj withScriptStateObjException()
            raises(DOMException);
        [CallWith=ScriptExecutionContext] void withScriptExecutionContext();

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

#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

        // 'ConvertScriptString' extended attribute
        readonly attribute [ConvertScriptString] DOMString scriptStringAttr;

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

#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);
#endif

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

#if defined(TESTING_V8)
        // 'EnabledAtRuntime' methods and attributes.
        [EnabledAtRuntime] void enabledAtRuntimeMethod1(in int intArg);
        [EnabledAtRuntime=FeatureName] void enabledAtRuntimeMethod2(in int intArg);
        attribute [EnabledAtRuntime] long enabledAtRuntimeAttr1;
        attribute [EnabledAtRuntime=FeatureName] long enabledAtRuntimeAttr2;
#endif

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