

// Copyright 2018 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.

// clang-format off

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

#include "cobalt/bindings/testing/v8c_window.h"

#include "base/debug/trace_event.h"
#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/script/global_environment.h"
#include "cobalt/script/script_value.h"
#include "cobalt/script/value_handle.h"
#include "cobalt/bindings/testing/anonymous_indexed_getter_interface.h"
#include "cobalt/bindings/testing/anonymous_named_getter_interface.h"
#include "cobalt/bindings/testing/anonymous_named_indexed_getter_interface.h"
#include "cobalt/bindings/testing/arbitrary_interface.h"
#include "cobalt/bindings/testing/base_interface.h"
#include "cobalt/bindings/testing/boolean_type_test_interface.h"
#include "cobalt/bindings/testing/callback_function_interface.h"
#include "cobalt/bindings/testing/callback_interface_interface.h"
#include "cobalt/bindings/testing/conditional_interface.h"
#include "cobalt/bindings/testing/constants_interface.h"
#include "cobalt/bindings/testing/constructor_interface.h"
#include "cobalt/bindings/testing/constructor_with_arguments_interface.h"
#include "cobalt/bindings/testing/convert_simple_object_interface.h"
#include "cobalt/bindings/testing/derived_getter_setter_interface.h"
#include "cobalt/bindings/testing/derived_interface.h"
#include "cobalt/bindings/testing/dictionary_interface.h"
#include "cobalt/bindings/testing/disabled_interface.h"
#include "cobalt/bindings/testing/dom_string_test_interface.h"
#include "cobalt/bindings/testing/enumeration_interface.h"
#include "cobalt/bindings/testing/exception_object_interface.h"
#include "cobalt/bindings/testing/exceptions_interface.h"
#include "cobalt/bindings/testing/extended_idl_attributes_interface.h"
#include "cobalt/bindings/testing/garbage_collection_test_interface.h"
#include "cobalt/bindings/testing/global_interface_parent.h"
#include "cobalt/bindings/testing/implemented_interface.h"
#include "cobalt/bindings/testing/indexed_getter_interface.h"
#include "cobalt/bindings/testing/interface_with_any.h"
#include "cobalt/bindings/testing/interface_with_any_dictionary.h"
#include "cobalt/bindings/testing/interface_with_date.h"
#include "cobalt/bindings/testing/interface_with_unsupported_properties.h"
#include "cobalt/bindings/testing/named_constructor_interface.h"
#include "cobalt/bindings/testing/named_getter_interface.h"
#include "cobalt/bindings/testing/named_indexed_getter_interface.h"
#include "cobalt/bindings/testing/nested_put_forwards_interface.h"
#include "cobalt/bindings/testing/no_constructor_interface.h"
#include "cobalt/bindings/testing/no_interface_object_interface.h"
#include "cobalt/bindings/testing/nullable_types_test_interface.h"
#include "cobalt/bindings/testing/numeric_types_test_interface.h"
#include "cobalt/bindings/testing/object_type_bindings_interface.h"
#include "cobalt/bindings/testing/operations_test_interface.h"
#include "cobalt/bindings/testing/promise_interface.h"
#include "cobalt/bindings/testing/put_forwards_interface.h"
#include "cobalt/bindings/testing/sequence_user.h"
#include "cobalt/bindings/testing/single_operation_interface.h"
#include "cobalt/bindings/testing/static_properties_interface.h"
#include "cobalt/bindings/testing/stringifier_anonymous_operation_interface.h"
#include "cobalt/bindings/testing/stringifier_attribute_interface.h"
#include "cobalt/bindings/testing/stringifier_operation_interface.h"
#include "cobalt/bindings/testing/target_interface.h"
#include "cobalt/bindings/testing/union_types_interface.h"
#include "cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.h"
#include "cobalt/bindings/testing/v8c_anonymous_named_getter_interface.h"
#include "cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.h"
#include "cobalt/bindings/testing/v8c_arbitrary_interface.h"
#include "cobalt/bindings/testing/v8c_base_interface.h"
#include "cobalt/bindings/testing/v8c_boolean_type_test_interface.h"
#include "cobalt/bindings/testing/v8c_callback_function_interface.h"
#include "cobalt/bindings/testing/v8c_callback_interface_interface.h"
#include "cobalt/bindings/testing/v8c_conditional_interface.h"
#include "cobalt/bindings/testing/v8c_constants_interface.h"
#include "cobalt/bindings/testing/v8c_constructor_interface.h"
#include "cobalt/bindings/testing/v8c_constructor_with_arguments_interface.h"
#include "cobalt/bindings/testing/v8c_convert_simple_object_interface.h"
#include "cobalt/bindings/testing/v8c_derived_getter_setter_interface.h"
#include "cobalt/bindings/testing/v8c_derived_interface.h"
#include "cobalt/bindings/testing/v8c_dictionary_interface.h"
#include "cobalt/bindings/testing/v8c_disabled_interface.h"
#include "cobalt/bindings/testing/v8c_dom_string_test_interface.h"
#include "cobalt/bindings/testing/v8c_enumeration_interface.h"
#include "cobalt/bindings/testing/v8c_exception_object_interface.h"
#include "cobalt/bindings/testing/v8c_exceptions_interface.h"
#include "cobalt/bindings/testing/v8c_extended_idl_attributes_interface.h"
#include "cobalt/bindings/testing/v8c_garbage_collection_test_interface.h"
#include "cobalt/bindings/testing/v8c_global_interface_parent.h"
#include "cobalt/bindings/testing/v8c_implemented_interface.h"
#include "cobalt/bindings/testing/v8c_indexed_getter_interface.h"
#include "cobalt/bindings/testing/v8c_interface_with_any.h"
#include "cobalt/bindings/testing/v8c_interface_with_any_dictionary.h"
#include "cobalt/bindings/testing/v8c_interface_with_date.h"
#include "cobalt/bindings/testing/v8c_interface_with_unsupported_properties.h"
#include "cobalt/bindings/testing/v8c_named_constructor_interface.h"
#include "cobalt/bindings/testing/v8c_named_getter_interface.h"
#include "cobalt/bindings/testing/v8c_named_indexed_getter_interface.h"
#include "cobalt/bindings/testing/v8c_nested_put_forwards_interface.h"
#include "cobalt/bindings/testing/v8c_no_constructor_interface.h"
#include "cobalt/bindings/testing/v8c_no_interface_object_interface.h"
#include "cobalt/bindings/testing/v8c_nullable_types_test_interface.h"
#include "cobalt/bindings/testing/v8c_numeric_types_test_interface.h"
#include "cobalt/bindings/testing/v8c_object_type_bindings_interface.h"
#include "cobalt/bindings/testing/v8c_operations_test_interface.h"
#include "cobalt/bindings/testing/v8c_promise_interface.h"
#include "cobalt/bindings/testing/v8c_put_forwards_interface.h"
#include "cobalt/bindings/testing/v8c_sequence_user.h"
#include "cobalt/bindings/testing/v8c_single_operation_interface.h"
#include "cobalt/bindings/testing/v8c_static_properties_interface.h"
#include "cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.h"
#include "cobalt/bindings/testing/v8c_stringifier_attribute_interface.h"
#include "cobalt/bindings/testing/v8c_stringifier_operation_interface.h"
#include "cobalt/bindings/testing/v8c_target_interface.h"
#include "cobalt/bindings/testing/v8c_union_types_interface.h"
#include "cobalt/bindings/testing/v8c_window.h"
#include "cobalt/bindings/testing/window.h"

