// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_RENDERER_BINDINGS_API_BINDING_BRIDGE_H_
#define EXTENSIONS_RENDERER_BINDINGS_API_BINDING_BRIDGE_H_

#include <string>

#include "extensions/common/extension_id.h"
#include "gin/wrappable.h"
#include "v8/include/v8.h"

namespace extensions {
class APIBindingHooks;

// An object that serves as a bridge between the current JS-centric bindings and
// the new native bindings system. This basically needs to conform to the public
// methods of the Binding prototype in binding.js.
class APIBindingBridge final : public gin::Wrappable<APIBindingBridge> {
 public:
  static constexpr gin::WrapperInfo kWrapperInfo = {
      {gin::kEmbedderNativeGin}, gin::kAPIBindingBridge};

  APIBindingBridge(const APIBindingBridge&) = delete;
  APIBindingBridge& operator=(const APIBindingBridge&) = delete;

  // Public for cppgc::MakeGarbageCollected.
  APIBindingBridge(APIBindingHooks* hooks,
                   v8::Local<v8::Context> context,
                   v8::Local<v8::Value> api_object,
                   const ExtensionId& extension_id,
                   const std::string& context_type);
  ~APIBindingBridge() override;

  // gin::Wrappable:
  gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
      v8::Isolate* isolate) final;

 private:
  // Runs the given function and registers custom hooks.
  // The function takes three arguments: an object,
  // {
  //   apiFunctions: <JSHookInterface> (see api_bindings_hooks.cc),
  //   compiledApi: <the API object>
  // }
  // as well as a string for the extension ID and a string for the context type.
  // This should register any hooks that the JS needs for the given API.
  void RegisterCustomHook(v8::Isolate* isolate,
                          v8::Local<v8::Function> function);

  const gin::WrapperInfo* wrapper_info() const override;

  // The id of the extension that owns the context this belongs to.
  ExtensionId extension_id_;

  // The type of context this belongs to.
  std::string context_type_;
};

}  // namespace extensions

#endif  // EXTENSIONS_RENDERER_BINDINGS_API_BINDING_BRIDGE_H_
