/*
 * Copyright (C) 2011 Google 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 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 output.
[
    Conditional=Condition11|Condition12,
] partial interface TestInterface {
    static readonly attribute long supplementalStaticReadOnlyAttr;
    static attribute DOMString supplementalStaticAttr;
    readonly attribute DOMString supplementalStr1;
    attribute DOMString supplementalStr2;
    [CustomGetter, CustomSetter] attribute DOMString supplementalStr3;
    attribute Node supplementalNode;

    [Reflect] attribute DOMString reflectAttribute;

    void supplementalMethod1();
    [CallWith=ScriptExecutionContext, MayThrowException] TestObj supplementalMethod2(DOMString strArg, TestObj objArg);
    [Custom] void supplementalMethod3();
    static void supplementalMethod4();

    const unsigned short SUPPLEMENTALCONSTANT1 = 1;
    [Reflect=CONST_IMPL] const unsigned short SUPPLEMENTALCONSTANT2 = 2;

    [JSBuiltin] void builtinFunction();
    [JSBuiltin] attribute unsigned short builtinAttribute;
};

[
    Conditional=Conditional13|Conditional14,
] partial dictionary TestStandaloneDictionary {
    required long partialRequiredLongMember;
    boolean partialBooleanMember;
    DOMString partialStringMember;
    TestEnumInStandaloneDictionaryFile partialEnumMember;
    VoidCallback partialCallbackMember;
    [ImplementedAs=partialUnsignedLongMember] unsigned long partialUnsignedLongMemberWithImplementedAs;
    [Conditional=Conditional15] boolean partialBooleanMemberWithIgnoredConditional;
    [EnabledBySetting=TestSetting] DOMString partialStringMemberWithEnabledBySetting;
};

partial dictionary TestInheritedDictionary {
    required long partialRequiredLongMember;
    boolean partialBooleanMember;
    DOMString partialStringMember;
    VoidCallback partialCallbackMember;
    [ImplementedAs=partialUnsignedLongMember] unsigned long partialUnsignedLongMemberWithImplementedAs;
    [Conditional=Conditional15] boolean partialBooleanMemberWithConditional;
    [EnabledBySetting=TestSetting] DOMString partialStringMemberWithEnabledBySetting;
};
