Index: tools/json_schema_compiler/feature_compiler.py |
diff --git a/tools/json_schema_compiler/feature_compiler.py b/tools/json_schema_compiler/feature_compiler.py |
index c15e2329edefdd9442400892f61214b3ac3e9dcb..7970d472ea0ca5435b8189bff3be48113422e20d 100644 |
--- a/tools/json_schema_compiler/feature_compiler.py |
+++ b/tools/json_schema_compiler/feature_compiler.py |
@@ -54,7 +54,10 @@ CC_FILE_BEGIN = """ |
#include "%(header_file_path)s" |
#include "extensions/common/features/api_feature.h" |
+#include "extensions/common/features/behavior_feature.h" |
#include "extensions/common/features/complex_feature.h" |
+#include "extensions/common/features/manifest_feature.h" |
+#include "extensions/common/features/permission_feature.h" |
namespace extensions { |
@@ -192,7 +195,7 @@ FEATURE_GRAMMAR = ( |
# These keys are used to find the parents of different features, but are not |
# compiled into the features themselves. |
-IGNORED_KEYS = ['noparent', 'default_parent'] |
+IGNORED_KEYS = ['default_parent'] |
# By default, if an error is encountered, assert to stop the compilation. This |
# can be disabled for testing. |
@@ -330,6 +333,10 @@ class Feature(object): |
if cpp_value: |
self.feature_values[key] = cpp_value |
+ elif key in self.feature_values: |
+ # If the key is empty and this feature inherited a value from its parent, |
+ # remove the inherited value. |
+ del self.feature_values[key] |
def SetParent(self, parent): |
"""Sets the parent of this feature, and inherits all properties from that |
@@ -396,8 +403,17 @@ class FeatureCompiler(object): |
def _FindParent(self, feature_name, feature_value): |
"""Checks to see if a feature has a parent. If it does, returns the |
parent.""" |
+ no_parent = False |
+ if type(feature_value) is list: |
+ no_parent_values = ['noparent' in v for v in feature_value] |
+ no_parent = all(no_parent_values) |
+ assert no_parent or not any(no_parent_values), ( |
+ '"%s:" All child features must contain the same noparent value' % |
+ feature_name) |
+ else: |
+ no_parent = 'noparent' in feature_value |
sep = feature_name.rfind('.') |
- if sep is -1 or 'noparent' in feature_value: |
+ if sep is -1 or no_parent: |
return None |
parent_name = feature_name[:sep] |
if parent_name not in self._features: |
@@ -431,19 +447,27 @@ class FeatureCompiler(object): |
# This doesn't handle nested complex features. I think that's probably for |
# the best. |
for v in feature_value: |
- feature = Feature(feature_name) |
- if parent: |
- feature.SetParent(parent) |
- feature.Parse(v) |
- feature_list.append(feature) |
+ try: |
+ feature = Feature(feature_name) |
+ if parent: |
+ feature.SetParent(parent) |
+ feature.Parse(v) |
+ feature_list.append(feature) |
+ except: |
+ print('Failure to parse feature "%s"' % feature_name) |
+ raise |
self._features[feature_name] = feature_list |
return |
- feature = Feature(feature_name) |
- if parent: |
- feature.SetParent(parent) |
- feature.Parse(feature_value) |
- self._features[feature_name] = feature |
+ try: |
+ feature = Feature(feature_name) |
+ if parent: |
+ feature.SetParent(parent) |
+ feature.Parse(feature_value) |
+ self._features[feature_name] = feature |
+ except: |
+ print('Failure to parse feature "%s"' % feature_name) |
+ raise |
def Compile(self): |
"""Parses all features after loading the input files.""" |