{#
 # 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::HandleObject implementing_object);
  {{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 %}