#include "v8c_gen_type_conversion.h"

#include "cobalt/script/callback_interface_traits.h"
#include "cobalt/script/v8c/v8c_array_buffer.h"
#include "cobalt/script/v8c/v8c_array_buffer_view.h"
#include "cobalt/script/v8c/callback_function_conversion.h"
#include "cobalt/script/v8c/conversion_helpers.h"
#include "cobalt/script/v8c/entry_scope.h"
#include "cobalt/script/v8c/helpers.h"
#include "cobalt/script/v8c/native_promise.h"
#include "cobalt/script/v8c/type_traits.h"
#include "cobalt/script/v8c/v8c_typed_arrays.h"
#include "cobalt/script/v8c/v8c_data_view.h"
#include "cobalt/script/v8c/v8c_callback_function.h"
#include "cobalt/script/v8c/v8c_callback_interface_holder.h"
#include "cobalt/script/v8c/v8c_engine.h"
#include "cobalt/script/v8c/v8c_exception_state.h"
#include "cobalt/script/v8c/v8c_global_environment.h"
#include "cobalt/script/v8c/v8c_property_enumerator.h"
#include "cobalt/script/v8c/v8c_value_handle.h"
#include "cobalt/script/v8c/wrapper_private.h"
#include "v8/include/v8.h"


