Index: Source/bindings/templates/interface.cpp |
diff --git a/Source/bindings/templates/interface.cpp b/Source/bindings/templates/interface.cpp |
index 5894565abbf1e40edcc3dc18d7bfc34b2827a7ca..6363f8b0b52d271e93e3a49f5f5c26f641a18f0a 100644 |
--- a/Source/bindings/templates/interface.cpp |
+++ b/Source/bindings/templates/interface.cpp |
@@ -474,7 +474,7 @@ static void {{cpp_class}}OriginSafeMethodSetterCallback(v8::Local<v8::Name> name |
{% if named_constructor %} |
{% set to_active_dom_object = '%s::toActiveDOMObject' % v8_class |
if is_active_dom_object else '0' %} |
-const WrapperTypeInfo {{v8_class}}Constructor::wrapperTypeInfo = { gin::kEmbedderBlink, {{v8_class}}Constructor::domTemplate, {{v8_class}}::refObject, {{v8_class}}::derefObject, {{v8_class}}::trace, {{to_active_dom_object}}, 0, {{v8_class}}::installConditionallyEnabledMethods, {{v8_class}}::installConditionallyEnabledProperties, "{{interface_name}}", 0, WrapperTypeInfo::WrapperTypeObjectPrototype, WrapperTypeInfo::{{wrapper_class_id}}, WrapperTypeInfo::{{event_target_inheritance}}, WrapperTypeInfo::{{lifetime}}, WrapperTypeInfo::{{gc_type}} }; |
+const WrapperTypeInfo {{v8_class}}Constructor::wrapperTypeInfo = { gin::kEmbedderBlink, {{v8_class}}Constructor::domTemplate, {{v8_class}}::refObject, {{v8_class}}::derefObject, {{v8_class}}::trace, {{to_active_dom_object}}, 0, {{v8_class}}::preparePrototypeObject, {{v8_class}}::installConditionallyEnabledProperties, "{{interface_name}}", 0, WrapperTypeInfo::WrapperTypeObjectPrototype, WrapperTypeInfo::{{wrapper_class_id}}, WrapperTypeInfo::{{event_target_inheritance}}, WrapperTypeInfo::{{lifetime}}, WrapperTypeInfo::{{gc_type}} }; |
{{generate_constructor(named_constructor)}} |
v8::Local<v8::FunctionTemplate> {{v8_class}}Constructor::domTemplate(v8::Isolate* isolate) |
@@ -926,6 +926,40 @@ void {{v8_class}}::installConditionallyEnabledProperties(v8::Local<v8::Object> i |
{##############################################################################} |
+{% block prepare_prototype_object %} |
+{% from 'methods.cpp' import install_conditionally_enabled_methods with context %} |
+{% if unscopeables or conditionally_enabled_methods %} |
+void {{v8_class}}::preparePrototypeObject(v8::Isolate* isolate, v8::Local<v8::Object> prototypeObject) |
+{ |
+{% if unscopeables %} |
+ {{install_unscopeables() | indent}} |
+{% endif %} |
+{% if conditionally_enabled_methods %} |
+ {{install_conditionally_enabled_methods() | indent}} |
+{% endif %} |
+} |
+ |
+{% endif %} |
+{% endblock %} |
+ |
+ |
+{##############################################################################} |
+{% macro install_unscopeables() %} |
+v8::Local<v8::Context> v8Context(prototypeObject->CreationContext()); |
+v8::Local<v8::Name> unscopablesSymbol(v8::Symbol::GetUnscopables(isolate)); |
+v8::Local<v8::Object> unscopeables; |
+if (v8CallBoolean(prototypeObject->HasOwnProperty(v8Context, unscopablesSymbol))) |
+ unscopeables = prototypeObject->Get(v8Context, unscopablesSymbol).ToLocalChecked().As<v8::Object>(); |
+else |
+ unscopeables = v8::Object::New(isolate); |
+{% for name in unscopeables %} |
+unscopeables->ForceSet(v8Context, v8AtomicString(isolate, "{{name}}"), v8::True(isolate)).FromJust(); |
+{% endfor %} |
+prototypeObject->ForceSet(v8Context, unscopablesSymbol, unscopeables).FromJust(); |
+{% endmacro %} |
+ |
+ |
+{##############################################################################} |
{% block to_active_dom_object %} |
{% if is_active_dom_object %} |
ActiveDOMObject* {{v8_class}}::toActiveDOMObject(v8::Local<v8::Object> wrapper) |
@@ -1000,11 +1034,11 @@ void {{v8_class}}::derefObject(ScriptWrappable* scriptWrappable) |
{% if has_partial_interface %} |
InstallTemplateFunction {{v8_class}}::install{{v8_class}}TemplateFunction = (InstallTemplateFunction)&{{v8_class}}::install{{v8_class}}Template; |
-void {{v8_class}}::updateWrapperTypeInfo(InstallTemplateFunction installTemplateFunction, InstallConditionallyEnabledMethodsFunction installConditionallyEnabledMethodsFunction) |
+void {{v8_class}}::updateWrapperTypeInfo(InstallTemplateFunction installTemplateFunction, PreparePrototypeObjectFunction preparePrototypeObjectFunction) |
{ |
{{v8_class}}::install{{v8_class}}TemplateFunction = installTemplateFunction; |
- if (installConditionallyEnabledMethodsFunction) |
- {{v8_class}}::wrapperTypeInfo.installConditionallyEnabledMethodsFunction = installConditionallyEnabledMethodsFunction; |
+ if (preparePrototypeObjectFunction) |
+ {{v8_class}}::wrapperTypeInfo.preparePrototypeObjectFunction = preparePrototypeObjectFunction; |
} |
{% for method in methods if method.overloads and method.overloads.has_partial_overloads %} |