Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (199187 => 199188)
--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2016-04-07 21:55:26 UTC (rev 199187)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2016-04-07 21:56:57 UTC (rev 199188)
@@ -696,6 +696,9 @@
my $interface = shift;
my $attribute = shift;
+ # FIXME: The bindings generator does not support putting runtime-enabled attributes on the instance yet (except for global objects).
+ return 0 if $attribute->signature->extendedAttributes->{"EnabledAtRuntime"} && !IsDOMGlobalObject($interface);
+
return 1 if InterfaceRequiresAttributesOnInstance($interface);
return 1 if $attribute->signature->type =~ /Constructor$/;
@@ -723,7 +726,7 @@
return 1 if IsDOMGlobalObject($interface);
- # FIXME: The bindings generator does not support putting runtime-enabled on the instance yet (except for global objects).
+ # FIXME: The bindings generator does not support putting runtime-enabled operations on the instance yet (except for global objects).
return 0 if $function->signature->extendedAttributes->{"EnabledAtRuntime"};
# [Unforgeable] operations should be on the instance.
@@ -1392,7 +1395,7 @@
sub GeneratePropertiesHashTable
{
- my ($object, $interface, $isInstance, $hashKeys, $hashSpecials, $hashValue1, $hashValue2, $conditionals, $runtimeEnabledFunctions) = @_;
+ my ($object, $interface, $isInstance, $hashKeys, $hashSpecials, $hashValue1, $hashValue2, $conditionals, $runtimeEnabledFunctions, $runtimeEnabledAttributes) = @_;
# FIXME: These should be functions on $interface.
my $interfaceName = $interface->name;
@@ -1444,6 +1447,14 @@
if ($conditional) {
$conditionals->{$name} = $conditional;
}
+
+ if ($attribute->signature->extendedAttributes->{"EnabledAtRuntime"}) {
+ if ($isInstance) {
+ die "We currently do not support [EnabledAtRuntime] attributes on the instance (except for global objects).";
+ } else {
+ push(@$runtimeEnabledAttributes, $attribute);
+ }
+ }
}
my @functions = @{$interface->functions};
@@ -1951,12 +1962,13 @@
my %conditionals = ();
my $hashName = $className . "Table";
my @runtimeEnabledFunctions = ();
+ my @runtimeEnabledAttributes = ();
# Generate hash table for properties on the instance.
my $numInstanceProperties = GeneratePropertiesHashTable($object, $interface, 1,
\@hashKeys, \@hashSpecials,
\@hashValue1, \@hashValue2,
- \%conditionals, \@runtimeEnabledFunctions);
+ \%conditionals, \@runtimeEnabledFunctions, \@runtimeEnabledAttributes);
$object->GenerateHashTable($hashName, $numInstanceProperties,
\@hashKeys, \@hashSpecials,
@@ -2070,12 +2082,13 @@
@hashSpecials = ();
%conditionals = ();
@runtimeEnabledFunctions = ();
+ @runtimeEnabledAttributes = ();
# Generate hash table for properties on the prototype.
my $numPrototypeProperties = GeneratePropertiesHashTable($object, $interface, 0,
\@hashKeys, \@hashSpecials,
\@hashValue1, \@hashValue2,
- \%conditionals, \@runtimeEnabledFunctions);
+ \%conditionals, \@runtimeEnabledFunctions, \@runtimeEnabledAttributes);
my $hashSize = $numPrototypeProperties;
foreach my $constant (@{$interface->constants}) {
@@ -2134,11 +2147,13 @@
push(@implContent, " Base::finishCreation(vm);\n");
push(@implContent, " reifyStaticProperties(vm, ${className}PrototypeTableValues, *this);\n");
- foreach my $function (@runtimeEnabledFunctions) {
- my $conditionalString = $codeGenerator->GenerateConditionalString($function->signature);
+ my @runtimeEnabledProperties = @runtimeEnabledFunctions;
+ push(@runtimeEnabledProperties, @runtimeEnabledAttributes);
+ foreach my $functionOrAttribute (@runtimeEnabledProperties) {
+ my $signature = $functionOrAttribute->signature;
+ my $conditionalString = $codeGenerator->GenerateConditionalString($signature);
push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
AddToImplIncludes("RuntimeEnabledFeatures.h");
- my $signature = $function->signature;
my $enable_function = GetRuntimeEnableFunctionName($signature);
my $name = $signature->name;
push(@implContent, " if (!${enable_function}()) {\n");
Modified: trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp (199187 => 199188)
--- trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp 2016-04-07 21:55:26 UTC (rev 199187)
+++ trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp 2016-04-07 21:56:57 UTC (rev 199188)
@@ -104,6 +104,7 @@
PROP_REFLECTED_CUSTOM_INTEGRAL_ATTR,
PROP_REFLECTED_CUSTOM_BOOLEAN_ATTR,
PROP_REFLECTED_CUSTOM_URL_ATTR,
+ PROP_ENABLED_AT_RUNTIME_ATTRIBUTE,
PROP_ATTR_WITH_GETTER_EXCEPTION,
PROP_ATTR_WITH_GETTER_EXCEPTION_WITH_MESSAGE,
PROP_ATTR_WITH_SETTER_EXCEPTION,
@@ -217,6 +218,9 @@
case PROP_REFLECTED_CUSTOM_URL_ATTR:
webkit_dom_test_obj_set_reflected_custom_url_attr(self, g_value_get_string(value));
break;
+ case PROP_ENABLED_AT_RUNTIME_ATTRIBUTE:
+ webkit_dom_test_obj_set_enabled_at_runtime_attribute(self, g_value_get_string(value));
+ break;
case PROP_ATTR_WITH_GETTER_EXCEPTION:
webkit_dom_test_obj_set_attr_with_getter_exception(self, g_value_get_long(value));
break;
@@ -351,6 +355,9 @@
case PROP_REFLECTED_CUSTOM_URL_ATTR:
g_value_take_string(value, webkit_dom_test_obj_get_reflected_custom_url_attr(self));
break;
+ case PROP_ENABLED_AT_RUNTIME_ATTRIBUTE:
+ g_value_take_string(value, webkit_dom_test_obj_get_enabled_at_runtime_attribute(self));
+ break;
case PROP_ATTR_WITH_GETTER_EXCEPTION:
g_value_set_long(value, webkit_dom_test_obj_get_attr_with_getter_exception(self, nullptr));
break;
@@ -756,6 +763,16 @@
g_object_class_install_property(
gobjectClass,
+ PROP_ENABLED_AT_RUNTIME_ATTRIBUTE,
+ g_param_spec_string(
+ "enabled-at-runtime-attribute",
+ "TestObj:enabled-at-runtime-attribute",
+ "read-write gchar* TestObj:enabled-at-runtime-attribute",
+ "",
+ WEBKIT_PARAM_READWRITE));
+
+ g_object_class_install_property(
+ gobjectClass,
PROP_ATTR_WITH_GETTER_EXCEPTION,
g_param_spec_long(
"attr-with-getter-exception",
@@ -1152,6 +1169,36 @@
new (priv) WebKitDOMTestObjPrivate();
}
+void webkit_dom_test_obj_enabled_at_runtime_operation(WebKitDOMTestObj* self, const gchar* testParam)
+{
+#if ENABLE(TEST_FEATURE)
+ WebCore::JSMainThreadNullState state;
+ g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+ g_return_if_fail(testParam);
+ WebCore::TestObj* item = WebKit::core(self);
+ WTF::String convertedTestParam = WTF::String::fromUTF8(testParam);
+ item->enabledAtRuntimeOperation(convertedTestParam);
+#else
+ UNUSED_PARAM(self);
+ UNUSED_PARAM(testParam);
+ WEBKIT_WARN_FEATURE_NOT_PRESENT("Test Feature")
+#endif /* ENABLE(TEST_FEATURE) */
+}
+
+void webkit_dom_test_obj_enabled_at_runtime_operation(WebKitDOMTestObj* self, glong testParam)
+{
+#if ENABLE(TEST_FEATURE)
+ WebCore::JSMainThreadNullState state;
+ g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+ WebCore::TestObj* item = WebKit::core(self);
+ item->enabledAtRuntimeOperation(testParam);
+#else
+ UNUSED_PARAM(self);
+ UNUSED_PARAM(testParam);
+ WEBKIT_WARN_FEATURE_NOT_PRESENT("Test Feature")
+#endif /* ENABLE(TEST_FEATURE) */
+}
+
void webkit_dom_test_obj_void_method(WebKitDOMTestObj* self)
{
WebCore::JSMainThreadNullState state;
@@ -2162,6 +2209,37 @@
item->setAttributeWithoutSynchronization(WebCore::HTMLNames::customContentURLAttrAttr, convertedValue);
}
+gchar* webkit_dom_test_obj_get_enabled_at_runtime_attribute(WebKitDOMTestObj* self)
+{
+#if ENABLE(TEST_FEATURE)
+ WebCore::JSMainThreadNullState state;
+ g_return_val_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self), 0);
+ WebCore::TestObj* item = WebKit::core(self);
+ gchar* result = convertToUTF8String(item->enabledAtRuntimeAttribute());
+ return result;
+#else
+ UNUSED_PARAM(self);
+ WEBKIT_WARN_FEATURE_NOT_PRESENT("Test Feature")
+ return 0;
+#endif /* ENABLE(TEST_FEATURE) */
+}
+
+void webkit_dom_test_obj_set_enabled_at_runtime_attribute(WebKitDOMTestObj* self, const gchar* value)
+{
+#if ENABLE(TEST_FEATURE)
+ WebCore::JSMainThreadNullState state;
+ g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+ g_return_if_fail(value);
+ WebCore::TestObj* item = WebKit::core(self);
+ WTF::String convertedValue = WTF::String::fromUTF8(value);
+ item->setEnabledAtRuntimeAttribute(convertedValue);
+#else
+ UNUSED_PARAM(self);
+ UNUSED_PARAM(value);
+ WEBKIT_WARN_FEATURE_NOT_PRESENT("Test Feature")
+#endif /* ENABLE(TEST_FEATURE) */
+}
+
glong webkit_dom_test_obj_get_attr_with_getter_exception(WebKitDOMTestObj* self, GError** error)
{
WebCore::JSMainThreadNullState state;
Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (199187 => 199188)
--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp 2016-04-07 21:55:26 UTC (rev 199187)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp 2016-04-07 21:56:57 UTC (rev 199188)
@@ -47,6 +47,7 @@
#include "JSTestSubObj.h"
#include "JSbool.h"
#include "LifecycleCallbackQueue.h"
+#include "RuntimeEnabledFeatures.h"
#include "SVGDocument.h"
#include "SVGPoint.h"
#include "SVGStaticPropertyTearOff.h"
@@ -91,6 +92,9 @@
// Functions
+#if ENABLE(TEST_FEATURE)
+JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionEnabledAtRuntimeOperation(JSC::ExecState*);
+#endif
JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionVoidMethod(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionVoidMethodWithArgs(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionByteMethod(JSC::ExecState*);
@@ -258,6 +262,10 @@
bool setJSTestObjReflectedCustomBooleanAttr(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
JSC::EncodedJSValue jsTestObjReflectedCustomURLAttr(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
bool setJSTestObjReflectedCustomURLAttr(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
+#if ENABLE(TEST_FEATURE)
+JSC::EncodedJSValue jsTestObjEnabledAtRuntimeAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
+bool setJSTestObjEnabledAtRuntimeAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
+#endif
JSC::EncodedJSValue jsTestObjTypedArrayAttr(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
bool setJSTestObjTypedArrayAttr(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
JSC::EncodedJSValue jsTestObjAttrWithGetterException(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
@@ -552,6 +560,11 @@
{ "reflectedCustomIntegralAttr", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomIntegralAttr), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjReflectedCustomIntegralAttr) } },
{ "reflectedCustomBooleanAttr", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomBooleanAttr), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjReflectedCustomBooleanAttr) } },
{ "reflectedCustomURLAttr", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomURLAttr), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjReflectedCustomURLAttr) } },
+#if ENABLE(TEST_FEATURE)
+ { "enabledAtRuntimeAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjEnabledAtRuntimeAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjEnabledAtRuntimeAttribute) } },
+#else
+ { 0, 0, NoIntrinsic, { 0, 0 } },
+#endif
{ "typedArrayAttr", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjTypedArrayAttr), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjTypedArrayAttr) } },
{ "attrWithGetterException", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjAttrWithGetterException), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjAttrWithGetterException) } },
{ "attrWithGetterExceptionWithMessage", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjAttrWithGetterExceptionWithMessage), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjAttrWithGetterExceptionWithMessage) } },
@@ -619,6 +632,11 @@
{ "attributeWithReservedEnumType", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjAttributeWithReservedEnumType), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjAttributeWithReservedEnumType) } },
{ "putForwardsAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjPutForwardsAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjPutForwardsAttribute) } },
{ "putForwardsNullableAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjPutForwardsNullableAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestObjPutForwardsNullableAttribute) } },
+#if ENABLE(TEST_FEATURE)
+ { "enabledAtRuntimeOperation", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionEnabledAtRuntimeOperation), (intptr_t) (1) } },
+#else
+ { 0, 0, NoIntrinsic, { 0, 0 } },
+#endif
{ "voidMethod", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionVoidMethod), (intptr_t) (0) } },
{ "voidMethodWithArgs", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionVoidMethodWithArgs), (intptr_t) (3) } },
{ "byteMethod", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionByteMethod), (intptr_t) (0) } },
@@ -754,6 +772,18 @@
{
Base::finishCreation(vm);
reifyStaticProperties(vm, JSTestObjPrototypeTableValues, *this);
+#if ENABLE(TEST_FEATURE)
+ if (!RuntimeEnabledFeatures::sharedFeatures().testFeatureEnabled()) {
+ Identifier propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("enabledAtRuntimeOperation"), strlen("enabledAtRuntimeOperation"));
+ removeDirect(vm, propertyName);
+ }
+#endif
+#if ENABLE(TEST_FEATURE)
+ if (!RuntimeEnabledFeatures::sharedFeatures().testFeatureEnabled()) {
+ Identifier propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("enabledAtRuntimeAttribute"), strlen("enabledAtRuntimeAttribute"));
+ removeDirect(vm, propertyName);
+ }
+#endif
JSVMClientData& clientData = *static_cast<JSVMClientData*>(vm.clientData);
putDirect(vm, clientData.builtinNames().privateMethodPrivateName(), JSFunction::create(vm, globalObject(), 0, String(), jsTestObjPrototypeFunctionPrivateMethod), ReadOnly | DontEnum);
putDirect(vm, vm.propertyNames->iteratorSymbol, JSFunction::create(vm, globalObject(), 0, ASCIILiteral("[Symbol.Iterator]"), jsTestObjPrototypeFunctionSymbolIterator), ReadOnly | DontEnum);
@@ -1288,6 +1318,23 @@
}
+#if ENABLE(TEST_FEATURE)
+EncodedJSValue jsTestObjEnabledAtRuntimeAttribute(ExecState* state, EncodedJSValue thisValue, PropertyName)
+{
+ UNUSED_PARAM(state);
+ UNUSED_PARAM(thisValue);
+ JSValue decodedThisValue = JSValue::decode(thisValue);
+ auto* castedThis = jsDynamicCast<JSTestObj*>(decodedThisValue);
+ if (UNLIKELY(!castedThis)) {
+ return throwGetterTypeError(*state, "TestObj", "enabledAtRuntimeAttribute");
+ }
+ auto& impl = castedThis->wrapped();
+ JSValue result = jsStringWithCache(state, impl.enabledAtRuntimeAttribute());
+ return JSValue::encode(result);
+}
+
+#endif
+
EncodedJSValue jsTestObjTypedArrayAttr(ExecState* state, EncodedJSValue thisValue, PropertyName)
{
UNUSED_PARAM(state);
@@ -2482,6 +2529,25 @@
}
+#if ENABLE(TEST_FEATURE)
+bool setJSTestObjEnabledAtRuntimeAttribute(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
+{
+ JSValue value = JSValue::decode(encodedValue);
+ UNUSED_PARAM(thisValue);
+ JSTestObj* castedThis = jsDynamicCast<JSTestObj*>(JSValue::decode(thisValue));
+ if (UNLIKELY(!castedThis)) {
+ return throwSetterTypeError(*state, "TestObj", "enabledAtRuntimeAttribute");
+ }
+ auto& impl = castedThis->wrapped();
+ String nativeValue = value.toString(state)->value(state);
+ if (UNLIKELY(state->hadException()))
+ return false;
+ impl.setEnabledAtRuntimeAttribute(nativeValue);
+ return true;
+}
+
+#endif
+
bool setJSTestObjTypedArrayAttr(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
{
JSValue value = JSValue::decode(encodedValue);
@@ -3161,6 +3227,64 @@
return getDOMConstructor<JSTestObjConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));
}
+#if ENABLE(TEST_FEATURE)
+static inline EncodedJSValue jsTestObjPrototypeFunctionEnabledAtRuntimeOperation1(ExecState* state)
+{
+ JSValue thisValue = state->thisValue();
+ auto castedThis = jsDynamicCast<JSTestObj*>(thisValue);
+ if (UNLIKELY(!castedThis))
+ return throwThisTypeError(*state, "TestObj", "enabledAtRuntimeOperation");
+ ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestObj::info());
+ auto& impl = castedThis->wrapped();
+ if (UNLIKELY(state->argumentCount() < 1))
+ return throwVMError(state, createNotEnoughArgumentsError(state));
+ String testParam = state->argument(0).toString(state)->value(state);
+ if (UNLIKELY(state->hadException()))
+ return JSValue::encode(jsUndefined());
+ impl.enabledAtRuntimeOperation(testParam);
+ return JSValue::encode(jsUndefined());
+}
+
+#endif
+
+#if ENABLE(TEST_FEATURE)
+static inline EncodedJSValue jsTestObjPrototypeFunctionEnabledAtRuntimeOperation2(ExecState* state)
+{
+ JSValue thisValue = state->thisValue();
+ auto castedThis = jsDynamicCast<JSTestObj*>(thisValue);
+ if (UNLIKELY(!castedThis))
+ return throwThisTypeError(*state, "TestObj", "enabledAtRuntimeOperation");
+ ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestObj::info());
+ auto& impl = castedThis->wrapped();
+ if (UNLIKELY(state->argumentCount() < 1))
+ return throwVMError(state, createNotEnoughArgumentsError(state));
+ int testParam = toInt32(state, state->argument(0), NormalConversion);
+ if (UNLIKELY(state->hadException()))
+ return JSValue::encode(jsUndefined());
+ impl.enabledAtRuntimeOperation(testParam);
+ return JSValue::encode(jsUndefined());
+}
+
+#endif
+
+EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionEnabledAtRuntimeOperation(ExecState* state)
+{
+ size_t argsCount = std::min<size_t>(1, state->argumentCount());
+#if ENABLE(TEST_FEATURE)
+ if (argsCount == 1)
+ return jsTestObjPrototypeFunctionEnabledAtRuntimeOperation1(state);
+#endif
+
+#if ENABLE(TEST_FEATURE)
+ if (argsCount == 1)
+ return jsTestObjPrototypeFunctionEnabledAtRuntimeOperation2(state);
+#endif
+
+ if (argsCount < 1)
+ return throwVMError(state, createNotEnoughArgumentsError(state));
+ return throwVMTypeError(state);
+}
+
EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionVoidMethod(ExecState* state)
{
JSValue thisValue = state->thisValue();