{#
 # Copyright 2016 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.
 #}
{% extends "callback-interface-base.h.template" %}

{% block includes %}
#include "cobalt/script/wrappable.h"
#include "cobalt/script/javascriptcore/jsc_callback_interface.h"
#include "third_party/WebKit/Source/JavaScriptCore/runtime/JSObject.h"
{% for include in header_includes %}
#include "{{include}}"
{% endfor %}
{% endblock includes %}

{% block implementation %}
namespace cobalt {
{% for component in components %}
namespace {{component}} {
{% endfor %}

class {{binding_class}} : public {{impl_class}} {
 public:
  {{binding_class}}(JSC::JSObject* implementing_object);
{% for operation in operations %}
{% for overload in operation.overloads %}
  {{overload.type}} {{overload.name}}(
      const scoped_refptr<script::Wrappable>& callback_this,
    {% for arg in overload.arguments %}
      {{arg.arg_type}} {{arg.name}},
    {% endfor %}
      bool* had_exception) const OVERRIDE;
{% endfor %}
{% endfor %}
  JSC::JSObject* implementing_object() const { return implementing_object_; }

 private:
  JSC::JSObject* implementing_object_;
};

{% for component in components %}
}  // namespace {{component}}
{% endfor %}
namespace script {
// Explicit instantiation of CallbackInterfaceTraits struct so we can infer
// the type of the generated class from the type of the callback interface.
template<>
struct CallbackInterfaceTraits<{{fully_qualified_impl_class}}> {
  typedef {{fully_qualified_binding_class}} JSCCallbackInterfaceClass;
};

}  // namespace script
}  // namespace cobalt
{% endblock implementation %}
