blob: 04b82884ca20ee9c0004fa85049a51b93dc2b52a [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef V8DOMConfiguration_h
#define V8DOMConfiguration_h
#include "bindings/core/v8/V8Binding.h"
#include "bindings/core/v8/V8DOMWrapper.h"
#include "core/CoreExport.h"
#include <v8.h>
namespace blink {
class CORE_EXPORT V8DOMConfiguration final {
DISALLOW_ALLOCATION();
WTF_MAKE_NONCOPYABLE(V8DOMConfiguration);
public:
// The following Configuration structs and install methods are used for
// setting multiple properties on ObjectTemplate / FunctionTemplate, used
// from the generated bindings initialization (ConfigureXXXTemplate).
// This greatly reduces the binary size by moving from code driven setup to
// data table driven setup.
enum ExposeConfiguration {
ExposedToAllScripts,
OnlyExposedToPrivateScript,
};
// Bitflags to show where the member will be defined.
enum PropertyLocationConfiguration {
OnInstance = 1 << 0,
OnPrototype = 1 << 1,
OnInterface = 1 << 2,
};
enum HolderCheckConfiguration {
CheckHolder,
DoNotCheckHolder,
};
// AttributeConfiguration translates into calls to SetAccessor() on either
// the instance or the prototype ObjectTemplate, based on |instanceOrPrototypeConfiguration|.
struct AttributeConfiguration {
AttributeConfiguration& operator=(const AttributeConfiguration&) = delete;
DISALLOW_ALLOCATION();
const char* const name;
v8::AccessorNameGetterCallback getter;
v8::AccessorNameSetterCallback setter;
v8::AccessorNameGetterCallback getterForMainWorld;
v8::AccessorNameSetterCallback setterForMainWorld;
const WrapperTypeInfo* data;
v8::AccessControl settings;
v8::PropertyAttribute attribute;
unsigned exposeConfiguration : 1; // ExposeConfiguration
unsigned propertyLocationConfiguration : 3; // PropertyLocationConfiguration
unsigned holderCheckConfiguration : 1; // HolderCheckConfiguration
};
static void installAttributes(v8::Isolate*, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, const AttributeConfiguration*, size_t attributeCount);
static void installAttribute(v8::Isolate*, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, const AttributeConfiguration&);
// AccessorConfiguration translates into calls to SetAccessorProperty()
// on prototype ObjectTemplate.
struct AccessorConfiguration {
AccessorConfiguration& operator=(const AccessorConfiguration&) = delete;
DISALLOW_ALLOCATION();
const char* const name;
v8::FunctionCallback getter;
v8::FunctionCallback setter;
v8::FunctionCallback getterForMainWorld;
v8::FunctionCallback setterForMainWorld;
const WrapperTypeInfo* data;
v8::AccessControl settings;
v8::PropertyAttribute attribute;
unsigned exposeConfiguration : 1; // ExposeConfiguration
unsigned propertyLocationConfiguration : 3; // PropertyLocationConfiguration
unsigned holderCheckConfiguration : 1; // HolderCheckConfiguration
};
static void installAccessors(v8::Isolate*, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature>, const AccessorConfiguration*, size_t accessorCount);
static void installAccessor(v8::Isolate*, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature>, const AccessorConfiguration&);
static void installAccessor(v8::Isolate*, v8::Local<v8::Object> instance, v8::Local<v8::Object> prototype, v8::Local<v8::Function> interface, v8::Local<v8::Signature>, const AccessorConfiguration&);
enum ConstantType {
ConstantTypeShort,
ConstantTypeLong,
ConstantTypeUnsignedShort,
ConstantTypeUnsignedLong,
ConstantTypeFloat,
ConstantTypeDouble
};
// ConstantConfiguration translates into calls to Set() for setting up an
// object's constants. It sets the constant on both the FunctionTemplate and
// the ObjectTemplate. PropertyAttributes is always ReadOnly.
struct ConstantConfiguration {
ConstantConfiguration& operator=(const ConstantConfiguration&) = delete;
DISALLOW_ALLOCATION();
const char* const name;
int ivalue;
double dvalue;
ConstantType type;
};
// Constant installation
//
// installConstants and installConstant are used for simple constants. They
// install constants using v8::Template::Set(), which results in a property
// that is much faster to access from scripts.
// installConstantWithGetter 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.
static void installConstants(v8::Isolate*, v8::Local<v8::FunctionTemplate> functionDescriptor, v8::Local<v8::ObjectTemplate> prototypeTemplate, const ConstantConfiguration*, size_t constantCount);
static void installConstant(v8::Isolate*, v8::Local<v8::FunctionTemplate> functionDescriptor, v8::Local<v8::ObjectTemplate> prototypeTemplate, const ConstantConfiguration&);
static void installConstantWithGetter(v8::Isolate*, v8::Local<v8::FunctionTemplate> functionDescriptor, v8::Local<v8::ObjectTemplate> prototypeTemplate, const char* name, v8::AccessorNameGetterCallback);
// MethodConfiguration translates into calls to Set() for setting up an
// object's callbacks. It sets the method on both the FunctionTemplate or
// the ObjectTemplate.
struct MethodConfiguration {
MethodConfiguration& operator=(const MethodConfiguration&) = delete;
DISALLOW_ALLOCATION();
v8::Local<v8::Name> methodName(v8::Isolate* isolate) const { return v8AtomicString(isolate, name); }
v8::FunctionCallback callbackForWorld(const DOMWrapperWorld& world) const
{
return world.isMainWorld() && callbackForMainWorld ? callbackForMainWorld : callback;
}
const char* const name;
v8::FunctionCallback callback;
v8::FunctionCallback callbackForMainWorld;
int length;
unsigned exposeConfiguration : 1; // ExposeConfiguration
unsigned propertyLocationConfiguration : 3; // PropertyLocationConfiguration
};
struct SymbolKeyedMethodConfiguration {
SymbolKeyedMethodConfiguration& operator=(const SymbolKeyedMethodConfiguration&) = delete;
DISALLOW_ALLOCATION();
v8::Local<v8::Name> methodName(v8::Isolate* isolate) const { return getSymbol(isolate); }
v8::FunctionCallback callbackForWorld(const DOMWrapperWorld&) const
{
return callback;
}
v8::Local<v8::Symbol> (*getSymbol)(v8::Isolate*);
v8::FunctionCallback callback;
// SymbolKeyedMethodConfiguration doesn't support per-world bindings.
int length;
unsigned exposeConfiguration : 1; // ExposeConfiguration
unsigned propertyLocationConfiguration : 3; // PropertyLocationConfiguration
};
static void installMethods(v8::Isolate*, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature>, v8::PropertyAttribute, const MethodConfiguration*, size_t methodCount);
static void installMethod(v8::Isolate*, v8::Local<v8::ObjectTemplate> instanceTemplate, v8::Local<v8::ObjectTemplate> prototypeTemplate, v8::Local<v8::FunctionTemplate> interfaceTemplate, v8::Local<v8::Signature>, v8::PropertyAttribute, const MethodConfiguration&);
static void installMethod(v8::Isolate*, v8::Local<v8::ObjectTemplate>, v8::Local<v8::Signature>, v8::PropertyAttribute, const SymbolKeyedMethodConfiguration&);
static v8::Local<v8::Signature> installDOMClassTemplate(v8::Isolate*, v8::Local<v8::FunctionTemplate>, const char* interfaceName, v8::Local<v8::FunctionTemplate> parentClass, size_t fieldCount,
const AttributeConfiguration*, size_t attributeCount,
const AccessorConfiguration*, size_t accessorCount,
const MethodConfiguration*, size_t methodCount);
static v8::Local<v8::FunctionTemplate> domClassTemplate(v8::Isolate*, WrapperTypeInfo*, void (*)(v8::Local<v8::FunctionTemplate>, v8::Isolate*));
};
} // namespace blink
#endif // V8DOMConfiguration_h