Chromium Code Reviews| Index: Source/bindings/core/v8/V8DOMConfiguration.cpp |
| diff --git a/Source/bindings/core/v8/V8DOMConfiguration.cpp b/Source/bindings/core/v8/V8DOMConfiguration.cpp |
| index 7b1d16b80361887b20037e14d48a73a26635a10d..1bf44a6e0e10411fb1db6900a3bc07af7a9f58d5 100644 |
| --- a/Source/bindings/core/v8/V8DOMConfiguration.cpp |
| +++ b/Source/bindings/core/v8/V8DOMConfiguration.cpp |
| @@ -162,26 +162,31 @@ void installConstantInternal(v8::Isolate* isolate, v8::Local<v8::FunctionTemplat |
| prototypeTemplate->Set(constantName, value, attributes); |
| } |
| -void doInstallMethodInternal(v8::Local<v8::ObjectTemplate> target, v8::Local<v8::Name> name, v8::Local<v8::FunctionTemplate> functionTemplate, v8::PropertyAttribute attribute) |
| +template<class Configuration> |
| +void installMethodInternal(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const Configuration& method, const DOMWrapperWorld& world) |
| { |
| - target->Set(name, functionTemplate, attribute); |
| -} |
| - |
| -void doInstallMethodInternal(v8::Local<v8::FunctionTemplate> target, v8::Local<v8::Name> name, v8::Local<v8::FunctionTemplate> functionTemplate, v8::PropertyAttribute attribute) |
| -{ |
| - target->Set(name, functionTemplate, attribute); |
| -} |
| - |
| -template<class ObjectOrTemplate, class Configuration> |
| -void installMethodInternal(v8::Isolate* isolate, v8::Local<ObjectOrTemplate> objectOrTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const Configuration& callback, const DOMWrapperWorld& world) |
| -{ |
| - if (callback.exposeConfiguration == V8DOMConfiguration::OnlyExposedToPrivateScript |
| + if (method.exposeConfiguration == V8DOMConfiguration::OnlyExposedToPrivateScript |
| && !world.isPrivateScriptIsolatedWorld()) |
| return; |
| - v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New(isolate, callback.callbackForWorld(world), v8Undefined(), signature, callback.length); |
| - functionTemplate->RemovePrototype(); |
| - doInstallMethodInternal(objectOrTemplate, callback.methodName(isolate), functionTemplate, attribute); |
| + v8::Local<v8::Name> name = method.methodName(isolate); |
| + v8::FunctionCallback callback = method.callbackForWorld(world); |
| + |
| + ASSERT(method.propertyLocationConfiguration); |
| + if (method.propertyLocationConfiguration & |
| + (V8DOMConfiguration::OnInstance | V8DOMConfiguration::OnPrototype)) { |
| + v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New(isolate, callback, v8::Local<v8::Value>(), signature, method.length); |
| + functionTemplate->RemovePrototype(); |
| + if (method.propertyLocationConfiguration & V8DOMConfiguration::OnInstance) |
| + instanceTemplate->Set(name, functionTemplate, attribute); |
| + if (method.propertyLocationConfiguration & V8DOMConfiguration::OnPrototype) |
| + prototypeTemplate->Set(name, functionTemplate, attribute); |
| + } |
| + if (method.propertyLocationConfiguration & V8DOMConfiguration::OnInterface) { |
| + v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New(isolate, callback, v8::Local<v8::Value>(), v8::Local<v8::Signature>(), method.length); |
|
haraken
2015/09/08 08:37:11
Just to confirm: You're intentionally using an emp
Yuki
2015/09/08 08:49:46
Yes.
Empty signature means that any object can ca
haraken
2015/09/08 08:57:13
Thanks, maybe worth adding a comment :)
Yuki
2015/09/08 09:49:24
Added comments.
|
| + functionTemplate->RemovePrototype(); |
| + interfaceTemplate->Set(name, functionTemplate, attribute); |
| + } |
| } |
| } // namespace |
| @@ -238,35 +243,29 @@ void V8DOMConfiguration::installConstantWithGetter(v8::Isolate* isolate, v8::Loc |
| prototypeTemplate->SetNativeDataProperty(constantName, getter, 0, v8::Local<v8::Value>(), attributes); |
| } |
| -void V8DOMConfiguration::installMethods(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration* callbacks, size_t callbackCount) |
| -{ |
| - const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
| - for (size_t i = 0; i < callbackCount; ++i) |
| - installMethodInternal(isolate, prototypeTemplate, signature, attribute, callbacks[i], world); |
| -} |
| - |
| -void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> functionDescriptor, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration& callback) |
| +void V8DOMConfiguration::installMethods(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration* methods, size_t methodCount) |
| { |
| const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
| - installMethodInternal(isolate, functionDescriptor, signature, attribute, callback, world); |
| + for (size_t i = 0; i < methodCount; ++i) |
| + installMethodInternal(isolate, instanceTemplate, prototypeTemplate, interfaceTemplate, signature, attribute, methods[i], world); |
| } |
| -void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration& callback) |
| +void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration& method) |
| { |
| const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
| - installMethodInternal(isolate, prototypeTemplate, signature, attribute, callback, world); |
| + installMethodInternal(isolate, instanceTemplate, prototypeTemplate, interfaceTemplate, signature, attribute, method, world); |
| } |
| -void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const SymbolKeyedMethodConfiguration& callback) |
| +void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::Signature> signature, v8::PropertyAttribute attribute, const SymbolKeyedMethodConfiguration& method) |
| { |
| const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
| - installMethodInternal(isolate, prototypeTemplate, signature, attribute, callback, world); |
| + installMethodInternal(isolate, v8::Local<v8::ObjectTemplate>(), prototypeTemplate, v8::Local<v8::FunctionTemplate>(), signature, attribute, method, world); |
| } |
| v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> functionDescriptor, const char* interfaceName, v8::Local<v8::FunctionTemplate> parentClass, size_t fieldCount, |
| const AttributeConfiguration* attributes, size_t attributeCount, |
| const AccessorConfiguration* accessors, size_t accessorCount, |
| - const MethodConfiguration* callbacks, size_t callbackCount) |
| + const MethodConfiguration* methods, size_t methodCount) |
| { |
| functionDescriptor->SetClassName(v8AtomicString(isolate, interfaceName)); |
| v8::Local<v8::ObjectTemplate> instanceTemplate = functionDescriptor->InstanceTemplate(); |
| @@ -285,8 +284,8 @@ v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Isolate |
| installAttributes(isolate, instanceTemplate, prototypeTemplate, attributes, attributeCount); |
| if (accessorCount) |
| installAccessors(isolate, instanceTemplate, prototypeTemplate, functionDescriptor, defaultSignature, accessors, accessorCount); |
| - if (callbackCount) |
| - installMethods(isolate, prototypeTemplate, defaultSignature, static_cast<v8::PropertyAttribute>(v8::None), callbacks, callbackCount); |
| + if (methodCount) |
| + installMethods(isolate, instanceTemplate, prototypeTemplate, functionDescriptor, defaultSignature, static_cast<v8::PropertyAttribute>(v8::None), methods, methodCount); |
| return defaultSignature; |
| } |