/*
 * 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.
 */

// This file has been auto-generated by bindings/code_generator_cobalt.py. DO NOT MODIFY!
// Auto-generated from template: bindings/mozjs/templates/callback-interface.h.template

// clang-format off

#ifndef MozjsSingleOperationInterface_h
#define MozjsSingleOperationInterface_h

#include "cobalt/script/callback_interface_traits.h"
// Headers for other bindings wrapper classes
#include "cobalt/bindings/testing/single_operation_interface.h"

#include "cobalt/script/mozjs/weak_heap_object.h"
#include "third_party/mozjs/js/src/jsapi.h"

namespace cobalt {
namespace bindings {
namespace testing {

class MozjsSingleOperationInterface : public SingleOperationInterface {
 public:
  typedef SingleOperationInterface BaseType;

  MozjsSingleOperationInterface(
      JSContext* context, JS::HandleObject implementing_object);
  base::optional<int32_t > HandleCallback(
      const scoped_refptr<script::Wrappable>& callback_this,
      const scoped_refptr<ArbitraryInterface>& value,
      bool* had_exception) const OVERRIDE;
  JSObject* handle() const { return implementing_object_.Get(); }

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

}  // namespace bindings
}  // namespace testing
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<bindings::testing::SingleOperationInterface> {
  typedef bindings::testing::MozjsSingleOperationInterface MozjsCallbackInterfaceClass;
};
}  // namespace script
}  // namespace cobalt

#endif  // MozjsSingleOperationInterface_h
