/*
 * Copyright 2015 Google Inc. 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);