namespace {
using cobalt::bindings::testing::Window;
using cobalt::bindings::testing::V8cWindow;
using cobalt::bindings::testing::AnonymousIndexedGetterInterface;
using cobalt::bindings::testing::AnonymousNamedGetterInterface;
using cobalt::bindings::testing::AnonymousNamedIndexedGetterInterface;
using cobalt::bindings::testing::ArbitraryInterface;
using cobalt::bindings::testing::BaseInterface;
using cobalt::bindings::testing::BooleanTypeTestInterface;
using cobalt::bindings::testing::CallbackFunctionInterface;
using cobalt::bindings::testing::CallbackInterfaceInterface;
#if defined(ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::ConditionalInterface;
#endif  // defined(ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::ConstantsInterface;
using cobalt::bindings::testing::ConstructorInterface;
using cobalt::bindings::testing::ConstructorWithArgumentsInterface;
using cobalt::bindings::testing::ConvertSimpleObjectInterface;
using cobalt::bindings::testing::DOMStringTestInterface;
using cobalt::bindings::testing::DerivedGetterSetterInterface;
using cobalt::bindings::testing::DerivedInterface;
using cobalt::bindings::testing::DictionaryInterface;
#if defined(NO_ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::DisabledInterface;
#endif  // defined(NO_ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::EnumerationInterface;
using cobalt::bindings::testing::ExceptionObjectInterface;
using cobalt::bindings::testing::ExceptionsInterface;
using cobalt::bindings::testing::ExtendedIDLAttributesInterface;
using cobalt::bindings::testing::GarbageCollectionTestInterface;
using cobalt::bindings::testing::GlobalInterfaceParent;
using cobalt::bindings::testing::ImplementedInterface;
using cobalt::bindings::testing::IndexedGetterInterface;
using cobalt::bindings::testing::InterfaceWithAny;
using cobalt::bindings::testing::InterfaceWithAnyDictionary;
using cobalt::bindings::testing::InterfaceWithDate;
using cobalt::bindings::testing::InterfaceWithUnsupportedProperties;
using cobalt::bindings::testing::NamedConstructorInterface;
using cobalt::bindings::testing::NamedGetterInterface;
using cobalt::bindings::testing::NamedIndexedGetterInterface;
using cobalt::bindings::testing::NestedPutForwardsInterface;
using cobalt::bindings::testing::NoConstructorInterface;
using cobalt::bindings::testing::NoInterfaceObjectInterface;
using cobalt::bindings::testing::NullableTypesTestInterface;
using cobalt::bindings::testing::NumericTypesTestInterface;
using cobalt::bindings::testing::ObjectTypeBindingsInterface;
using cobalt::bindings::testing::OperationsTestInterface;
using cobalt::bindings::testing::PromiseInterface;
using cobalt::bindings::testing::PutForwardsInterface;
using cobalt::bindings::testing::SequenceUser;
using cobalt::bindings::testing::SingleOperationInterface;
using cobalt::bindings::testing::StaticPropertiesInterface;
using cobalt::bindings::testing::StringifierAnonymousOperationInterface;
using cobalt::bindings::testing::StringifierAttributeInterface;
using cobalt::bindings::testing::StringifierOperationInterface;
using cobalt::bindings::testing::TargetInterface;
using cobalt::bindings::testing::UnionTypesInterface;
using cobalt::bindings::testing::V8cAnonymousIndexedGetterInterface;
using cobalt::bindings::testing::V8cAnonymousNamedGetterInterface;
using cobalt::bindings::testing::V8cAnonymousNamedIndexedGetterInterface;
using cobalt::bindings::testing::V8cArbitraryInterface;
using cobalt::bindings::testing::V8cBaseInterface;
using cobalt::bindings::testing::V8cBooleanTypeTestInterface;
using cobalt::bindings::testing::V8cCallbackFunctionInterface;
using cobalt::bindings::testing::V8cCallbackInterfaceInterface;
#if defined(ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::V8cConditionalInterface;
#endif  // defined(ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::V8cConstantsInterface;
using cobalt::bindings::testing::V8cConstructorInterface;
using cobalt::bindings::testing::V8cConstructorWithArgumentsInterface;
using cobalt::bindings::testing::V8cConvertSimpleObjectInterface;
using cobalt::bindings::testing::V8cDOMStringTestInterface;
using cobalt::bindings::testing::V8cDerivedGetterSetterInterface;
using cobalt::bindings::testing::V8cDerivedInterface;
using cobalt::bindings::testing::V8cDictionaryInterface;
#if defined(NO_ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::V8cDisabledInterface;
#endif  // defined(NO_ENABLE_CONDITIONAL_INTERFACE)
using cobalt::bindings::testing::V8cEnumerationInterface;
using cobalt::bindings::testing::V8cExceptionObjectInterface;
using cobalt::bindings::testing::V8cExceptionsInterface;
using cobalt::bindings::testing::V8cExtendedIDLAttributesInterface;
using cobalt::bindings::testing::V8cGarbageCollectionTestInterface;
using cobalt::bindings::testing::V8cGlobalInterfaceParent;
using cobalt::bindings::testing::V8cImplementedInterface;
using cobalt::bindings::testing::V8cIndexedGetterInterface;
using cobalt::bindings::testing::V8cInterfaceWithAny;
using cobalt::bindings::testing::V8cInterfaceWithAnyDictionary;
using cobalt::bindings::testing::V8cInterfaceWithDate;
using cobalt::bindings::testing::V8cInterfaceWithUnsupportedProperties;
using cobalt::bindings::testing::V8cNamedConstructorInterface;
using cobalt::bindings::testing::V8cNamedGetterInterface;
using cobalt::bindings::testing::V8cNamedIndexedGetterInterface;
using cobalt::bindings::testing::V8cNestedPutForwardsInterface;
using cobalt::bindings::testing::V8cNoConstructorInterface;
using cobalt::bindings::testing::V8cNoInterfaceObjectInterface;
using cobalt::bindings::testing::V8cNullableTypesTestInterface;
using cobalt::bindings::testing::V8cNumericTypesTestInterface;
using cobalt::bindings::testing::V8cObjectTypeBindingsInterface;
using cobalt::bindings::testing::V8cOperationsTestInterface;
using cobalt::bindings::testing::V8cPromiseInterface;
using cobalt::bindings::testing::V8cPutForwardsInterface;
using cobalt::bindings::testing::V8cSequenceUser;
using cobalt::bindings::testing::V8cSingleOperationInterface;
using cobalt::bindings::testing::V8cStaticPropertiesInterface;
using cobalt::bindings::testing::V8cStringifierAnonymousOperationInterface;
using cobalt::bindings::testing::V8cStringifierAttributeInterface;
using cobalt::bindings::testing::V8cStringifierOperationInterface;
using cobalt::bindings::testing::V8cTargetInterface;
using cobalt::bindings::testing::V8cUnionTypesInterface;
using cobalt::bindings::testing::V8cWindow;
using cobalt::bindings::testing::Window;
using cobalt::script::CallbackInterfaceTraits;
using cobalt::script::GlobalEnvironment;
using cobalt::script::ScriptValue;
using cobalt::script::ValueHandle;
using cobalt::script::ValueHandle;
using cobalt::script::ValueHandleHolder;
using cobalt::script::Wrappable;

using cobalt::script::v8c::EntryScope;
using cobalt::script::v8c::EscapableEntryScope;
using cobalt::script::v8c::FromJSValue;
using cobalt::script::v8c::kConversionFlagClamped;
using cobalt::script::v8c::kConversionFlagNullable;
using cobalt::script::v8c::kConversionFlagObjectOnly;
using cobalt::script::v8c::kConversionFlagRestricted;
using cobalt::script::v8c::kConversionFlagTreatNullAsEmptyString;
using cobalt::script::v8c::kConversionFlagTreatUndefinedAsEmptyString;
using cobalt::script::v8c::kNoConversionFlags;
using cobalt::script::v8c::NewInternalString;
using cobalt::script::v8c::ToJSValue;
using cobalt::script::v8c::TypeTraits;
using cobalt::script::v8c::V8cExceptionState;
using cobalt::script::v8c::V8cGlobalEnvironment;
using cobalt::script::v8c::V8cPropertyEnumerator;
using cobalt::script::v8c::WrapperFactory;
using cobalt::script::v8c::WrapperPrivate;
}  // namespace

