| Index: Source/core/scripts/make_runtime_features.py
|
| diff --git a/Source/core/scripts/make_runtime_features.py b/Source/core/scripts/make_runtime_features.py
|
| index e142d9544efe0c5cdbb5f3b8a4df8019596ccec2..6b108926df2730b982a81021f70b7d9971124a90 100755
|
| --- a/Source/core/scripts/make_runtime_features.py
|
| +++ b/Source/core/scripts/make_runtime_features.py
|
| @@ -45,7 +45,9 @@ namespace WebCore {
|
|
|
| class %(class_name)s {
|
| public:
|
| -%(method_declarations)s
|
| +%(set_toggle_declarations)s
|
| +
|
| +%(accessor_declarations)s
|
| private:
|
| %(class_name)s() { }
|
|
|
| @@ -63,17 +65,24 @@ IMPLEMENTATION_TEMPLATE = """%(license)s
|
|
|
| namespace WebCore {
|
|
|
| +%(set_toggle_definitions)s
|
| %(storage_definitions)s
|
|
|
| } // namespace WebCore
|
| """
|
|
|
| class RuntimeFeatureWriter(in_generator.Writer):
|
| - class_name = "RuntimeEnabledFeatures"
|
| + class_name = 'RuntimeEnabledFeatures'
|
| +
|
| + # FIXME: valid_values and defaults should probably roll into one object.
|
| + valid_values = {
|
| + 'status': ['stable', 'experimental', 'test'],
|
| + }
|
| defaults = {
|
| 'condition' : None,
|
| 'depends_on' : [],
|
| 'custom': False,
|
| + 'status': None,
|
| }
|
|
|
| def __init__(self, in_file_path):
|
| @@ -96,7 +105,10 @@ class RuntimeFeatureWriter(in_generator.Writer):
|
| lowered = lowered.replace("iME", "ime")
|
| return lowered
|
|
|
| - def _method_declaration(self, feature):
|
| + def _feature_set_declaration(self, feature_set):
|
| + return " static void set%sFeaturesEnabled(bool);" % feature_set.capitalize()
|
| +
|
| + def _feature_accessor_declaration(self, feature):
|
| if feature['custom']:
|
| return " static bool %(first_lowered_name)sEnabled();\n" % feature
|
| unconditional = """ static void set%(name)sEnabled(bool isEnabled) { is%(name)sEnabled = isEnabled; }
|
| @@ -118,10 +130,32 @@ class RuntimeFeatureWriter(in_generator.Writer):
|
| return HEADER_TEMPLATE % {
|
| 'class_name' : self.class_name,
|
| 'license' : license.license_for_generated_cpp(),
|
| - 'method_declarations' : "\n".join(map(self._method_declaration, self._all_features)),
|
| + 'set_toggle_declarations' : "\n".join(map(self._feature_set_declaration, self._feature_sets())),
|
| + 'accessor_declarations' : "\n".join(map(self._feature_accessor_declaration, self._all_features)),
|
| 'storage_declarations' : "\n".join(map(self._storage_declarations, self._non_custom_features)),
|
| }
|
|
|
| + def _feature_sets(self):
|
| + # Another way to think of the status levels is as "sets of features"
|
| + # which is how we're referring to them in this generator.
|
| + return self.valid_values['status']
|
| +
|
| + def _feature_toggle(self, feature):
|
| + return " set%(name)sEnabled(enable);" % feature
|
| +
|
| + def _feature_set_definition(self, feature_set):
|
| + features_in_set = filter(lambda feature: feature['status'] == feature_set, self._all_features)
|
| + template = """void %(class_name)s::set%(feature_set)sFeaturesEnabled(bool enable)
|
| +{
|
| +%(feature_toggles)s
|
| +}
|
| +"""
|
| + return template % {
|
| + 'class_name': self.class_name,
|
| + 'feature_set': feature_set.capitalize(),
|
| + 'feature_toggles': "\n".join(map(self._feature_toggle, features_in_set)),
|
| + }
|
| +
|
| def _storage_definition(self, feature):
|
| definition = "bool RuntimeEnabledFeatures::is%(name)sEnabled = false;" % feature
|
| return self.wrap_with_condition(definition, feature['condition'])
|
| @@ -130,7 +164,8 @@ class RuntimeFeatureWriter(in_generator.Writer):
|
| return IMPLEMENTATION_TEMPLATE % {
|
| 'class_name' : self.class_name,
|
| 'license' : license.license_for_generated_cpp(),
|
| - 'storage_definitions' : "\n".join(map(self._storage_definition, self._non_custom_features)),
|
| + 'set_toggle_definitions' : '\n'.join(map(self._feature_set_definition, self._feature_sets())),
|
| + 'storage_definitions' : '\n'.join(map(self._storage_definition, self._non_custom_features)),
|
| }
|
|
|
|
|
|
|