/*
 * Copyright (C) 2013 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR 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.
 */

// Test for interface extended attributes and special operations.
// Also used as a target by TestObject

enum TestEnumModules { "EnumModulesValue1", "EnumModulesValue2" };
callback VoidCallbackFunctionModules = void ();

[
    ActiveScriptWrappable,
    DependentLifetime,
    Custom=LegacyCallAsFunction,
    DoNotCheckConstants,
    ImplementedAs=TestInterface5Implementation,
    RuntimeEnabled=FeatureName,
    Exposed=(Worker,Window)
] interface TestInterface5 : TestInterfaceEmpty {
    // members needed to test [ImplementedAs], as this affect attribute
    // configuration and method configuration
    const unsigned long UNSIGNED_LONG = 0;
    [Reflect=CONST_CPP] const short CONST_JAVASCRIPT = 1;

    attribute TestInterface5 testInterfaceAttribute; // Self-referential interface type with [ImplementedAs]
    attribute TestInterface5Constructor testInterfaceConstructorAttribute;
    attribute double doubleAttribute;
    attribute float floatAttribute;
    attribute unrestricted double unrestrictedDoubleAttribute;
    attribute unrestricted float unrestrictedFloatAttribute;
    static attribute DOMString staticStringAttribute;

    void voidMethodTestInterfaceEmptyArg(TestInterfaceEmpty testInterfaceEmptyArg);
    void voidMethodDoubleArgFloatArg(double doubleArg, float floatArg);
    void voidMethodUnrestrictedDoubleArgUnrestrictedFloatArg(unrestricted double unrestrictedDoubleArg, unrestricted float unrestrictedFloatArg);
    [PerWorldBindings] void voidMethod();

    // Anonymous indexed property operations
    getter DOMString (unsigned long index);
    setter DOMString (unsigned long index, DOMString value);
    deleter boolean (unsigned long index);

    // iterable<V> needs a "length" property accompanying the indexed property
    // operations above.
    readonly attribute unsigned long length;

    // Anonymous named property operations
    getter DOMString (DOMString name);

    [NotEnumerable] stringifier;

    // Per-method [Exposed] annotation support.
    void alwaysExposedMethod();
    [Exposed=Worker] void workerExposedMethod();
    [Exposed=Window] void windowExposedMethod();

    static void alwaysExposedStaticMethod();
    [Exposed=Worker] static void workerExposedStaticMethod();
    [Exposed=Window] static void windowExposedStaticMethod();

    attribute long alwaysExposedAttribute;
    [Exposed=Worker] attribute long workerExposedAttribute;
    [Exposed=Window] attribute long windowExposedAttribute;

    [Exposed=(Window,ServiceWorker)] void windowAndServiceWorkerExposedMethod();

    // Union types
    void voidMethodBooleanOrDOMStringArg((boolean or DOMString) arg);
    void voidMethodDoubleOrDOMStringArg((double or DOMString) arg);

    // Callback functions
    void voidMethodVoidExperimentalCallbackFunction(VoidExperimentalCallbackFunction arg);
    void voidMethodVoidCallbackFunctionModulesArg(VoidCallbackFunctionModules arg);

    iterable<any>;
};