namespace cobalt {
namespace bindings {
namespace testing {


namespace {

const int kInterfaceUniqueId = 54;








void DummyConstructor(const v8::FunctionCallbackInfo<v8::Value>& info) {
  V8cExceptionState exception(info.GetIsolate());
  exception.SetSimpleException(
      script::kTypeError, "Window is not constructible.");
}



void windowPropertyAttributeGetter(
    const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();


  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();


  if (!exception_state.is_exception_set()) {
    ToJSValue(isolate,
              impl->window_property(),
              &result_value);
  }
  if (exception_state.is_exception_set()) {
    return;
  }
  info.GetReturnValue().Set(result_value);
}

void windowPropertyAttributeSetter(
    const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();
  v8::Local<v8::Value> v8_value = info[0];

  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();
  TypeTraits<std::string >::ConversionType value;
  FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
              &value);
  if (exception_state.is_exception_set()) {
    return;
  }

  impl->set_window_property(value);
  result_value = v8::Undefined(isolate);
  return;
}


void windowAttributeGetter(
    const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();


  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();


  if (!exception_state.is_exception_set()) {
    ToJSValue(isolate,
              impl->window(),
              &result_value);
  }
  if (exception_state.is_exception_set()) {
    return;
  }
  info.GetReturnValue().Set(result_value);
}



void onEventAttributeGetter(
    const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();


  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();


  if (!exception_state.is_exception_set()) {
    ToJSValue(isolate,
              impl->on_event(),
              &result_value);
  }
  if (exception_state.is_exception_set()) {
    return;
  }
  info.GetReturnValue().Set(result_value);
}

void onEventAttributeSetter(
    const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();
  v8::Local<v8::Value> v8_value = info[0];

  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();
  TypeTraits<::cobalt::script::CallbackInterfaceTraits<SingleOperationInterface > >::ConversionType value;
  FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
              &value);
  if (exception_state.is_exception_set()) {
    return;
  }

  impl->set_on_event(value);
  result_value = v8::Undefined(isolate);
  return;
}



void getStackTraceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();
  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();
  V8cGlobalEnvironment* callwith_global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);

  if (!exception_state.is_exception_set()) {
    ToJSValue(isolate,
              impl->GetStackTrace(callwith_global_environment->GetStackTrace()),
              &result_value);
  }
  if (!exception_state.is_exception_set()) {
    info.GetReturnValue().Set(result_value);
  }

}



void setTimeoutMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();
  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();
  const size_t kMinArguments = 1;
  if (info.Length() < kMinArguments) {
    exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
    return;
  }
  // Non-optional arguments
  TypeTraits<Window::TimerCallback >::ConversionType handler;
  // Optional arguments
  TypeTraits<int32_t >::ConversionType timeout;
  DCHECK_LT(0, info.Length());
  v8::Local<v8::Value> non_optional_value0 = info[0];
  FromJSValue(isolate,
              non_optional_value0,
              kNoConversionFlags,
              &exception_state, &handler);
  if (exception_state.is_exception_set()) {
    return;
  }
  size_t num_set_arguments = 1;
  if (info.Length() > 1) {
    v8::Local<v8::Value> optional_value0 = info[1];
    FromJSValue(isolate,
                optional_value0,
                kNoConversionFlags,
                &exception_state,
                &timeout);
    if (exception_state.is_exception_set()) {
      return;
    }
    ++num_set_arguments;
  }
  switch (num_set_arguments) {
    case 1:
      {
          if (!exception_state.is_exception_set()) {
            ToJSValue(isolate,
                      impl->SetTimeout(handler),
                      &result_value);
          }
          if (!exception_state.is_exception_set()) {
            info.GetReturnValue().Set(result_value);
          }
      }
      break;
    case 2:
      {
          if (!exception_state.is_exception_set()) {
            ToJSValue(isolate,
                      impl->SetTimeout(handler, timeout),
                      &result_value);
          }
          if (!exception_state.is_exception_set()) {
            info.GetReturnValue().Set(result_value);
          }
      }
      break;
    default:
      NOTREACHED();
      return;
  }
}



void windowOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Object> object = info.Holder();
  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
  if (!WrapperPrivate::HasWrapperPrivate(object) ||
      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
    V8cExceptionState exception(isolate);
    exception.SetSimpleException(script::kDoesNotImplementInterface);
    return;
  }
  V8cExceptionState exception_state{isolate};
  v8::Local<v8::Value> result_value;

  WrapperPrivate* wrapper_private =
      WrapperPrivate::GetFromWrapperObject(object);
  if (!wrapper_private) {
    NOTIMPLEMENTED();
    return;
  }
  Window* impl =
      wrapper_private->wrappable<Window>().get();

  impl->WindowOperation();
  result_value = v8::Undefined(isolate);

}



