Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Unified Diff: Source/bindings/core/v8/V8DOMConfiguration.cpp

Issue 922233002: bindings: Makes runtime-enabled attributes on prototype chains compilable. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Addressed review comments. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/core/v8/V8DOMConfiguration.h ('k') | Source/bindings/templates/constants.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « Source/bindings/core/v8/V8DOMConfiguration.h ('k') | Source/bindings/templates/constants.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698