diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/bindings/v8/V8DOMConfiguration.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/bindings/v8/V8DOMConfiguration.cpp | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8DOMConfiguration.cpp b/chromium/third_party/WebKit/Source/bindings/v8/V8DOMConfiguration.cpp index f92f9f0736e..13f2bf3659b 100644 --- a/chromium/third_party/WebKit/Source/bindings/v8/V8DOMConfiguration.cpp +++ b/chromium/third_party/WebKit/Source/bindings/v8/V8DOMConfiguration.cpp @@ -30,21 +30,24 @@ #include "bindings/v8/V8DOMConfiguration.h" #include "bindings/v8/V8Binding.h" +#include "bindings/v8/V8ObjectConstructor.h" +#include "platform/TraceEvent.h" namespace WebCore { -void V8DOMConfiguration::installAttributes(v8::Handle<v8::ObjectTemplate> instanceTemplate, v8::Handle<v8::ObjectTemplate> prototype, const AttributeConfiguration* attributes, size_t attributeCount, v8::Isolate* isolate, WrapperWorldType currentWorldType) +void V8DOMConfiguration::installAttributes(v8::Handle<v8::ObjectTemplate> instanceTemplate, v8::Handle<v8::ObjectTemplate> prototype, const AttributeConfiguration* attributes, size_t attributeCount, v8::Isolate* isolate) { for (size_t i = 0; i < attributeCount; ++i) - installAttribute(instanceTemplate, prototype, attributes[i], isolate, currentWorldType); + installAttribute(instanceTemplate, prototype, attributes[i], isolate); } -void V8DOMConfiguration::installAccessors(v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const AccessorConfiguration* accessors, size_t accessorCount, v8::Isolate* isolate, WrapperWorldType currentWorldType) +void V8DOMConfiguration::installAccessors(v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, const AccessorConfiguration* accessors, size_t accessorCount, v8::Isolate* isolate) { + bool isMainWorld = DOMWrapperWorld::current(isolate).isMainWorld(); for (size_t i = 0; i < accessorCount; ++i) { v8::FunctionCallback getterCallback = accessors[i].getter; v8::FunctionCallback setterCallback = accessors[i].setter; - if (currentWorldType == MainWorld) { + if (isMainWorld) { if (accessors[i].getterForMainWorld) getterCallback = accessors[i].getterForMainWorld; if (accessors[i].setterForMainWorld) @@ -61,7 +64,7 @@ void V8DOMConfiguration::installAccessors(v8::Handle<v8::ObjectTemplate> prototy setter = v8::FunctionTemplate::New(isolate, setterCallback, v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessors[i].data)), signature, 1); setter->RemovePrototype(); } - prototype->SetAccessorProperty(v8::String::NewFromUtf8(isolate, accessors[i].name, v8::String::kInternalizedString), getter, setter, accessors[i].attribute, accessors[i].settings); + prototype->SetAccessorProperty(v8AtomicString(isolate, accessors[i].name), getter, setter, accessors[i].attribute, accessors[i].settings); } } @@ -69,20 +72,22 @@ void V8DOMConfiguration::installConstants(v8::Handle<v8::FunctionTemplate> funct { for (size_t i = 0; i < constantCount; ++i) { const ConstantConfiguration* constant = &constants[i]; - functionDescriptor->Set(v8::String::NewFromUtf8(isolate, constant->name, v8::String::kInternalizedString), v8::Integer::New(isolate, constant->value), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); - prototype->Set(v8::String::NewFromUtf8(isolate, constant->name, v8::String::kInternalizedString), v8::Integer::New(isolate, constant->value), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); + v8::Handle<v8::String> constantName = v8AtomicString(isolate, constant->name); + functionDescriptor->Set(constantName, v8::Integer::New(isolate, constant->value), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); + prototype->Set(constantName, v8::Integer::New(isolate, constant->value), static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); } } -void V8DOMConfiguration::installCallbacks(v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attributes, const MethodConfiguration* callbacks, size_t callbackCount, v8::Isolate* isolate, WrapperWorldType currentWorldType) +void V8DOMConfiguration::installCallbacks(v8::Handle<v8::ObjectTemplate> prototype, v8::Handle<v8::Signature> signature, v8::PropertyAttribute attributes, const MethodConfiguration* callbacks, size_t callbackCount, v8::Isolate* isolate) { + bool isMainWorld = DOMWrapperWorld::current(isolate).isMainWorld(); for (size_t i = 0; i < callbackCount; ++i) { v8::FunctionCallback callback = callbacks[i].callback; - if (currentWorldType == MainWorld && callbacks[i].callbackForMainWorld) + if (isMainWorld && callbacks[i].callbackForMainWorld) callback = callbacks[i].callbackForMainWorld; v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New(isolate, callback, v8Undefined(), signature, callbacks[i].length); functionTemplate->RemovePrototype(); - prototype->Set(v8::String::NewFromUtf8(isolate, callbacks[i].name, v8::String::kInternalizedString), functionTemplate, attributes); + prototype->Set(v8AtomicString(isolate, callbacks[i].name), functionTemplate, attributes); } } @@ -90,9 +95,9 @@ v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Handle< const AttributeConfiguration* attributes, size_t attributeCount, const AccessorConfiguration* accessors, size_t accessorCount, const MethodConfiguration* callbacks, size_t callbackCount, - v8::Isolate* isolate, WrapperWorldType currentWorldType) + v8::Isolate* isolate) { - functionDescriptor->SetClassName(v8::String::NewFromUtf8(isolate, interfaceName, v8::String::kInternalizedString)); + functionDescriptor->SetClassName(v8AtomicString(isolate, interfaceName)); v8::Local<v8::ObjectTemplate> instanceTemplate = functionDescriptor->InstanceTemplate(); instanceTemplate->SetInternalFieldCount(fieldCount); if (!parentClass.IsEmpty()) { @@ -106,12 +111,26 @@ v8::Local<v8::Signature> V8DOMConfiguration::installDOMClassTemplate(v8::Handle< v8::Local<v8::Signature> defaultSignature = v8::Signature::New(isolate, functionDescriptor); if (attributeCount) - installAttributes(instanceTemplate, functionDescriptor->PrototypeTemplate(), attributes, attributeCount, isolate, currentWorldType); + installAttributes(instanceTemplate, functionDescriptor->PrototypeTemplate(), attributes, attributeCount, isolate); if (accessorCount) - installAccessors(functionDescriptor->PrototypeTemplate(), defaultSignature, accessors, accessorCount, isolate, currentWorldType); + installAccessors(functionDescriptor->PrototypeTemplate(), defaultSignature, accessors, accessorCount, isolate); if (callbackCount) - installCallbacks(functionDescriptor->PrototypeTemplate(), defaultSignature, static_cast<v8::PropertyAttribute>(v8::DontDelete), callbacks, callbackCount, isolate, currentWorldType); + installCallbacks(functionDescriptor->PrototypeTemplate(), defaultSignature, static_cast<v8::PropertyAttribute>(v8::DontDelete), callbacks, callbackCount, isolate); return defaultSignature; } +v8::Handle<v8::FunctionTemplate> V8DOMConfiguration::domClassTemplate(v8::Isolate* isolate, WrapperTypeInfo* wrapperTypeInfo, void (*configureDOMClassTemplate)(v8::Handle<v8::FunctionTemplate>, v8::Isolate*)) +{ + V8PerIsolateData* data = V8PerIsolateData::from(isolate); + v8::Local<v8::FunctionTemplate> result = data->existingDOMTemplate(wrapperTypeInfo); + if (!result.IsEmpty()) + return result; + + TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate"); + result = v8::FunctionTemplate::New(isolate, V8ObjectConstructor::isValidConstructorMode); + configureDOMClassTemplate(result, isolate); + data->setDOMTemplate(wrapperTypeInfo, result); + return result; +} + } // namespace WebCore |