Index: tools/dom/scripts/idlnode.py |
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py |
index fff5e34b50d7d56aeed8f28c25248d8a44129109..5d94ab6cbc8d7836c4ad41aefaf7cb3d2b30edeb 100755 |
--- a/tools/dom/scripts/idlnode.py |
+++ b/tools/dom/scripts/idlnode.py |
@@ -7,7 +7,7 @@ import os |
import sys |
import idl_definitions |
-from idl_types import IdlType, IdlUnionType, IdlArrayOrSequenceType |
+from idl_types import IdlType, IdlNullableType, IdlUnionType, IdlArrayOrSequenceType |
from compute_interfaces_info_overall import interfaces_info |
@@ -166,7 +166,7 @@ class IDLNode(object): |
if hasattr(ast, field_name): |
field_value = getattr(ast, field_name) |
if field_value: |
- if label == 'Interface' or label == 'Enum': |
+ if label == 'Interface' or label == 'Enum' or label == "Dictionary": |
for key in field_value: |
value = field_value[key] |
res.append(value) |
@@ -222,6 +222,9 @@ class IDLNode(object): |
'Enum': 'enumerations', |
'Annotation': '', # TODO(terry): Ignore annotation used for database cache. |
'TypeDef': '', # typedef in an IDL are already resolved. |
+ 'Dictionary': 'dictionaries', |
+ 'Member': 'members', |
+ 'Default': 'default_value', # Dictionary member default value |
} |
result = label_field.get(label) |
if result != '' and not(result): |
@@ -266,6 +269,10 @@ class IDLNode(object): |
"""Helper method for uniform conversion of annotations.""" |
self.annotations = IDLAnnotations(ast) |
+ def _convert_constants(self, ast, js_name): |
+ """Helper method for uniform conversion of dictionary members.""" |
+ self.members = IDLDictionaryMembers(ast, js_name) |
+ |
class IDLDictNode(IDLNode): |
"""Base class for dictionary-like IDL nodes such as extended attributes |
@@ -343,6 +350,7 @@ class IDLFile(IDLNode): |
filename_basename = os.path.basename(filename) |
self.interfaces = self._convert_all(ast, 'Interface', IDLInterface) |
+ self.dictionaries = self._convert_all(ast, 'Dictionary', IDLDictionary) |
is_blink = not(isinstance(ast, list)) and ast.__module__ == 'idl_definitions' |
@@ -369,7 +377,7 @@ class IDLFile(IDLNode): |
implemented_name) |
self.implementsStatements.append(implement_statement) |
- else: |
+ elif interface.id in interfaces_info: |
interface_info = interfaces_info[interface.id] |
implements = interface_info['implements_interfaces'] |
@@ -455,6 +463,14 @@ class IDLExtAttrs(IDLDictNode): |
self.setdefault('Constructor', []).append(func_value) |
else: |
self[name] = func_value |
+ elif name == 'SetWrapperReferenceTo': |
+ # NOTE: No need to process handling for GC wrapper. But if its a reference |
+ # to another type via an IdlArgument we'd need to convert to IDLArgument |
+ # otherwise the type might be a reference to another type and the circularity |
+ # will break deep_copy which is done later to the interfaces in the |
+ # database. If we every need SetWrapperReferenceTo then we'd need to |
+ # convert IdlArgument to IDLArgument. |
+ continue |
else: |
self[name] = value |
else: |
@@ -547,7 +563,8 @@ class IDLType(IDLNode): |
self.id = ast |
# New blink handling. |
elif ast.__module__ == "idl_types": |
- if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType): |
+ if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType) or \ |
+ isinstance(ast, IdlNullableType): |
type_name = str(ast) |
# TODO(terry): For now don't handle unrestricted types see |
@@ -564,7 +581,7 @@ class IDLType(IDLNode): |
print 'WARNING type %s is union mapped to \'any\'' % self.id |
# TODO(terry): For union types use any otherwise type is unionType is |
# not found and is removed during merging. |
- self.id = 'any' |
+ self.id = 'any' |
# TODO(terry): Any union type e.g. 'type1 or type2 or type2', |
# 'typedef (Type1 or Type2) UnionType' |
# Is a problem we need to extend IDLType and IDLTypeDef to handle more |
@@ -613,6 +630,31 @@ class IDLTypeDef(IDLNode): |
self.type = self._convert_first(ast, 'Type', IDLType) |
+class IDLDictionary(IDLNode): |
+ """IDLDictionary node contains members, |
+ as well as parent references.""" |
+ |
+ def __init__(self, ast): |
+ IDLNode.__init__(self, ast) |
+ |
+ self.javascript_binding_name = self.id |
+ self._convert_ext_attrs(ast) |
+ self._convert_constants(ast, self.id) |
+ |
+ |
+class IDLDictionaryMembers(IDLDictNode): |
+ """IDLDictionaryMembers specialization for a list of FremontCut dictionary values.""" |
+ def __init__(self, ast=None, js_name=None): |
+ IDLDictNode.__init__(self, ast) |
+ self.id = None |
+ if not ast: |
+ return |
+ for member in self._find_all(ast, 'Member'): |
+ name = self._find_first(member, 'Id') |
+ value = IDLDictionaryMember(member, js_name) |
+ self[name] = value |
+ |
+ |
class IDLInterface(IDLNode): |
"""IDLInterface node contains operations, attributes, constants, |
as well as parent references.""" |
@@ -785,6 +827,14 @@ class IDLArgument(IDLNode): |
return '<IDLArgument(type = %s, id = %s)>' % (self.type, self.id) |
+class IDLDictionaryMember(IDLMember): |
+ """IDLNode specialization for 'const type name = value' declarations.""" |
+ def __init__(self, ast, doc_js_interface_name): |
+ IDLMember.__init__(self, ast, doc_js_interface_name) |
+ default_value = self._find_first(ast, 'Default') |
+ self.value = default_value.value if default_value else None |
+ |
+ |
class IDLImplementsStatement(IDLNode): |
"""IDLNode specialization for 'IMPLEMENTOR implements IMPLEMENTED' declarations.""" |
def __init__(self, ast): |