void InitializeTemplate(v8::Isolate* isolate) {
  // https://heycam.github.io/webidl/#interface-object
  // 3.6.1. Interface object
  //
  // The interface object for a given interface is a built-in function object.
  // It has properties that correspond to the constants and static operations
  // defined on that interface, as described in sections 3.6.6 Constants and
  // 3.6.8 Operations.
  //
  // If the interface is declared with a [Constructor] extended attribute,
  // then the interface object can be called as a constructor to create an
  // object that implements that interface. Calling that interface as a
  // function will throw an exception.
  //
  // Interface objects whose interfaces are not declared with a [Constructor]
  // extended attribute will throw when called, both as a function and as a
  // constructor.
  //
  // An interface object for a non-callback interface has an associated object
  // called the interface prototype object. This object has properties that
  // correspond to the regular attributes and regular operations defined on
  // the interface, and is described in more detail in 3.6.3 Interface
  // prototype object.
  v8::Local<v8::FunctionTemplate> function_template =
      v8::FunctionTemplate::New(
          isolate,
          DummyConstructor,
          v8::Local<v8::Value>(),
          v8::Local<v8::Signature>(),
          0);
  function_template->SetClassName(NewInternalString(isolate, "Window"));
  function_template->ReadOnlyPrototype();

  v8::Local<v8::ObjectTemplate> prototype_template = function_template->PrototypeTemplate();
  v8::Local<v8::ObjectTemplate> instance_template = function_template->InstanceTemplate();
  instance_template->SetInternalFieldCount(WrapperPrivate::kInternalFieldCount);

  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  global_environment->AddInterfaceData(kInterfaceUniqueId, function_template);

  {
    // An interface can be defined to inherit from another interface. If the
    // identifier of the interface is followed by a U+003A COLON (":") character
    // and an identifier, then that identifier identifies the inherited
    // interface. An object that implements an interface that inherits from
    // another also implements that inherited interface. The object therefore
    // will also have members that correspond to the interface members from the
    // inherited interface.
    v8::Local<v8::FunctionTemplate> parent_template = V8cGlobalInterfaceParent::GetTemplate(isolate);
    function_template->Inherit(parent_template);
    static_assert(
        std::is_base_of<GlobalInterfaceParent, Window>::value,
        "Expected Window to have C++ parent class "
        "GlobalInterfaceParent, because that is its WebIDL parent.");
  }

  // https://heycam.github.io/webidl/#es-constants
  // 3.6.6. Constants
  //
  // For each exposed constant defined on an interface A, there must be a
  // corresponding property. The property has the following characteristics:

  // https://heycam.github.io/webidl/#es-attributes
  // 3.6.7. Attributes
  //
  // For each exposed attribute of the interface there must exist a
  // corresponding property. The characteristics of this property are as
  // follows:
  {
    // The name of the property is the identifier of the attribute.
    v8::Local<v8::String> name = NewInternalString(
        isolate,
        "windowProperty");

    // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
    // true, [[Configurable]]: configurable }, where: configurable is false if
    // the attribute was declared with the [Unforgeable] extended attribute and
    // true otherwise;
    bool configurable = true;
    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
        configurable ? v8::None : v8::DontDelete);

    // G is the attribute getter created given the attribute, the interface, and
    // the relevant Realm of the object that is the location of the property;
    // and
    //
    // S is the attribute setter created given the attribute, the interface, and
    // the relevant Realm of the object that is the location of the property.
    v8::Local<v8::FunctionTemplate> getter =
        v8::FunctionTemplate::New(isolate, windowPropertyAttributeGetter);
    v8::Local<v8::FunctionTemplate> setter =
        v8::FunctionTemplate::New(isolate, windowPropertyAttributeSetter);

    // The location of the property is determined as follows:
    // Otherwise, if the attribute is unforgeable on the interface or if the
    // interface was declared with the [Global] extended attribute, then the
    // property exists on every object that implements the interface.
    instance_template->
        SetAccessorProperty(
            name,
            getter,
            setter,
            attributes);

  }
  {
    // The name of the property is the identifier of the attribute.
    v8::Local<v8::String> name = NewInternalString(
        isolate,
        "window");

    // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
    // true, [[Configurable]]: configurable }, where: configurable is false if
    // the attribute was declared with the [Unforgeable] extended attribute and
    // true otherwise;
    bool configurable = true;
    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
        configurable ? v8::None : v8::DontDelete);

    // G is the attribute getter created given the attribute, the interface, and
    // the relevant Realm of the object that is the location of the property;
    // and
    //
    // S is the attribute setter created given the attribute, the interface, and
    // the relevant Realm of the object that is the location of the property.
    v8::Local<v8::FunctionTemplate> getter =
        v8::FunctionTemplate::New(isolate, windowAttributeGetter);
    v8::Local<v8::FunctionTemplate> setter;

    // The location of the property is determined as follows:
    // Otherwise, if the attribute is unforgeable on the interface or if the
    // interface was declared with the [Global] extended attribute, then the
    // property exists on every object that implements the interface.
    instance_template->
        SetAccessorProperty(
            name,
            getter,
            setter,
            attributes);

  }
  {
    // The name of the property is the identifier of the attribute.
    v8::Local<v8::String> name = NewInternalString(
        isolate,
        "onEvent");

    // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
    // true, [[Configurable]]: configurable }, where: configurable is false if
    // the attribute was declared with the [Unforgeable] extended attribute and
    // true otherwise;
    bool configurable = true;
    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
        configurable ? v8::None : v8::DontDelete);

    // G is the attribute getter created given the attribute, the interface, and
    // the relevant Realm of the object that is the location of the property;
    // and
    //
    // S is the attribute setter created given the attribute, the interface, and
    // the relevant Realm of the object that is the location of the property.
    v8::Local<v8::FunctionTemplate> getter =
        v8::FunctionTemplate::New(isolate, onEventAttributeGetter);
    v8::Local<v8::FunctionTemplate> setter =
        v8::FunctionTemplate::New(isolate, onEventAttributeSetter);

    // The location of the property is determined as follows:
    // Otherwise, if the attribute is unforgeable on the interface or if the
    // interface was declared with the [Global] extended attribute, then the
    // property exists on every object that implements the interface.
    instance_template->
        SetAccessorProperty(
            name,
            getter,
            setter,
            attributes);

  }

  // https://heycam.github.io/webidl/#es-operations
  // 3.6.8. Operations
  //
  // For each unique identifier of an exposed operation defined on the
  // interface, there must exist a corresponding property, unless the effective
  // overload set for that identifier and operation and with an argument count
  // of 0 has no entries.
  //
  // The characteristics of this property are as follows:
  {
    // The name of the property is the identifier.
    v8::Local<v8::String> name = NewInternalString(
        isolate,
        "getStackTrace");

    // The property has attributes { [[Writable]]: B, [[Enumerable]]: true,
    // [[Configurable]]: B }, where B is false if the operation is unforgeable
    // on the interface, and true otherwise.
    bool B = true;
    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
        B ? v8::None : (v8::ReadOnly | v8::DontDelete));

    v8::Local<v8::FunctionTemplate> method_template =
        v8::FunctionTemplate::New(isolate, getStackTraceMethod);
    method_template->RemovePrototype();
    method_template->SetLength(0);

    // The location of the property is determined as follows:
    // Otherwise, if the operation is unforgeable on the interface or if the
    // interface was declared with the [Global] extended attribute, then the
    // property exists on every object that implements the interface.
    instance_template->
        Set(name, method_template);

    // The value of the property is the result of creating an operation function
    // given the operation, the interface, and the relevant Realm of the object
    // that is the location of the property.

    // Note: that is, even if an includes statement was used to make an
    // operation available on the interface, we pass in the interface which
    // includes the interface mixin, and not the interface mixin on which the
    // operation was originally declared.
  }
  {
    // The name of the property is the identifier.
    v8::Local<v8::String> name = NewInternalString(
        isolate,
        "setTimeout");

    // The property has attributes { [[Writable]]: B, [[Enumerable]]: true,
    // [[Configurable]]: B }, where B is false if the operation is unforgeable
    // on the interface, and true otherwise.
    bool B = true;
    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
        B ? v8::None : (v8::ReadOnly | v8::DontDelete));

    v8::Local<v8::FunctionTemplate> method_template =
        v8::FunctionTemplate::New(isolate, setTimeoutMethod);
    method_template->RemovePrototype();
    method_template->SetLength(1);

    // The location of the property is determined as follows:
    // Otherwise, if the operation is unforgeable on the interface or if the
    // interface was declared with the [Global] extended attribute, then the
    // property exists on every object that implements the interface.
    instance_template->
        Set(name, method_template);

    // The value of the property is the result of creating an operation function
    // given the operation, the interface, and the relevant Realm of the object
    // that is the location of the property.

    // Note: that is, even if an includes statement was used to make an
    // operation available on the interface, we pass in the interface which
    // includes the interface mixin, and not the interface mixin on which the
    // operation was originally declared.
  }
  {
    // The name of the property is the identifier.
    v8::Local<v8::String> name = NewInternalString(
        isolate,
        "windowOperation");

    // The property has attributes { [[Writable]]: B, [[Enumerable]]: true,
    // [[Configurable]]: B }, where B is false if the operation is unforgeable
    // on the interface, and true otherwise.
    bool B = true;
    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
        B ? v8::None : (v8::ReadOnly | v8::DontDelete));

    v8::Local<v8::FunctionTemplate> method_template =
        v8::FunctionTemplate::New(isolate, windowOperationMethod);
    method_template->RemovePrototype();
    method_template->SetLength(0);

    // The location of the property is determined as follows:
    // Otherwise, if the operation is unforgeable on the interface or if the
    // interface was declared with the [Global] extended attribute, then the
    // property exists on every object that implements the interface.
    instance_template->
        Set(name, method_template);

    // The value of the property is the result of creating an operation function
    // given the operation, the interface, and the relevant Realm of the object
    // that is the location of the property.

    // Note: that is, even if an includes statement was used to make an
    // operation available on the interface, we pass in the interface which
    // includes the interface mixin, and not the interface mixin on which the
    // operation was originally declared.
  }

  // https://heycam.github.io/webidl/#es-stringifier
  // 3.6.8.2. Stringifiers
  prototype_template->Set(
      v8::Symbol::GetToStringTag(isolate),
      NewInternalString(isolate, "Window"),
      static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontEnum));





}

}  // namespace


