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

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

Issue 23797002: Hack to add accessors for WebIDL attributes. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 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/v8/V8DOMConfiguration.h ('k') | Source/core/dom/Document.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/v8/V8DOMConfiguration.cpp
diff --git a/Source/bindings/v8/V8DOMConfiguration.cpp b/Source/bindings/v8/V8DOMConfiguration.cpp
index 986c4554be2a39a15867a971ead1e8a7e91a4be5..8bfd235c478a22d0a6542f9c8130635771803092 100644
--- a/Source/bindings/v8/V8DOMConfiguration.cpp
+++ b/Source/bindings/v8/V8DOMConfiguration.cpp
@@ -39,6 +39,33 @@ void V8DOMConfiguration::installAttributes(v8::Handle<v8::ObjectTemplate> instan
installAttribute(instance, prototype, attributes[i], isolate, currentWorldType);
}
+void V8DOMConfiguration::installAccessors(v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const AccessorConfiguration* accessors, size_t accessorCount, v8::Isolate* isolate, WrapperWorldType currentWorldType)
+{
+ for (size_t i = 0; i < accessorCount; ++i) {
+ v8::FunctionCallback getterCallback = accessors[i].getter;
+ v8::FunctionCallback setterCallback = accessors[i].setter;
+ if (currentWorldType == MainWorld) {
+ 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(getterCallback, v8::External::New(accessors[i].data), signature, 0);
+ getter->RemovePrototype();
+ }
+ v8::Local<v8::FunctionTemplate> setter;
+ if (setterCallback) {
+ setter = v8::FunctionTemplate::New(setterCallback, v8::External::New(accessors[i].data), signature, 1);
+ setter->RemovePrototype();
+ }
+
+ prototype->SetAccessorProperty(v8::String::NewSymbol(accessors[i].name), getter, setter, accessors[i].attribute, accessors[i].settings);
+ }
+}
+
void V8DOMConfiguration::installConstants(v8::Handle<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, const ConstantConfiguration* constants, size_t constantCount, v8::Isolate* isolate)
{
for (size_t i = 0; i < constantCount; ++i) {
@@ -60,8 +87,11 @@ void V8DOMConfiguration::installCallbacks(v8::Handle<v8::ObjectTemplate> prototy
}
}
-v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Handle<v8::FunctionTemplate> functionDescriptor, const char* interfaceName, v8::Handle<v8::FunctionTemplate> parentClass,
- size_t fieldCount, const AttributeConfiguration* attributes, size_t attributeCount, const MethodConfiguration* callbacks, size_t callbackCount, v8::Isolate* isolate, WrapperWorldType currentWorldType)
+v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Handle<v8::FunctionTemplate> functionDescriptor, const char* interfaceName, v8::Handle<v8::FunctionTemplate> parentClass, size_t fieldCount,
+ const AttributeConfiguration* attributes, size_t attributeCount,
+ const AccessorConfiguration* accessors, size_t accessorCount,
+ const MethodConfiguration* callbacks, size_t callbackCount,
+ v8::Isolate* isolate, WrapperWorldType currentWorldType)
{
functionDescriptor->SetClassName(v8::String::NewSymbol(interfaceName));
v8::Local<v8::ObjectTemplate> instance = functionDescriptor->InstanceTemplate();
@@ -75,9 +105,11 @@ v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Handle<
prototype->SetInternalFieldCount(v8PrototypeInternalFieldcount);
}
+ v8::Local<v8::Signature> defaultSignature = v8::Signature::New(functionDescriptor);
if (attributeCount)
installAttributes(instance, functionDescriptor->PrototypeTemplate(), attributes, attributeCount, isolate, currentWorldType);
- v8::Local<v8::Signature> defaultSignature = v8::Signature::New(functionDescriptor);
+ if (accessorCount)
+ installAccessors(functionDescriptor->PrototypeTemplate(), defaultSignature, accessors, accessorCount, isolate, currentWorldType);
if (callbackCount)
installCallbacks(functionDescriptor->PrototypeTemplate(), defaultSignature, static_cast<v8::PropertyAttribute>(v8::DontDelete), callbacks, callbackCount, isolate, currentWorldType);
return defaultSignature;
« no previous file with comments | « Source/bindings/v8/V8DOMConfiguration.h ('k') | Source/core/dom/Document.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698