{#
 # 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 %}
{{ 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(); }

 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 %}
