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

// This file has been auto-generated by {{code_generator}}. DO NOT MODIFY!

#include "sky/engine/config.h"
#include "{{v8_class}}.h"

{% for filename in cpp_includes if filename != '%s.h' % v8_class %}
#include "{{filename}}"
{% endfor %}

namespace blink {

{{cpp_class}}* {{v8_class}}::toNative(v8::Isolate* isolate, v8::Handle<v8::Value> v8Value)
{
    {{cpp_class}}* impl = {{cpp_class}}::create();
    // FIXME: Do not use Dictionary and DictionaryHelper
    // https://crbug.com/321462
    Dictionary dictionary(v8Value, isolate);
    {% for member in members %}
    {{member.cpp_type}} {{member.name}};
    if (DictionaryHelper::get(dictionary, "{{member.name}}", {{member.name}}))
        impl->{{member.setter_name}}({{member.name}});
    {% endfor %}
    return impl;
}

v8::Handle<v8::Value> toV8({{cpp_class}}* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
{
    v8::Handle<v8::Object> v8Object = v8::Object::New(isolate);
    {% for member in members %}
    if (impl->{{member.has_method_name}}())
        v8Object->Set(v8String(isolate, "{{member.name}}"), {{member.cpp_value_to_v8_value}});
    {% if member.v8_default_value %}
    else
        v8Object->Set(v8String(isolate, "{{member.name}}"), {{member.v8_default_value}});
    {% endif %}
    {% endfor %}
    return v8Object;
}

} // namespace blink
