{#
 # 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/weak_heap_object.h"
#include "third_party/mozjs/js/src/jsapi.h"
{% endblock includes %}

{% block implementation %}
namespace cobalt {
{% 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);
{% 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_.Get(); }

 private:
  JSContext* context_;
  script::mozjs::WeakHeapObject 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}} MozjsCallbackInterfaceClass;
};
}  // namespace script
}  // namespace cobalt
{% endblock implementation %}
