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

{% block includes %}
{{ super() }}
#include "cobalt/script/mozjs-45/weak_heap_object.h"
#include "third_party/mozjs-45/js/src/jsapi.h"
{% endblock includes %}

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

class {{binding_class}} : public {{impl_class}} {
 public:
  typedef {{impl_class}} BaseType;

  {{binding_class}}(
      JSContext* context, JS::HandleValue implementing_object_value);
{% 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 %}

  JSObject* handle() const { return implementing_object_.GetObject(); }
  const JS::Value& value() const { return implementing_object_.GetValue(); }
  bool WasCollected() const { return implementing_object_.WasCollected(); }
  void Trace(JSTracer* js_tracer) { implementing_object_.Trace(js_tracer); }

 private:
  JSContext* context_;
  script::mozjs::WeakHeapObject implementing_object_;
};

{% for component in components|reverse %}
}  // namespace {{component}}
{% endfor %}
namespace cobalt {
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}} MozjsCallbackInterfaceClass;
};
}  // namespace script
}  // namespace cobalt
{% endblock implementation %}
