Index: Source/bindings/core/v8/V8DOMConfiguration.cpp |
diff --git a/Source/bindings/core/v8/V8DOMConfiguration.cpp b/Source/bindings/core/v8/V8DOMConfiguration.cpp |
index 775d9340d5edb3dc42d5e52a844fd7121737f33b..4f67cb6ac1364bb62026d0728f5abab9298cc2de 100644 |
--- a/Source/bindings/core/v8/V8DOMConfiguration.cpp |
+++ b/Source/bindings/core/v8/V8DOMConfiguration.cpp |
@@ -34,100 +34,196 @@ |
namespace blink { |
+namespace { |
+ |
+template<class ObjectOrTemplate> |
+void installAttributeInternal(v8::Isolate* isolate, v8::Handle<ObjectOrTemplate> instanceTemplate, v8::Handle<ObjectOrTemplate> prototype, const V8DOMConfiguration::AttributeConfiguration& attribute, const DOMWrapperWorld& world) |
+{ |
+ if (attribute.exposeConfiguration == V8DOMConfiguration::OnlyExposedToPrivateScript |
+ && !world.isPrivateScriptIsolatedWorld()) |
+ return; |
+ |
+ v8::AccessorGetterCallback getter = attribute.getter; |
+ v8::AccessorSetterCallback setter = attribute.setter; |
+ if (world.isMainWorld()) { |
+ if (attribute.getterForMainWorld) |
+ getter = attribute.getterForMainWorld; |
+ if (attribute.setterForMainWorld) |
+ setter = attribute.setterForMainWorld; |
+ } |
+ v8::Handle<ObjectOrTemplate> target = |
+ attribute.instanceOrPrototypeConfiguration == V8DOMConfiguration::OnPrototype ? |
+ prototype : |
+ instanceTemplate; |
+ target->SetAccessor( |
+ v8AtomicString(isolate, attribute.name), |
+ getter, |
+ setter, |
+ v8::External::New(isolate, const_cast<WrapperTypeInfo*>(attribute.data)), |
+ attribute.settings, |
+ attribute.attribute); |
+} |
+ |
+void installAccessorInternal(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const V8DOMConfiguration::AccessorConfiguration& accessor, const DOMWrapperWorld& world) |
+{ |
+ if (accessor.exposeConfiguration == V8DOMConfiguration::OnlyExposedToPrivateScript |
+ && !world.isPrivateScriptIsolatedWorld()) |
+ return; |
+ |
+ v8::FunctionCallback getterCallback = accessor.getter; |
+ v8::FunctionCallback setterCallback = accessor.setter; |
+ if (world.isMainWorld()) { |
+ if (accessor.getterForMainWorld) |
+ getterCallback = accessor.getterForMainWorld; |
+ if (accessor.setterForMainWorld) |
+ setterCallback = accessor.setterForMainWorld; |
+ } |
+ v8::Local<v8::FunctionTemplate> getter; |
+ if (getterCallback) { |
+ getter = v8::FunctionTemplate::New(isolate, getterCallback, v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessor.data)), signature, 0); |
+ getter->RemovePrototype(); |
+ } |
+ v8::Local<v8::FunctionTemplate> setter; |
+ if (setterCallback) { |
+ setter = v8::FunctionTemplate::New(isolate, setterCallback, v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessor.data)), signature, 1); |
+ setter->RemovePrototype(); |
+ } |
+ prototype->SetAccessorProperty( |
+ v8AtomicString(isolate, accessor.name), |
+ getter, |
+ setter, |
+ accessor.attribute, |
+ accessor.settings); |
+} |
+ |
+void installConstantInternal(v8::Isolate* isolate, v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, const V8DOMConfiguration::ConstantConfiguration& constant) |
+{ |
+ v8::Handle<v8::String> constantName = v8AtomicString(isolate, constant.name); |
+ v8::PropertyAttribute attributes = |
+ static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete); |
+ v8::Handle<v8::Primitive> value; |
+ switch (constant.type) { |
+ case V8DOMConfiguration::ConstantTypeShort: |
+ case V8DOMConfiguration::ConstantTypeLong: |
+ case V8DOMConfiguration::ConstantTypeUnsignedShort: |
+ value = v8::Integer::New(isolate, constant.ivalue); |
+ break; |
+ case V8DOMConfiguration::ConstantTypeUnsignedLong: |
+ value = v8::Integer::NewFromUnsigned(isolate, constant.ivalue); |
+ break; |
+ case V8DOMConfiguration::ConstantTypeFloat: |
+ case V8DOMConfiguration::ConstantTypeDouble: |
+ value = v8::Number::New(isolate, constant.dvalue); |
+ break; |
+ case V8DOMConfiguration::ConstantTypeString: |
+ value = v8::String::NewFromUtf8(isolate, constant.svalue); |
+ break; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ } |
+ functionDescriptor->Set(constantName, value, attributes); |
+ prototype->Set(constantName, value, attributes); |
+} |
+ |
+void doInstallMethodInternal(v8::Handle<v8::ObjectTemplate> target, v8::Handle<v8::Name> name, v8::Handle<v8::FunctionTemplate> functionTemplate, v8::PropertyAttribute attribute) |
+{ |
+ target->Set(name, functionTemplate, attribute); |
+} |
+ |
+void doInstallMethodInternal(v8::Handle<v8::FunctionTemplate> target, v8::Handle<v8::Name> name, v8::Handle<v8::FunctionTemplate> functionTemplate, v8::PropertyAttribute attribute) |
+{ |
+ target->Set(name, functionTemplate, attribute); |
+} |
+ |
+template<class ObjectOrTemplate, class Configuration> |
+void installMethodInternal(v8::Isolate* isolate, v8::Handle<ObjectOrTemplate> objectOrTemplate, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attribute, const Configuration& callback, const DOMWrapperWorld& world) |
+{ |
+ if (callback.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); |
+} |
+ |
+} // namespace |
+ |
void V8DOMConfiguration::installAttributes(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> instanceTemplate, v8::Handle<v8::ObjectTemplate> prototype, const AttributeConfiguration* attributes, size_t attributeCount) |
{ |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
for (size_t i = 0; i < attributeCount; ++i) |
- installAttribute(instanceTemplate, prototype, attributes[i], isolate); |
+ installAttributeInternal(isolate, instanceTemplate, prototype, attributes[i], world); |
+} |
+ |
+void V8DOMConfiguration::installAttribute(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> instanceTemplate, v8::Handle<v8::ObjectTemplate> prototype, const AttributeConfiguration& attribute) |
+{ |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ installAttributeInternal(isolate, instanceTemplate, prototype, attribute, world); |
+} |
+ |
+void V8DOMConfiguration::installAttribute(v8::Isolate* isolate, v8::Handle<v8::Object> instanceTemplate, v8::Handle<v8::Object> prototype, const AttributeConfiguration& attribute) |
+{ |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ installAttributeInternal(isolate, instanceTemplate, prototype, attribute, world); |
} |
void V8DOMConfiguration::installAccessors(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const AccessorConfiguration* accessors, size_t accessorCount) |
{ |
- DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
- for (size_t i = 0; i < accessorCount; ++i) { |
- if (accessors[i].exposeConfiguration == OnlyExposedToPrivateScript && !world.isPrivateScriptIsolatedWorld()) |
- continue; |
- |
- v8::FunctionCallback getterCallback = accessors[i].getter; |
- v8::FunctionCallback setterCallback = accessors[i].setter; |
- if (world.isMainWorld()) { |
- if (accessors[i].getterForMainWorld) |
- getterCallback = accessors[i].getterForMainWorld; |
- if (accessors[i].setterForMainWorld) |
- setterCallback = accessors[i].setterForMainWorld; |
- } |
- |
- v8::Local<v8::FunctionTemplate> getter; |
- if (getterCallback) { |
- getter = v8::FunctionTemplate::New(isolate, getterCallback, v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessors[i].data)), signature, 0); |
- getter->RemovePrototype(); |
- } |
- v8::Local<v8::FunctionTemplate> setter; |
- if (setterCallback) { |
- setter = v8::FunctionTemplate::New(isolate, setterCallback, v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessors[i].data)), signature, 1); |
- setter->RemovePrototype(); |
- } |
- prototype->SetAccessorProperty(v8AtomicString(isolate, accessors[i].name), getter, setter, accessors[i].attribute, accessors[i].settings); |
- } |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ for (size_t i = 0; i < accessorCount; ++i) |
+ installAccessorInternal(isolate, prototype, signature, accessors[i], world); |
} |
-// Constant installation |
-// |
-// installConstants() is be used for simple constants. It installs constants |
-// using v8::Template::Set(), which results in a property that is much faster to |
-// access from scripts. |
-// installConstant() is used when some C++ code needs to be executed when the |
-// constant is accessed, e.g. to handle deprecation or measuring usage. The |
-// property appears the same to scripts, but is slower to access. |
+void V8DOMConfiguration::installAccessor(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const AccessorConfiguration& accessor) |
+{ |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ installAccessorInternal(isolate, prototype, signature, accessor, world); |
+} |
void V8DOMConfiguration::installConstants(v8::Isolate* isolate, v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, const ConstantConfiguration* constants, size_t constantCount) |
{ |
- for (size_t i = 0; i < constantCount; ++i) { |
- const ConstantConfiguration* constant = &constants[i]; |
- v8::Handle<v8::String> constantName = v8AtomicString(isolate, constant->name); |
- switch (constant->type) { |
- case ConstantTypeShort: |
- case ConstantTypeLong: |
- case ConstantTypeUnsignedShort: |
- functionDescriptor->Set(constantName, v8::Integer::New(isolate, constant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- prototype->Set(constantName, v8::Integer::New(isolate, constant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- break; |
- case ConstantTypeUnsignedLong: |
- functionDescriptor->Set(constantName, v8::Integer::NewFromUnsigned(isolate, constant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- prototype->Set(constantName, v8::Integer::NewFromUnsigned(isolate, constant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- break; |
- case ConstantTypeFloat: |
- case ConstantTypeDouble: |
- functionDescriptor->Set(constantName, v8::Number::New(isolate, constant->dvalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- prototype->Set(constantName, v8::Number::New(isolate, constant->dvalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- break; |
- case ConstantTypeString: |
- functionDescriptor->Set(constantName, v8::String::NewFromUtf8(isolate, constant->svalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- prototype->Set(constantName, v8::String::NewFromUtf8(isolate, constant->svalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- } |
- } |
+ for (size_t i = 0; i < constantCount; ++i) |
+ installConstantInternal(isolate, functionDescriptor, prototype, constants[i]); |
+} |
+ |
+void V8DOMConfiguration::installConstant(v8::Isolate* isolate, v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, const ConstantConfiguration& constant) |
+{ |
+ installConstantInternal(isolate, functionDescriptor, prototype, constant); |
} |
-void V8DOMConfiguration::installConstant(v8::Isolate* isolate, v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, const char* name, v8::AccessorGetterCallback getter) |
+void V8DOMConfiguration::installConstantWithGetter(v8::Isolate* isolate, v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, const char* name, v8::AccessorGetterCallback getter) |
{ |
v8::Handle<v8::String> constantName = v8AtomicString(isolate, name); |
- functionDescriptor->SetNativeDataProperty(constantName, getter, 0, v8::Handle<v8::Value>(), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
- prototype->SetNativeDataProperty(constantName, getter, 0, v8::Handle<v8::Value>(), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
+ v8::PropertyAttribute attributes = |
+ static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete); |
+ functionDescriptor->SetNativeDataProperty(constantName, getter, 0, v8::Handle<v8::Value>(), attributes); |
+ prototype->SetNativeDataProperty(constantName, getter, 0, v8::Handle<v8::Value>(), attributes); |
} |
-void V8DOMConfiguration::installMethods(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attributes, const MethodConfiguration* callbacks, size_t callbackCount) |
+void V8DOMConfiguration::installMethods(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<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) |
- installMethod(prototype, signature, attributes, callbacks[i], isolate); |
+ installMethodInternal(isolate, prototype, signature, attribute, callbacks[i], world); |
} |
-v8::Handle<v8::FunctionTemplate> V8DOMConfiguration::functionTemplateForCallback(v8::Isolate* isolate, v8::Handle<v8::Signature> signature, v8::FunctionCallback callback, int length) |
+void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration& callback) |
{ |
- v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New(isolate, callback, v8Undefined(), signature, length); |
- functionTemplate->RemovePrototype(); |
- return functionTemplate; |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ installMethodInternal(isolate, functionDescriptor, signature, attribute, callback, world); |
+} |
+ |
+void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attribute, const MethodConfiguration& callback) |
+{ |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ installMethodInternal(isolate, prototype, signature, attribute, callback, world); |
+} |
+ |
+void V8DOMConfiguration::installMethod(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attribute, const SymbolKeyedMethodConfiguration& callback) |
+{ |
+ const DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); |
+ installMethodInternal(isolate, prototype, signature, attribute, callback, world); |
} |
v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> functionDescriptor, const char* interfaceName, v8::Handle<v8::FunctionTemplate> parentClass, size_t fieldCount, |