// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Blink-specific forEach iterator's callback
// https://heycam.github.io/webidl/#es-forEach
callback ForEachIteratorCallback = void (any value, any key, any obj);

callback VoidCallbackFunction = void ();
callback AnyCallbackFunctionOptionalAnyArg = any (optional any optionalAnyArg);
// |AnyCallbackFunctionVariadicAnyArgs| is the same as Function.
// https://heycam.github.io/webidl/#Function
callback AnyCallbackFunctionVariadicAnyArgs = any (any... arguments);
callback LongCallbackFunction = long (long num1, long num2);

// Following callback functions are to be generated as expected.
callback VoidCallbackFunctionInterfaceArg = void (HTMLDivElement divElement);
callback VoidCallbackFunctionDictionaryArg = void (TestDictionary arg);
callback VoidCallbackFunctionTestInterfaceSequenceArg = void (sequence<TestInterface> arg);
callback StringSequenceCallbackFunctionLongSequenceArg = sequence<DOMString> (sequence<long> arg);
callback VoidCallbackFunctionEnumArg = void (TestEnum arg);
callback VoidCallbackFunctionTypedef = void (String arg);
[LegacyTreatNonObjectAsNull]
callback TreatNonObjectAsNullVoidFunction = void ();
[LegacyTreatNonObjectAsNull]
callback TreatNonObjectAsNullBooleanFunction = boolean ();

interface TestCallbackFunctions {
    // Extended attributes
    [Reflect] readonly attribute long fooCallbacksReadonlyAttribute;

    // Methods
    VoidCallbackFunction returnCallbackFunctionMethod();
    AnyCallbackFunctionOptionalAnyArg returnCallbackFunctionMethod2();

    void voidMethodCallbackFunctionInArg(VoidCallbackFunction voidCallbackFunctionArg);
    void voidMethodCallbackFunctionInArg2(AnyCallbackFunctionOptionalAnyArg anyCallbackFunctionOptionalAnyArgArg);
    void voidMethodCallbackFunctionWithReturnValueInArg(LongCallbackFunction longCallbackFunctionArg);

    void voidMethodOptionalCallbackFunctionInArg(optional VoidCallbackFunction voidCallbackFunctionArg);
    void voidMethodNullableCallbackFunctionInArg(VoidCallbackFunction? voidCallbackFunctionArg);
    // Extended attributes
    [Reflect] void fooCallbacksMethod();
};
