Index: third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl |
diff --git a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl |
index ffa4afa9179079dbec49bd01ee3957dc7a2e9b0f..d9bcc4b8917b73b1a8958f58bf585d90a008f5e6 100644 |
--- a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl |
+++ b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl |
@@ -554,6 +554,41 @@ v8::Local<v8::FunctionTemplate> {{v8_class}}Constructor::domTemplate(v8::Isolate |
return result; |
} |
+void {{v8_class}}Constructor::NamedConstructorAttributeGetter( |
+ v8::Local<v8::Name> propertyName, |
+ const v8::PropertyCallbackInfo<v8::Value>& info) { |
+ ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ConstructionContext, "{{interface_name}}"); |
Yuki
2017/01/19 09:57:28
I think this should be ExceptionState::GetterConte
Yuki
2017/01/19 10:09:30
And the interface name should be "Window" instead
sashab
2017/01/20 04:37:05
Hard-coded window, added propertyName argument and
|
+ v8::Local<v8::Value> data = info.Data(); |
+ DCHECK(data->IsExternal()); |
+ V8PerContextData* perContextData = |
+ V8PerContextData::from(info.Holder()->CreationContext()); |
+ if (!perContextData) |
+ return; |
+ |
+ v8::Local<v8::Function> namedConstructorInterface = perContextData->constructorForType(WrapperTypeInfo::unwrap(data)); |
Yuki
2017/01/19 09:57:28
Exactly speaking, this is a "named constructor" an
Yuki
2017/01/19 09:57:28
Now this function is specific to {{v8_class}} and
sashab
2017/01/20 04:37:05
Done the name change, and removed use of data :)
|
+ v8::Local<v8::Function> interface = perContextData->constructorForType(&{{v8_class}}::wrapperTypeInfo); |
+ |
+ // Set the prototype of named constructors to the regular constructor. |
+ v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
+ auto privateProperty = V8PrivateProperty::getNamedConstructorInitialized(info.GetIsolate()); |
+ v8::Local<v8::Value> privateValue = privateProperty.get(context, namedConstructorInterface); |
+ if (privateValue.IsEmpty()) { |
+ v8::MaybeLocal<v8::Value> interfacePrototype = interface->Get(context, v8AtomicString(info.GetIsolate(), "prototype")); |
+ if (interfacePrototype.IsEmpty()) |
+ exceptionState.throwTypeError("Could not get prototype for {{v8_class}}."); |
Yuki
2017/01/19 09:57:28
Please return immediately right after throwing an
sashab
2017/01/20 04:37:05
Done
|
+ |
+ v8::Maybe<bool> setResult = namedConstructorInterface->Set(context, v8AtomicString(info.GetIsolate(), "prototype"), interfacePrototype.ToLocalChecked()); |
+ if (setResult.IsNothing() || setResult.ToChecked() != true) { |
+ exceptionState.throwTypeError("Could not set prototype for {{interface_name}}."); |
Yuki
2017/01/19 09:57:28
Please return immediately after throwing an except
sashab
2017/01/20 04:37:05
Yes, done.
|
+ } |
+ |
+ privateProperty.set(context, namedConstructorInterface, v8::True(info.GetIsolate())); |
+ } |
+ |
+ v8SetReturnValue( |
+ info, perContextData->constructorForType(WrapperTypeInfo::unwrap(data))); |
Yuki
2017/01/19 09:57:28
|namedConstructorInterface| is what you'd like to
sashab
2017/01/20 04:37:05
Ahh of course, thank you. Done.
|
+} |
+ |
{% endif %} |
{% endblock %} |