// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

interface CallbackFunctionInterface {
  void takesVoidFunction(VoidFunction cb);
  void takesFunctionThatReturnsString(FunctionThatReturnsString cb);
  void takesFunctionWithOneParameter(FunctionWithOneParameter cb);
  void takesFunctionWithSeveralParameters(FunctionWithSeveralParameters cb);
  void takesFunctionWithNullableParameters(FunctionWithNullableParameters cb);

  attribute VoidFunction callbackAttribute;
  attribute VoidFunction? nullableCallbackAttribute;
};

callback VoidFunction = void();
callback FunctionThatReturnsString = DOMString();
callback FunctionWithOneParameter = void(long param);
callback FunctionWithSeveralParameters = void(double param1, DOMString param2, ArbitraryInterface param3);
callback FunctionWithNullableParameters = void(boolean? param1, DOMString? param2, ArbitraryInterface? param3);
