OLD | NEW |
(Empty) | |
| 1 {% from 'macros.cpp' import deprecation_notification, feature_observation, param
eters_check with context %} |
| 2 |
| 3 {##############################################################################} |
| 4 {% macro make_constructors() %} |
| 5 {% if has_named_constructor %} |
| 6 {% elif has_constructor %} |
| 7 {% for constructor in constructors %} |
| 8 {{normal_constructor(constructor)}} |
| 9 {% endfor %} |
| 10 {% elif is_constructor_template_of_event %} |
| 11 {{constructor_template_of_event()}} |
| 12 {% elif is_constructor_template_of_typed_array %} |
| 13 {% endif %} |
| 14 {% endmacro %} |
| 15 |
| 16 |
| 17 {##############################################################################} |
| 18 {% macro normal_constructor(constructor) %} |
| 19 {# FIXME: check name #} |
| 20 static void constructor{{constructor.overloaded_index_string}}(const v8::Functio
nCallbackInfo<v8::Value>& args) |
| 21 { |
| 22 {% if constructor.overloaded_index == 0 and constructor.mandatory_parameters %} |
| 23 if (args.Length() < {{constructor.mandatory_parameters}}) { |
| 24 throwNotEnoughArgumentsError(args.GetIsolate()); |
| 25 return; |
| 26 } |
| 27 {% endif %} |
| 28 {% if constructor_raises_exception %} |
| 29 ExceptionState es(args.GetIsolate()); |
| 30 {% endif %} |
| 31 {{parameters_check(constructor)}} |
| 32 {% if constructor_call_with == 'ScriptExecutionContext' %} |
| 33 ScriptExecutionContext* context = getScriptExecutionContext(); |
| 34 {% endif %} |
| 35 RefPtr<{{cpp_class_name}}> impl = {{cpp_class_name}}::create({{constructor.a
rgument_string}}); |
| 36 v8::Handle<v8::Object> wrapper = args.Holder(); |
| 37 {% if constructor_raises_exception %} |
| 38 if (es.throwIfNeeded()) |
| 39 return; |
| 40 {% endif %} |
| 41 |
| 42 V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(impl.release(),
&{{v8_class_name}}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Depe
ndent); |
| 43 args.GetReturnValue().Set(wrapper); |
| 44 } |
| 45 {% endmacro %} |
| 46 |
| 47 |
| 48 {##############################################################################} |
| 49 {% macro constructor_template_of_event() %} |
| 50 {# FIXME: check name #} |
| 51 static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args) |
| 52 { |
| 53 if (args.Length() < 1) { |
| 54 throwNotEnoughArgumentsError(args.GetIsolate()); |
| 55 return; |
| 56 } |
| 57 |
| 58 V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, type, args[0]); |
| 59 {% for attribute in attributes %} |
| 60 {% if attribute.type == 'any' %} |
| 61 v8::Local<v8::Value> {{attribute.name}}; |
| 62 {% endif %} |
| 63 {% endfor %} |
| 64 {{cpp_class_name}}Init eventInit; |
| 65 if (args.Length() >= 2) { |
| 66 V8TRYCATCH_VOID(Dictionary, options, Dictionary(args[1], args.GetIsolate
())); |
| 67 if (!fill{{cpp_class_name}}Init(eventInit, options)) |
| 68 return; |
| 69 {% for attribute in attributes %} |
| 70 {% if attribute.type == 'any' %} |
| 71 options.get("{{attribute.name}}", {{attribute.name}}); |
| 72 if (!{{attribute.name}}.IsEmpty()) |
| 73 args.Holder()->SetHiddenValue(V8HiddenPropertyName::{{attribute.name
}}(), {{attribute.name}}); |
| 74 {% endif %} |
| 75 {% endfor %} |
| 76 } |
| 77 |
| 78 RefPtr<{{cpp_class_name}}> event = {{cpp_class_name}}::create(type, eventIni
t); |
| 79 {% if number_of_any_attributes %} |
| 80 {# If we're in an isolated world, create a SerializedScriptValue and store it in
the event for |
| 81 # later cloning if the property is accessed from another world. |
| 82 # The main world case is handled lazily (in Custom code). #} |
| 83 if (isolatedWorldForIsolate(args.GetIsolate())) { |
| 84 {% for attribute in attributes %} |
| 85 {% if attribute.type == 'any' %} |
| 86 if (!{{attribute.name}}.IsEmpty()) |
| 87 event->{{attribute.setter}}(SerializedScriptValue::createAndSwallowE
xceptions({{attribute.name}}, args.GetIsolate())); |
| 88 {% endif %} |
| 89 {% endfor %} |
| 90 } |
| 91 |
| 92 {% endif %} |
| 93 v8::Handle<v8::Object> wrapper = args.Holder(); |
| 94 V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(event.release(),
&{{v8_class_name}}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dep
endent); |
| 95 v8SetReturnValue(args, wrapper); |
| 96 }{% endmacro %} |
| 97 |
| 98 |
| 99 {##############################################################################} |
| 100 {% macro more_constructor_stuff() %} |
| 101 {# FIXME: check name #} |
| 102 {% if has_named_constructor %} |
| 103 {## working #} |
| 104 WrapperTypeInfo {{v8_class_name}}Constructor::info = { {{v8_class_name}}Construc
tor::GetTemplate, {{v8_class_name}}::derefObject, {{to_active_dom_object}}, {{to
_event_target}}, 0, {{v8_class_name}}::installPerContextPrototypeProperties, 0,
WrapperTypeObjectPrototype }; |
| 105 |
| 106 static void {{v8_class_name}}ConstructorCallback(const v8::FunctionCallbackInfo<
v8::Value>& args) |
| 107 { |
| 108 {{feature_observation(measure_as) -}} |
| 109 {{deprecation_notification(deprecate_as)}} if (!args.IsConstructCall()) { |
| 110 throwTypeError("DOM object constructor cannot be called as a function.",
args.GetIsolate()); |
| 111 return; |
| 112 } |
| 113 |
| 114 if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) { |
| 115 args.GetReturnValue().Set(args.Holder()); |
| 116 return; |
| 117 } |
| 118 |
| 119 Document* document = currentDocument(); |
| 120 |
| 121 // Make sure the document is added to the DOM Node map. Otherwise, the {{cpp
_class_name}} instance |
| 122 // may end up being the only node in the map and get garbage-collected prema
turely. |
| 123 toV8(document, args.Holder(), args.GetIsolate()); |
| 124 |
| 125 {{parameters_check(named_constructor)}} |
| 126 {% if constructor_raises_exception %} |
| 127 ExceptionCode ec = 0; |
| 128 {% endif %} |
| 129 RefPtr<{{cpp_class_name}}> impl = {{cpp_class_name}}::createForJSConstructor
({{named_constructor.argument_string}}); |
| 130 v8::Handle<v8::Object> wrapper = args.Holder(); |
| 131 {% if constructor_raises_exception %} |
| 132 if (ec) { |
| 133 setDOMException(ec, args.GetIsolate()); |
| 134 return; |
| 135 } |
| 136 {% endif %} |
| 137 |
| 138 V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(impl.release(),
&{{v8_class_name}}Constructor::info, wrapper, args.GetIsolate(), WrapperConfigur
ation::Dependent); |
| 139 args.GetReturnValue().Set(wrapper); |
| 140 } |
| 141 |
| 142 v8::Handle<v8::FunctionTemplate> {{v8_class_name}}Constructor::GetTemplate(v8::I
solate* isolate, WrapperWorldType currentWorldType) |
| 143 { |
| 144 // This is only for getting a unique pointer which we can pass to privateTem
plate. |
| 145 static const char* privateTemplateUniqueKey = "{{v8_class_name}}Constructor:
:GetTemplatePrivateTemplate"; |
| 146 V8PerIsolateData* data = V8PerIsolateData::from(isolate); |
| 147 v8::Handle<v8::FunctionTemplate> result = data->privateTemplateIfExists(curr
entWorldType, &privateTemplateUniqueKey); |
| 148 if (!result.IsEmpty()) |
| 149 return result; |
| 150 |
| 151 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate"); |
| 152 v8::HandleScope scope(isolate); |
| 153 result = v8::FunctionTemplate::New({{v8_class_name}}ConstructorCallback); |
| 154 |
| 155 v8::Local<v8::ObjectTemplate> instance = result->InstanceTemplate(); |
| 156 instance->SetInternalFieldCount({{v8_class_name}}::internalFieldCount); |
| 157 result->SetClassName(v8::String::NewSymbol("{{cpp_class_name}}")); |
| 158 result->Inherit({{v8_class_name}}::GetTemplate(isolate, currentWorldType)); |
| 159 data->setPrivateTemplate(currentWorldType, &privateTemplateUniqueKey, result
); |
| 160 |
| 161 return scope.Close(result); |
| 162 } |
| 163 |
| 164 {% endif %} |
| 165 {% endmacro %} |
| 166 |
| 167 |
| 168 {##############################################################################} |
| 169 {% macro constructor_callback() %} |
| 170 void {{v8_class_name}}::constructorCallback(const v8::FunctionCallbackInfo<v8::V
alue>& args) |
| 171 { |
| 172 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "DOMConstructor");{{feature_obser
vation(measure_as)}}{{deprecation_notification(deprecate_as)}} |
| 173 if (!args.IsConstructCall()) { |
| 174 throwTypeError("DOM object constructor cannot be called as a function.",
args.GetIsolate()); |
| 175 return; |
| 176 } |
| 177 |
| 178 if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) { |
| 179 args.GetReturnValue().Set(args.Holder()); |
| 180 return; |
| 181 } |
| 182 |
| 183 {% if has_custom_constructor %} |
| 184 {{v8_class_name}}::constructorCustom(args); |
| 185 {% else %} |
| 186 {{cpp_class_name}}V8Internal::constructor(args); |
| 187 {% endif %} |
| 188 } |
| 189 {% endmacro %} |
OLD | NEW |