Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 */ | 27 */ |
| 28 | 28 |
| 29 #include "config.h" | 29 #include "config.h" |
| 30 #include "bindings/core/v8/V8DOMConfiguration.h" | 30 #include "bindings/core/v8/V8DOMConfiguration.h" |
| 31 | 31 |
| 32 #include "bindings/core/v8/V8ObjectConstructor.h" | 32 #include "bindings/core/v8/V8ObjectConstructor.h" |
| 33 #include "platform/TraceEvent.h" | 33 #include "platform/TraceEvent.h" |
| 34 | 34 |
| 35 namespace blink { | 35 namespace blink { |
| 36 | 36 |
| 37 void V8DOMConfiguration::installAttributes(v8::Isolate* isolate, v8::Handle<v8:: ObjectTemplate> instanceTemplate, v8::Handle<v8::ObjectTemplate> prototype, cons t AttributeConfiguration* attributes, size_t attributeCount) | |
| 38 { | |
| 39 for (size_t i = 0; i < attributeCount; ++i) | |
| 40 installAttribute(instanceTemplate, prototype, attributes[i], isolate); | |
| 41 } | |
| 42 | |
| 43 void V8DOMConfiguration::installAccessors(v8::Isolate* isolate, v8::Handle<v8::O bjectTemplate> prototype, v8::Handle<v8::Signature> signature, const AccessorCon figuration* accessors, size_t accessorCount) | |
| 44 { | |
| 45 DOMWrapperWorld& world = DOMWrapperWorld::current(isolate); | |
| 46 for (size_t i = 0; i < accessorCount; ++i) { | |
| 47 if (accessors[i].exposeConfiguration == OnlyExposedToPrivateScript && !w orld.isPrivateScriptIsolatedWorld()) | |
| 48 continue; | |
| 49 | |
| 50 v8::FunctionCallback getterCallback = accessors[i].getter; | |
| 51 v8::FunctionCallback setterCallback = accessors[i].setter; | |
| 52 if (world.isMainWorld()) { | |
| 53 if (accessors[i].getterForMainWorld) | |
| 54 getterCallback = accessors[i].getterForMainWorld; | |
| 55 if (accessors[i].setterForMainWorld) | |
| 56 setterCallback = accessors[i].setterForMainWorld; | |
| 57 } | |
| 58 | |
| 59 v8::Local<v8::FunctionTemplate> getter; | |
| 60 if (getterCallback) { | |
| 61 getter = v8::FunctionTemplate::New(isolate, getterCallback, v8::Exte rnal::New(isolate, const_cast<WrapperTypeInfo*>(accessors[i].data)), signature, 0); | |
| 62 getter->RemovePrototype(); | |
| 63 } | |
| 64 v8::Local<v8::FunctionTemplate> setter; | |
| 65 if (setterCallback) { | |
| 66 setter = v8::FunctionTemplate::New(isolate, setterCallback, v8::Exte rnal::New(isolate, const_cast<WrapperTypeInfo*>(accessors[i].data)), signature, 1); | |
| 67 setter->RemovePrototype(); | |
| 68 } | |
| 69 prototype->SetAccessorProperty(v8AtomicString(isolate, accessors[i].name ), getter, setter, accessors[i].attribute, accessors[i].settings); | |
| 70 } | |
| 71 } | |
| 72 | |
| 73 // Constant installation | |
|
haraken
2015/02/16 13:23:20
Can we keep this comment?
Yuki
2015/02/16 15:02:05
Done.
| |
| 74 // | |
| 75 // installConstants() is be used for simple constants. It installs constants | |
| 76 // using v8::Template::Set(), which results in a property that is much faster to | |
| 77 // access from scripts. | |
| 78 // installConstant() is used when some C++ code needs to be executed when the | |
| 79 // constant is accessed, e.g. to handle deprecation or measuring usage. The | |
| 80 // property appears the same to scripts, but is slower to access. | |
| 81 | |
| 82 void V8DOMConfiguration::installConstants(v8::Isolate* isolate, v8::Handle<v8::F unctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, c onst ConstantConfiguration* constants, size_t constantCount) | |
| 83 { | |
| 84 for (size_t i = 0; i < constantCount; ++i) { | |
| 85 const ConstantConfiguration* constant = &constants[i]; | |
| 86 v8::Handle<v8::String> constantName = v8AtomicString(isolate, constant-> name); | |
| 87 switch (constant->type) { | |
| 88 case ConstantTypeShort: | |
| 89 case ConstantTypeLong: | |
| 90 case ConstantTypeUnsignedShort: | |
| 91 functionDescriptor->Set(constantName, v8::Integer::New(isolate, cons tant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete) ); | |
| 92 prototype->Set(constantName, v8::Integer::New(isolate, constant->iva lue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); | |
| 93 break; | |
| 94 case ConstantTypeUnsignedLong: | |
| 95 functionDescriptor->Set(constantName, v8::Integer::NewFromUnsigned(i solate, constant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8: :DontDelete)); | |
| 96 prototype->Set(constantName, v8::Integer::NewFromUnsigned(isolate, c onstant->ivalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDele te)); | |
| 97 break; | |
| 98 case ConstantTypeFloat: | |
| 99 case ConstantTypeDouble: | |
| 100 functionDescriptor->Set(constantName, v8::Number::New(isolate, const ant->dvalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)) ; | |
| 101 prototype->Set(constantName, v8::Number::New(isolate, constant->dval ue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); | |
| 102 break; | |
| 103 case ConstantTypeString: | |
| 104 functionDescriptor->Set(constantName, v8::String::NewFromUtf8(isolat e, constant->svalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::Dont Delete)); | |
| 105 prototype->Set(constantName, v8::String::NewFromUtf8(isolate, consta nt->svalue), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); | |
| 106 break; | |
| 107 default: | |
| 108 ASSERT_NOT_REACHED(); | |
| 109 } | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 void V8DOMConfiguration::installConstant(v8::Isolate* isolate, v8::Handle<v8::Fu nctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> prototype, co nst char* name, v8::AccessorGetterCallback getter) | |
| 114 { | |
| 115 v8::Handle<v8::String> constantName = v8AtomicString(isolate, name); | |
| 116 functionDescriptor->SetNativeDataProperty(constantName, getter, 0, v8::Handl e<v8::Value>(), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete )); | |
| 117 prototype->SetNativeDataProperty(constantName, getter, 0, v8::Handle<v8::Val ue>(), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); | |
| 118 } | |
| 119 | |
| 120 void V8DOMConfiguration::installMethods(v8::Isolate* isolate, v8::Handle<v8::Obj ectTemplate> prototype, v8::Handle<v8::Signature> signature, v8::PropertyAttribu te attributes, const MethodConfiguration* callbacks, size_t callbackCount) | |
| 121 { | |
| 122 for (size_t i = 0; i < callbackCount; ++i) | |
| 123 installMethod(prototype, signature, attributes, callbacks[i], isolate); | |
| 124 } | |
| 125 | |
| 126 v8::Handle<v8::FunctionTemplate> V8DOMConfiguration::functionTemplateForCallback (v8::Isolate* isolate, v8::Handle<v8::Signature> signature, v8::FunctionCallback callback, int length) | |
| 127 { | |
| 128 v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New (isolate, callback, v8Undefined(), signature, length); | |
| 129 functionTemplate->RemovePrototype(); | |
| 130 return functionTemplate; | |
| 131 } | |
| 132 | |
| 133 v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Isolate * isolate, v8::Local<v8::FunctionTemplate> functionDescriptor, const char* inter faceName, v8::Handle<v8::FunctionTemplate> parentClass, size_t fieldCount, | 37 v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Isolate * isolate, v8::Local<v8::FunctionTemplate> functionDescriptor, const char* inter faceName, v8::Handle<v8::FunctionTemplate> parentClass, size_t fieldCount, |
| 134 const AttributeConfiguration* attributes, size_t attributeCount, | 38 const AttributeConfiguration* attributes, size_t attributeCount, |
| 135 const AccessorConfiguration* accessors, size_t accessorCount, | 39 const AccessorConfiguration* accessors, size_t accessorCount, |
| 136 const MethodConfiguration* callbacks, size_t callbackCount) | 40 const MethodConfiguration* callbacks, size_t callbackCount) |
| 137 { | 41 { |
| 138 functionDescriptor->SetClassName(v8AtomicString(isolate, interfaceName)); | 42 functionDescriptor->SetClassName(v8AtomicString(isolate, interfaceName)); |
| 139 v8::Local<v8::ObjectTemplate> instanceTemplate = functionDescriptor->Instanc eTemplate(); | 43 v8::Local<v8::ObjectTemplate> instanceTemplate = functionDescriptor->Instanc eTemplate(); |
| 140 instanceTemplate->SetInternalFieldCount(fieldCount); | 44 instanceTemplate->SetInternalFieldCount(fieldCount); |
| 141 if (!parentClass.IsEmpty()) { | 45 if (!parentClass.IsEmpty()) { |
| 142 functionDescriptor->Inherit(parentClass); | 46 functionDescriptor->Inherit(parentClass); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 164 if (!result.IsEmpty()) | 68 if (!result.IsEmpty()) |
| 165 return result; | 69 return result; |
| 166 | 70 |
| 167 TRACE_EVENT_SCOPED_SAMPLING_STATE("blink", "BuildDOMTemplate"); | 71 TRACE_EVENT_SCOPED_SAMPLING_STATE("blink", "BuildDOMTemplate"); |
| 168 result = v8::FunctionTemplate::New(isolate, V8ObjectConstructor::isValidCons tructorMode); | 72 result = v8::FunctionTemplate::New(isolate, V8ObjectConstructor::isValidCons tructorMode); |
| 169 configureDOMClassTemplate(result, isolate); | 73 configureDOMClassTemplate(result, isolate); |
| 170 data->setDOMTemplate(wrapperTypeInfo, result); | 74 data->setDOMTemplate(wrapperTypeInfo, result); |
| 171 return result; | 75 return result; |
| 172 } | 76 } |
| 173 | 77 |
| 78 template<class ObjectOrTemplate> | |
| 79 void V8DOMConfiguration::installAttributeInternal(v8::Isolate* isolate, v8::Hand le<ObjectOrTemplate> instanceTemplate, v8::Handle<ObjectOrTemplate> prototype, c onst AttributeConfiguration& attribute, const DOMWrapperWorld& world) | |
| 80 { | |
| 81 if (attribute.exposeConfiguration == OnlyExposedToPrivateScript | |
| 82 && !world.isPrivateScriptIsolatedWorld()) | |
| 83 return; | |
| 84 | |
| 85 v8::AccessorGetterCallback getter = attribute.getter; | |
| 86 v8::AccessorSetterCallback setter = attribute.setter; | |
| 87 if (world.isMainWorld()) { | |
| 88 if (attribute.getterForMainWorld) | |
| 89 getter = attribute.getterForMainWorld; | |
| 90 if (attribute.setterForMainWorld) | |
| 91 setter = attribute.setterForMainWorld; | |
| 92 } | |
| 93 v8::Handle<ObjectOrTemplate> target = | |
| 94 attribute.instanceOrPrototypeConfiguration == OnPrototype ? | |
| 95 prototype : | |
| 96 instanceTemplate; | |
| 97 target->SetAccessor( | |
| 98 v8AtomicString(isolate, attribute.name), | |
| 99 getter, | |
| 100 setter, | |
| 101 v8::External::New(isolate, const_cast<WrapperTypeInfo*>(attribute.data)) , | |
| 102 attribute.settings, | |
| 103 attribute.attribute); | |
| 104 } | |
| 105 | |
| 106 template | |
| 107 void V8DOMConfiguration::installAttributeInternal<v8::ObjectTemplate>(v8::Isolat e*, v8::Handle<v8::ObjectTemplate> instanceTemplate, v8::Handle<v8::ObjectTempla te> prototype, const AttributeConfiguration&, const DOMWrapperWorld&); | |
| 108 template | |
| 109 void V8DOMConfiguration::installAttributeInternal<v8::Object>(v8::Isolate*, v8:: Handle<v8::Object> instanceTemplate, v8::Handle<v8::Object> prototype, const Att ributeConfiguration&, const DOMWrapperWorld&); | |
|
haraken
2015/02/16 13:23:20
Not related to your CL, I'm wondering why we need
Yuki
2015/02/16 15:02:04
ObjectTemplate version is used for the most cases.
| |
| 110 | |
| 111 void V8DOMConfiguration::installAccessorInternal(v8::Isolate* isolate, v8::Handl e<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const Acce ssorConfiguration& accessor, const DOMWrapperWorld& world) | |
| 112 { | |
| 113 if (accessor.exposeConfiguration == OnlyExposedToPrivateScript | |
| 114 && !world.isPrivateScriptIsolatedWorld()) | |
| 115 return; | |
| 116 | |
| 117 v8::FunctionCallback getterCallback = accessor.getter; | |
| 118 v8::FunctionCallback setterCallback = accessor.setter; | |
| 119 if (world.isMainWorld()) { | |
| 120 if (accessor.getterForMainWorld) | |
| 121 getterCallback = accessor.getterForMainWorld; | |
| 122 if (accessor.setterForMainWorld) | |
| 123 setterCallback = accessor.setterForMainWorld; | |
| 124 } | |
| 125 v8::Local<v8::FunctionTemplate> getter; | |
| 126 if (getterCallback) { | |
| 127 getter = v8::FunctionTemplate::New(isolate, getterCallback, v8::External ::New(isolate, const_cast<WrapperTypeInfo*>(accessor.data)), signature, 0); | |
| 128 getter->RemovePrototype(); | |
| 129 } | |
| 130 v8::Local<v8::FunctionTemplate> setter; | |
| 131 if (setterCallback) { | |
| 132 setter = v8::FunctionTemplate::New(isolate, setterCallback, v8::External ::New(isolate, const_cast<WrapperTypeInfo*>(accessor.data)), signature, 1); | |
| 133 setter->RemovePrototype(); | |
| 134 } | |
| 135 prototype->SetAccessorProperty( | |
| 136 v8AtomicString(isolate, accessor.name), | |
| 137 getter, | |
| 138 setter, | |
| 139 accessor.attribute, | |
| 140 accessor.settings); | |
| 141 } | |
| 142 | |
| 143 void V8DOMConfiguration::installConstantInternal(v8::Isolate* isolate, v8::Handl e<v8::FunctionTemplate> functionDescriptor, v8::Handle<v8::ObjectTemplate> proto type, const ConstantConfiguration& constant) | |
| 144 { | |
| 145 v8::Handle<v8::String> constantName = v8AtomicString(isolate, constant.name) ; | |
| 146 v8::PropertyAttribute attributes = | |
| 147 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete); | |
| 148 v8::Handle<v8::Primitive> value; | |
| 149 switch (constant.type) { | |
| 150 case ConstantTypeShort: | |
| 151 case ConstantTypeLong: | |
| 152 case ConstantTypeUnsignedShort: | |
| 153 value = v8::Integer::New(isolate, constant.ivalue); | |
| 154 break; | |
| 155 case ConstantTypeUnsignedLong: | |
| 156 value = v8::Integer::NewFromUnsigned(isolate, constant.ivalue); | |
| 157 break; | |
| 158 case ConstantTypeFloat: | |
| 159 case ConstantTypeDouble: | |
| 160 value = v8::Number::New(isolate, constant.dvalue); | |
| 161 break; | |
| 162 case ConstantTypeString: | |
| 163 value = v8::String::NewFromUtf8(isolate, constant.svalue); | |
| 164 break; | |
| 165 default: | |
| 166 ASSERT_NOT_REACHED(); | |
| 167 } | |
| 168 functionDescriptor->Set(constantName, value, attributes); | |
| 169 prototype->Set(constantName, value, attributes); | |
| 170 } | |
| 171 | |
| 174 } // namespace blink | 172 } // namespace blink |
| OLD | NEW |