Index: tools/dom/scripts/generator.py |
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py |
index f0bd2f47e7756c9bae72d481eba77a5864ada5d1..7d2c54cb5aae7d6a7e4a65e60ceeb99dc8105b9d 100644 |
--- a/tools/dom/scripts/generator.py |
+++ b/tools/dom/scripts/generator.py |
@@ -61,6 +61,10 @@ _methods_with_named_formals = monitored.Set( |
'DataView.setUint8', |
'DirectoryEntry.getDirectory', |
'DirectoryEntry.getFile', |
+ 'Entry.copyTo', |
+ 'Entry.moveTo', |
+ 'HTMLInputElement.setRangeText', |
+ 'XMLHttpRequest.open', |
]) |
# |
@@ -136,6 +140,12 @@ class ParamInfo(object): |
self.name, self.type_id, self.is_optional) |
return '<ParamInfo(%s)>' % content |
+def GetCallbackInfo(interface): |
+ """For the given interface, find operations that take callbacks (for use in |
+ auto-transforming callbacks into futures).""" |
+ callback_handlers = [operation for operation in interface.operations |
+ if operation.id == 'handleEvent'] |
+ return AnalyzeOperation(interface, callback_handlers) |
# Given a list of overloaded arguments, render dart arguments. |
def _BuildArguments(args, interface, constructor=False): |
@@ -212,8 +222,25 @@ def AnalyzeOperation(interface, operations): |
info.param_infos = _BuildArguments([op.arguments for op in split_operations], interface) |
full_name = '%s.%s' % (interface.id, info.declared_name) |
info.requires_named_arguments = full_name in _methods_with_named_formals |
+ # The arguments in that the original operation took as callbacks (for |
+ # conversion to futures). |
+ info.callback_args = [] |
return info |
+def ConvertToFuture(info): |
+ """Given an OperationInfo object, convert the operation's signature so that it |
+ instead uses futures instead of callbacks.""" |
+ new_info = copy.deepcopy(info) |
+ def IsNotCallbackType(param): |
+ return 'Callback' not in param.type_id |
+ # Success callback is the first argument (change if this no longer holds). |
+ new_info.callback_args = filter( |
+ lambda x: not IsNotCallbackType(x), new_info.param_infos) |
+ new_info.param_infos = filter(IsNotCallbackType, new_info.param_infos) |
+ new_info.type_name = 'Future' |
+ |
+ return new_info |
+ |
def AnalyzeConstructor(interface): |
"""Returns an OperationInfo object for the constructor. |
@@ -341,15 +368,19 @@ class OperationInfo(object): |
right_bracket) |
return ', '.join(argtexts) |
- def ParametersAsArgumentList(self, parameter_count = None): |
+ def ParametersAsArgumentList(self, parameter_count=None): |
"""Returns a string of the parameter names suitable for passing the |
parameters as arguments. |
""" |
+ def param_name(param_info): |
+ if self.requires_named_arguments and param_info.is_optional: |
+ return '%s : %s' % (param_info.name, param_info.name) |
+ else: |
+ return param_info.name |
+ |
if parameter_count is None: |
parameter_count = len(self.param_infos) |
- return ', '.join(map( |
- lambda param_info: param_info.name, |
- self.param_infos[:parameter_count])) |
+ return ', '.join(map(param_name, self.param_infos[:parameter_count])) |
def IsStatic(self): |
is_static = self.overloads[0].is_static |
@@ -1391,6 +1422,7 @@ _idl_type_registry = monitored.Dict('generator._idl_type_registry', { |
suppress_interface=True), |
'FileList': TypeData(clazz='Interface', item_type='File', |
dart_type='List<File>'), |
+ 'Future': TypeData(clazz='Interface', dart_type='Future'), |
'GamepadList': TypeData(clazz='Interface', item_type='Gamepad', |
suppress_interface=True), |
'HTMLAllCollection': TypeData(clazz='Interface', item_type='Node'), |