| Index: Source/bindings/templates/constructors.cpp
|
| diff --git a/Source/bindings/templates/constructors.cpp b/Source/bindings/templates/constructors.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3bac1163ef797e764432465861e6a2fde2eb17b8
|
| --- /dev/null
|
| +++ b/Source/bindings/templates/constructors.cpp
|
| @@ -0,0 +1,189 @@
|
| +{% from 'macros.cpp' import deprecation_notification, feature_observation, parameters_check with context %}
|
| +
|
| +{##############################################################################}
|
| +{% macro make_constructors() %}
|
| +{% if has_named_constructor %}
|
| +{% elif has_constructor %}
|
| +{% for constructor in constructors %}
|
| +{{normal_constructor(constructor)}}
|
| +{% endfor %}
|
| +{% elif is_constructor_template_of_event %}
|
| +{{constructor_template_of_event()}}
|
| +{% elif is_constructor_template_of_typed_array %}
|
| +{% endif %}
|
| +{% endmacro %}
|
| +
|
| +
|
| +{##############################################################################}
|
| +{% macro normal_constructor(constructor) %}
|
| +{# FIXME: check name #}
|
| +static void constructor{{constructor.overloaded_index_string}}(const v8::FunctionCallbackInfo<v8::Value>& args)
|
| +{
|
| +{% if constructor.overloaded_index == 0 and constructor.mandatory_parameters %}
|
| + if (args.Length() < {{constructor.mandatory_parameters}}) {
|
| + throwNotEnoughArgumentsError(args.GetIsolate());
|
| + return;
|
| + }
|
| +{% endif %}
|
| +{% if constructor_raises_exception %}
|
| + ExceptionState es(args.GetIsolate());
|
| +{% endif %}
|
| +{{parameters_check(constructor)}}
|
| +{% if constructor_call_with == 'ScriptExecutionContext' %}
|
| + ScriptExecutionContext* context = getScriptExecutionContext();
|
| +{% endif %}
|
| + RefPtr<{{cpp_class_name}}> impl = {{cpp_class_name}}::create({{constructor.argument_string}});
|
| + v8::Handle<v8::Object> wrapper = args.Holder();
|
| +{% if constructor_raises_exception %}
|
| + if (es.throwIfNeeded())
|
| + return;
|
| +{% endif %}
|
| +
|
| + V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(impl.release(), &{{v8_class_name}}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
|
| + args.GetReturnValue().Set(wrapper);
|
| +}
|
| +{% endmacro %}
|
| +
|
| +
|
| +{##############################################################################}
|
| +{% macro constructor_template_of_event() %}
|
| +{# FIXME: check name #}
|
| +static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args)
|
| +{
|
| + if (args.Length() < 1) {
|
| + throwNotEnoughArgumentsError(args.GetIsolate());
|
| + return;
|
| + }
|
| +
|
| + V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, type, args[0]);
|
| +{% for attribute in attributes %}
|
| +{% if attribute.type == 'any' %}
|
| + v8::Local<v8::Value> {{attribute.name}};
|
| +{% endif %}
|
| +{% endfor %}
|
| + {{cpp_class_name}}Init eventInit;
|
| + if (args.Length() >= 2) {
|
| + V8TRYCATCH_VOID(Dictionary, options, Dictionary(args[1], args.GetIsolate()));
|
| + if (!fill{{cpp_class_name}}Init(eventInit, options))
|
| + return;
|
| +{% for attribute in attributes %}
|
| +{% if attribute.type == 'any' %}
|
| + options.get("{{attribute.name}}", {{attribute.name}});
|
| + if (!{{attribute.name}}.IsEmpty())
|
| + args.Holder()->SetHiddenValue(V8HiddenPropertyName::{{attribute.name}}(), {{attribute.name}});
|
| +{% endif %}
|
| +{% endfor %}
|
| + }
|
| +
|
| + RefPtr<{{cpp_class_name}}> event = {{cpp_class_name}}::create(type, eventInit);
|
| +{% if number_of_any_attributes %}
|
| +{# If we're in an isolated world, create a SerializedScriptValue and store it in the event for
|
| + # later cloning if the property is accessed from another world.
|
| + # The main world case is handled lazily (in Custom code). #}
|
| + if (isolatedWorldForIsolate(args.GetIsolate())) {
|
| +{% for attribute in attributes %}
|
| +{% if attribute.type == 'any' %}
|
| + if (!{{attribute.name}}.IsEmpty())
|
| + event->{{attribute.setter}}(SerializedScriptValue::createAndSwallowExceptions({{attribute.name}}, args.GetIsolate()));
|
| +{% endif %}
|
| +{% endfor %}
|
| + }
|
| +
|
| +{% endif %}
|
| + v8::Handle<v8::Object> wrapper = args.Holder();
|
| + V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(event.release(), &{{v8_class_name}}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
|
| + v8SetReturnValue(args, wrapper);
|
| +}{% endmacro %}
|
| +
|
| +
|
| +{##############################################################################}
|
| +{% macro more_constructor_stuff() %}
|
| +{# FIXME: check name #}
|
| +{% if has_named_constructor %}
|
| +{## working #}
|
| +WrapperTypeInfo {{v8_class_name}}Constructor::info = { {{v8_class_name}}Constructor::GetTemplate, {{v8_class_name}}::derefObject, {{to_active_dom_object}}, {{to_event_target}}, 0, {{v8_class_name}}::installPerContextPrototypeProperties, 0, WrapperTypeObjectPrototype };
|
| +
|
| +static void {{v8_class_name}}ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>& args)
|
| +{
|
| +{{feature_observation(measure_as) -}}
|
| +{{deprecation_notification(deprecate_as)}} if (!args.IsConstructCall()) {
|
| + throwTypeError("DOM object constructor cannot be called as a function.", args.GetIsolate());
|
| + return;
|
| + }
|
| +
|
| + if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) {
|
| + args.GetReturnValue().Set(args.Holder());
|
| + return;
|
| + }
|
| +
|
| + Document* document = currentDocument();
|
| +
|
| + // Make sure the document is added to the DOM Node map. Otherwise, the {{cpp_class_name}} instance
|
| + // may end up being the only node in the map and get garbage-collected prematurely.
|
| + toV8(document, args.Holder(), args.GetIsolate());
|
| +
|
| +{{parameters_check(named_constructor)}}
|
| +{% if constructor_raises_exception %}
|
| + ExceptionCode ec = 0;
|
| +{% endif %}
|
| + RefPtr<{{cpp_class_name}}> impl = {{cpp_class_name}}::createForJSConstructor({{named_constructor.argument_string}});
|
| + v8::Handle<v8::Object> wrapper = args.Holder();
|
| +{% if constructor_raises_exception %}
|
| + if (ec) {
|
| + setDOMException(ec, args.GetIsolate());
|
| + return;
|
| + }
|
| +{% endif %}
|
| +
|
| + V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(impl.release(), &{{v8_class_name}}Constructor::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
|
| + args.GetReturnValue().Set(wrapper);
|
| +}
|
| +
|
| +v8::Handle<v8::FunctionTemplate> {{v8_class_name}}Constructor::GetTemplate(v8::Isolate* isolate, WrapperWorldType currentWorldType)
|
| +{
|
| + // This is only for getting a unique pointer which we can pass to privateTemplate.
|
| + static const char* privateTemplateUniqueKey = "{{v8_class_name}}Constructor::GetTemplatePrivateTemplate";
|
| + V8PerIsolateData* data = V8PerIsolateData::from(isolate);
|
| + v8::Handle<v8::FunctionTemplate> result = data->privateTemplateIfExists(currentWorldType, &privateTemplateUniqueKey);
|
| + if (!result.IsEmpty())
|
| + return result;
|
| +
|
| + TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate");
|
| + v8::HandleScope scope(isolate);
|
| + result = v8::FunctionTemplate::New({{v8_class_name}}ConstructorCallback);
|
| +
|
| + v8::Local<v8::ObjectTemplate> instance = result->InstanceTemplate();
|
| + instance->SetInternalFieldCount({{v8_class_name}}::internalFieldCount);
|
| + result->SetClassName(v8::String::NewSymbol("{{cpp_class_name}}"));
|
| + result->Inherit({{v8_class_name}}::GetTemplate(isolate, currentWorldType));
|
| + data->setPrivateTemplate(currentWorldType, &privateTemplateUniqueKey, result);
|
| +
|
| + return scope.Close(result);
|
| +}
|
| +
|
| +{% endif %}
|
| +{% endmacro %}
|
| +
|
| +
|
| +{##############################################################################}
|
| +{% macro constructor_callback() %}
|
| +void {{v8_class_name}}::constructorCallback(const v8::FunctionCallbackInfo<v8::Value>& args)
|
| +{
|
| + TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "DOMConstructor");{{feature_observation(measure_as)}}{{deprecation_notification(deprecate_as)}}
|
| + if (!args.IsConstructCall()) {
|
| + throwTypeError("DOM object constructor cannot be called as a function.", args.GetIsolate());
|
| + return;
|
| + }
|
| +
|
| + if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) {
|
| + args.GetReturnValue().Set(args.Holder());
|
| + return;
|
| + }
|
| +
|
| +{% if has_custom_constructor %}
|
| + {{v8_class_name}}::constructorCustom(args);
|
| +{% else %}
|
| + {{cpp_class_name}}V8Internal::constructor(args);
|
| +{% endif %}
|
| +}
|
| +{% endmacro %}
|
|
|