Index: tools/dom/scripts/htmldartgenerator.py |
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py |
index 2b2b0847e918c1880e5cd4f81e7ba974b88248db..2f13d48413ebdeb932b5feeb23da072e6ce06d18 100644 |
--- a/tools/dom/scripts/htmldartgenerator.py |
+++ b/tools/dom/scripts/htmldartgenerator.py |
@@ -10,7 +10,8 @@ import emitter |
from generator import AnalyzeOperation, ConstantOutputOrder, \ |
DartDomNameOfAttribute, FindMatchingAttribute, IsDartCollectionType, \ |
IsPureInterface, TypeOrNothing, GetAnnotationsAndComments, \ |
- FormatAnnotationsAndComments |
+ FormatAnnotationsAndComments, ConvertToFuture, GetCallbackInfo |
+from htmlrenamer import convert_to_future_members |
# Types that are accessible cross-frame in a limited fashion. |
# In these cases, the base type (e.g., WindowBase) provides restricted access |
@@ -89,6 +90,9 @@ class HtmlDartGenerator(object): |
operations = operationsById[id] |
info = AnalyzeOperation(interface, operations) |
self.AddOperation(info, declare_only) |
+ if ('%s.%s' % (interface.id, info.declared_name) in |
+ convert_to_future_members): |
+ self.AddOperation(ConvertToFuture(info), declare_only) |
def AddSecondaryMembers(self, interface): |
# With multiple inheritance, attributes and operations of non-first |
@@ -454,6 +458,50 @@ class HtmlDartGenerator(object): |
GenerateCall, |
IsOptional) |
+ def _AddFutureifiedOperation(self, info, html_name): |
+ """Given a API function that uses callbacks, convert it to using Futures. |
+ |
+ This conversion assumes the success callback is always provided before the |
+ error callback (and so far in the DOM API, this is the case).""" |
+ callback_info = GetCallbackInfo( |
+ self._database.GetInterface(info.callback_args[0].type_id)) |
+ |
+ param_list = info.ParametersAsArgumentList() |
+ annotations = '' |
+ if '_RenamingAnnotation' in dir(self): |
+ annotations = (self._RenamingAnnotation(info.declared_name, html_name) + |
+ self._Annotations(info.type_name, info.declared_name)) |
+ self._members_emitter.Emit( |
+ '\n' |
+ ' $ANNOTATIONS$MODIFIERS$TYPE$FUTURE_GENERIC $NAME($PARAMS) {\n' |
+ ' var completer = new Completer$(FUTURE_GENERIC)();\n' |
+ ' $ORIGINAL_FUNCTION($PARAMS_LIST\n' |
+ ' $NAMED_PARAM($VARIABLE_NAME) { ' |
+ 'completer.complete($VARIABLE_NAME); }' |
+ '$ERROR_CALLBACK);\n' |
+ ' return completer.future;\n' |
+ ' }\n', |
+ ANNOTATIONS=annotations, |
+ MODIFIERS='static ' if info.IsStatic() else '', |
+ TYPE=self.SecureOutputType(info.type_name), |
+ NAME=html_name[1:], |
+ PARAMS=info.ParametersDeclaration(self._NarrowInputType |
+ if '_NarrowInputType' in dir(self) else self._DartType), |
+ PARAMS_LIST='' if param_list == '' else param_list + ',', |
+ NAMED_PARAM=('%s : ' % info.callback_args[0].name |
+ if info.requires_named_arguments and |
+ info.callback_args[0].is_optional else ''), |
+ VARIABLE_NAME= '' if len(callback_info.param_infos) == 0 else 'value', |
+ ERROR_CALLBACK=('' if len(info.callback_args) == 1 else |
+ (',\n %s(error) { completer.completeError(error); }' % |
+ ('%s : ' % info.callback_args[1].name |
+ if info.requires_named_arguments and |
+ info.callback_args[1].is_optional else ''))), |
+ FUTURE_GENERIC = ('' if len(callback_info.param_infos) == 0 or |
+ not callback_info.param_infos[0].type_id else |
+ '<%s>' % self._DartType(callback_info.param_infos[0].type_id)), |
+ ORIGINAL_FUNCTION = html_name) |
+ |
def EmitHelpers(self, base_class): |
pass |