// The global interface is special.  Just give them the global object proxy.
v8::Local<v8::Object> V8cWindow::CreateWrapper(
    v8::Isolate* isolate, const scoped_refptr<Wrappable>&) {
  return isolate->GetCurrentContext()->Global();
}


v8::Local<v8::FunctionTemplate> V8cWindow::GetTemplate(v8::Isolate* isolate) {
  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
  if (!global_environment->HasInterfaceData(kInterfaceUniqueId)) {
    InitializeTemplate(isolate);
  }
  return global_environment->GetInterfaceData(kInterfaceUniqueId);
}


}  // namespace testing
}  // namespace bindings
}  // namespace cobalt


namespace cobalt {
namespace script {
namespace v8c {

template <typename GlobalInterface>
void V8cGlobalEnvironment::CreateGlobalObject(
    const scoped_refptr<GlobalInterface>& global_interface,
    EnvironmentSettings* environment_settings) {
  TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::CreateGlobalObject()");
  // Intentionally not an |EntryScope|, since the context doesn't exist yet.
  v8::Isolate::Scope isolate_scope(isolate_);
  v8::HandleScope handle_scope(isolate_);
  v8::Local<v8::ObjectTemplate> global_object_template = V8cWindow::GetTemplate(isolate_)->InstanceTemplate();

  v8::Local<v8::Context> context =
      v8::Context::New(isolate_, nullptr, global_object_template);
  context_.Reset(isolate_, context);
  v8::Context::Scope context_scope(context);

  global_wrappable_ = global_interface;

  DCHECK(!environment_settings_);
  DCHECK(environment_settings);
  environment_settings_ = environment_settings;
  EvaluateAutomatics();

  v8::Local<v8::Object> global_object = context->Global();
  new WrapperPrivate(isolate_, global_interface, global_object);

  auto actual_global_object = global_object->GetPrototype()->ToObject();
  new WrapperPrivate(isolate_, global_interface, actual_global_object);

  wrapper_factory_->RegisterWrappableType(
      AnonymousIndexedGetterInterface::AnonymousIndexedGetterInterfaceWrappableType(),
      base::Bind(V8cAnonymousIndexedGetterInterface::CreateWrapper),
      base::Bind(V8cAnonymousIndexedGetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      AnonymousNamedGetterInterface::AnonymousNamedGetterInterfaceWrappableType(),
      base::Bind(V8cAnonymousNamedGetterInterface::CreateWrapper),
      base::Bind(V8cAnonymousNamedGetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      AnonymousNamedIndexedGetterInterface::AnonymousNamedIndexedGetterInterfaceWrappableType(),
      base::Bind(V8cAnonymousNamedIndexedGetterInterface::CreateWrapper),
      base::Bind(V8cAnonymousNamedIndexedGetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ArbitraryInterface::ArbitraryInterfaceWrappableType(),
      base::Bind(V8cArbitraryInterface::CreateWrapper),
      base::Bind(V8cArbitraryInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      BaseInterface::BaseInterfaceWrappableType(),
      base::Bind(V8cBaseInterface::CreateWrapper),
      base::Bind(V8cBaseInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      BooleanTypeTestInterface::BooleanTypeTestInterfaceWrappableType(),
      base::Bind(V8cBooleanTypeTestInterface::CreateWrapper),
      base::Bind(V8cBooleanTypeTestInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      CallbackFunctionInterface::CallbackFunctionInterfaceWrappableType(),
      base::Bind(V8cCallbackFunctionInterface::CreateWrapper),
      base::Bind(V8cCallbackFunctionInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      CallbackInterfaceInterface::CallbackInterfaceInterfaceWrappableType(),
      base::Bind(V8cCallbackInterfaceInterface::CreateWrapper),
      base::Bind(V8cCallbackInterfaceInterface::GetTemplate));
#if defined(ENABLE_CONDITIONAL_INTERFACE)
  wrapper_factory_->RegisterWrappableType(
      ConditionalInterface::ConditionalInterfaceWrappableType(),
      base::Bind(V8cConditionalInterface::CreateWrapper),
      base::Bind(V8cConditionalInterface::GetTemplate));
#endif  // defined(ENABLE_CONDITIONAL_INTERFACE)
  wrapper_factory_->RegisterWrappableType(
      ConstantsInterface::ConstantsInterfaceWrappableType(),
      base::Bind(V8cConstantsInterface::CreateWrapper),
      base::Bind(V8cConstantsInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ConstructorInterface::ConstructorInterfaceWrappableType(),
      base::Bind(V8cConstructorInterface::CreateWrapper),
      base::Bind(V8cConstructorInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ConstructorWithArgumentsInterface::ConstructorWithArgumentsInterfaceWrappableType(),
      base::Bind(V8cConstructorWithArgumentsInterface::CreateWrapper),
      base::Bind(V8cConstructorWithArgumentsInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ConvertSimpleObjectInterface::ConvertSimpleObjectInterfaceWrappableType(),
      base::Bind(V8cConvertSimpleObjectInterface::CreateWrapper),
      base::Bind(V8cConvertSimpleObjectInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      DOMStringTestInterface::DOMStringTestInterfaceWrappableType(),
      base::Bind(V8cDOMStringTestInterface::CreateWrapper),
      base::Bind(V8cDOMStringTestInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      DerivedGetterSetterInterface::DerivedGetterSetterInterfaceWrappableType(),
      base::Bind(V8cDerivedGetterSetterInterface::CreateWrapper),
      base::Bind(V8cDerivedGetterSetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      DerivedInterface::DerivedInterfaceWrappableType(),
      base::Bind(V8cDerivedInterface::CreateWrapper),
      base::Bind(V8cDerivedInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      DictionaryInterface::DictionaryInterfaceWrappableType(),
      base::Bind(V8cDictionaryInterface::CreateWrapper),
      base::Bind(V8cDictionaryInterface::GetTemplate));
#if defined(NO_ENABLE_CONDITIONAL_INTERFACE)
  wrapper_factory_->RegisterWrappableType(
      DisabledInterface::DisabledInterfaceWrappableType(),
      base::Bind(V8cDisabledInterface::CreateWrapper),
      base::Bind(V8cDisabledInterface::GetTemplate));
#endif  // defined(NO_ENABLE_CONDITIONAL_INTERFACE)
  wrapper_factory_->RegisterWrappableType(
      EnumerationInterface::EnumerationInterfaceWrappableType(),
      base::Bind(V8cEnumerationInterface::CreateWrapper),
      base::Bind(V8cEnumerationInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ExceptionObjectInterface::ExceptionObjectInterfaceWrappableType(),
      base::Bind(V8cExceptionObjectInterface::CreateWrapper),
      base::Bind(V8cExceptionObjectInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ExceptionsInterface::ExceptionsInterfaceWrappableType(),
      base::Bind(V8cExceptionsInterface::CreateWrapper),
      base::Bind(V8cExceptionsInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ExtendedIDLAttributesInterface::ExtendedIDLAttributesInterfaceWrappableType(),
      base::Bind(V8cExtendedIDLAttributesInterface::CreateWrapper),
      base::Bind(V8cExtendedIDLAttributesInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      GarbageCollectionTestInterface::GarbageCollectionTestInterfaceWrappableType(),
      base::Bind(V8cGarbageCollectionTestInterface::CreateWrapper),
      base::Bind(V8cGarbageCollectionTestInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      GlobalInterfaceParent::GlobalInterfaceParentWrappableType(),
      base::Bind(V8cGlobalInterfaceParent::CreateWrapper),
      base::Bind(V8cGlobalInterfaceParent::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ImplementedInterface::ImplementedInterfaceWrappableType(),
      base::Bind(V8cImplementedInterface::CreateWrapper),
      base::Bind(V8cImplementedInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      IndexedGetterInterface::IndexedGetterInterfaceWrappableType(),
      base::Bind(V8cIndexedGetterInterface::CreateWrapper),
      base::Bind(V8cIndexedGetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      InterfaceWithAny::InterfaceWithAnyWrappableType(),
      base::Bind(V8cInterfaceWithAny::CreateWrapper),
      base::Bind(V8cInterfaceWithAny::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      InterfaceWithAnyDictionary::InterfaceWithAnyDictionaryWrappableType(),
      base::Bind(V8cInterfaceWithAnyDictionary::CreateWrapper),
      base::Bind(V8cInterfaceWithAnyDictionary::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      InterfaceWithDate::InterfaceWithDateWrappableType(),
      base::Bind(V8cInterfaceWithDate::CreateWrapper),
      base::Bind(V8cInterfaceWithDate::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      InterfaceWithUnsupportedProperties::InterfaceWithUnsupportedPropertiesWrappableType(),
      base::Bind(V8cInterfaceWithUnsupportedProperties::CreateWrapper),
      base::Bind(V8cInterfaceWithUnsupportedProperties::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NamedConstructorInterface::NamedConstructorInterfaceWrappableType(),
      base::Bind(V8cNamedConstructorInterface::CreateWrapper),
      base::Bind(V8cNamedConstructorInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NamedGetterInterface::NamedGetterInterfaceWrappableType(),
      base::Bind(V8cNamedGetterInterface::CreateWrapper),
      base::Bind(V8cNamedGetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NamedIndexedGetterInterface::NamedIndexedGetterInterfaceWrappableType(),
      base::Bind(V8cNamedIndexedGetterInterface::CreateWrapper),
      base::Bind(V8cNamedIndexedGetterInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NestedPutForwardsInterface::NestedPutForwardsInterfaceWrappableType(),
      base::Bind(V8cNestedPutForwardsInterface::CreateWrapper),
      base::Bind(V8cNestedPutForwardsInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NoConstructorInterface::NoConstructorInterfaceWrappableType(),
      base::Bind(V8cNoConstructorInterface::CreateWrapper),
      base::Bind(V8cNoConstructorInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NoInterfaceObjectInterface::NoInterfaceObjectInterfaceWrappableType(),
      base::Bind(V8cNoInterfaceObjectInterface::CreateWrapper),
      base::Bind(V8cNoInterfaceObjectInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NullableTypesTestInterface::NullableTypesTestInterfaceWrappableType(),
      base::Bind(V8cNullableTypesTestInterface::CreateWrapper),
      base::Bind(V8cNullableTypesTestInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      NumericTypesTestInterface::NumericTypesTestInterfaceWrappableType(),
      base::Bind(V8cNumericTypesTestInterface::CreateWrapper),
      base::Bind(V8cNumericTypesTestInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      ObjectTypeBindingsInterface::ObjectTypeBindingsInterfaceWrappableType(),
      base::Bind(V8cObjectTypeBindingsInterface::CreateWrapper),
      base::Bind(V8cObjectTypeBindingsInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      OperationsTestInterface::OperationsTestInterfaceWrappableType(),
      base::Bind(V8cOperationsTestInterface::CreateWrapper),
      base::Bind(V8cOperationsTestInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      PromiseInterface::PromiseInterfaceWrappableType(),
      base::Bind(V8cPromiseInterface::CreateWrapper),
      base::Bind(V8cPromiseInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      PutForwardsInterface::PutForwardsInterfaceWrappableType(),
      base::Bind(V8cPutForwardsInterface::CreateWrapper),
      base::Bind(V8cPutForwardsInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      SequenceUser::SequenceUserWrappableType(),
      base::Bind(V8cSequenceUser::CreateWrapper),
      base::Bind(V8cSequenceUser::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      StaticPropertiesInterface::StaticPropertiesInterfaceWrappableType(),
      base::Bind(V8cStaticPropertiesInterface::CreateWrapper),
      base::Bind(V8cStaticPropertiesInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      StringifierAnonymousOperationInterface::StringifierAnonymousOperationInterfaceWrappableType(),
      base::Bind(V8cStringifierAnonymousOperationInterface::CreateWrapper),
      base::Bind(V8cStringifierAnonymousOperationInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      StringifierAttributeInterface::StringifierAttributeInterfaceWrappableType(),
      base::Bind(V8cStringifierAttributeInterface::CreateWrapper),
      base::Bind(V8cStringifierAttributeInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      StringifierOperationInterface::StringifierOperationInterfaceWrappableType(),
      base::Bind(V8cStringifierOperationInterface::CreateWrapper),
      base::Bind(V8cStringifierOperationInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      TargetInterface::TargetInterfaceWrappableType(),
      base::Bind(V8cTargetInterface::CreateWrapper),
      base::Bind(V8cTargetInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      UnionTypesInterface::UnionTypesInterfaceWrappableType(),
      base::Bind(V8cUnionTypesInterface::CreateWrapper),
      base::Bind(V8cUnionTypesInterface::GetTemplate));
  wrapper_factory_->RegisterWrappableType(
      Window::WindowWrappableType(),
      base::Bind(V8cWindow::CreateWrapper),
      base::Bind(V8cWindow::GetTemplate));

}

}  // namespace v8c

template<>
void GlobalEnvironment::CreateGlobalObject<Window>(
    const scoped_refptr<Window>& global_interface,
    EnvironmentSettings* environment_settings) {
  base::polymorphic_downcast<v8c::V8cGlobalEnvironment*>(this)->CreateGlobalObject(global_interface, environment_settings);
}

}  // namespace script
}  // namespace cobalt


