| Index: tools/dom/scripts/generator.py
|
| diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
|
| index 688a5f9f193ea3302d4bfabe4c12a19f119d8d39..8c12e2e6f7781ce08151d860b9621b837c62bbc7 100644
|
| --- a/tools/dom/scripts/generator.py
|
| +++ b/tools/dom/scripts/generator.py
|
| @@ -167,7 +167,7 @@ _dart2js_dom_custom_native_specs = monitored.Dict(
|
|
|
| 'RTCIceCandidate': 'RTCIceCandidate,mozRTCIceCandidate',
|
|
|
| - 'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent',
|
| + 'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent',
|
|
|
| 'RTCSessionDescription': 'RTCSessionDescription,mozRTCSessionDescription',
|
|
|
| @@ -514,21 +514,19 @@ class OperationInfo(object):
|
| parameter_count = len(self.param_infos)
|
| return ', '.join(map(param_name, self.param_infos[:parameter_count]))
|
|
|
| - def wrap_unwrap_list_blink(self, return_type, type_registry):
|
| - """Return True if the type is a List<Node>"""
|
| - return return_type.startswith('List<Node>')
|
| -
|
| - def wrap_unwrap_type_blink(self, return_type, type_registry):
|
| - """Returns True if the type is a blink type that requires wrap_jso or unwrap_jso.
|
| - Notice we look for any class that starts with HtmlNNNN e.g., HtmlDocument, etc. """
|
| - return (type_registry.HasInterface(return_type) or not(return_type) or
|
| - return_type == 'Object' or return_type.startswith('Html') or
|
| - return_type == 'MutationObserver')
|
| + def isCallback(self, type_registry, type_id):
|
| + if type_id:
|
| + callback_type = type_registry._database._all_interfaces[type_id]
|
| + return callback_type.operations[0].id == 'handleEvent' if len(callback_type.operations) > 0 else False
|
| + else:
|
| + return False
|
|
|
| def ParametersAsListOfVariables(self, parameter_count=None, type_registry=None, dart_js_interop=False):
|
| """Returns a list of the first parameter_count parameter names
|
| as raw variables.
|
| """
|
| + isRemoveOperation = self.name == 'removeEventListener' or self.name == 'removeListener'
|
| +
|
| if parameter_count is None:
|
| parameter_count = len(self.param_infos)
|
| if not type_registry:
|
| @@ -545,11 +543,47 @@ class OperationInfo(object):
|
| # - type is Object
|
| #
|
| # JsObject maybe stored in the Dart class.
|
| - if (self.wrap_unwrap_type_blink(type_id, type_registry)):
|
| - if dart_js_interop and type_id == 'EventListener' and (self.name == 'addEventListener' or
|
| - self.name == 'addListener'):
|
| - # Events fired need to wrap the Javascript Object passed as a parameter in event.
|
| - parameters.append('unwrap_jso((Event event) => %s(wrap_jso(event)))' % p.name)
|
| + if (wrap_unwrap_type_blink(type_id, type_registry)):
|
| + type_is_callback = self.isCallback(type_registry, type_id)
|
| + if (dart_js_interop and type_id == 'EventListener' and
|
| + (self.name == 'addEventListener')):
|
| + # Events fired need use a JsFunction not a anonymous closure to
|
| + # insure the event can really be removed.
|
| + parameters.append('wrap_event_listener(this, %s)' % p.name)
|
| + elif (dart_js_interop and type_id == 'EventListener' and
|
| + (self.name == 'removeEventListener')):
|
| + # Find the JsFunction that corresponds to this Dart function.
|
| + parameters.append('_knownListeners[this.hashCode][identityHashCode(%s)]' % p.name)
|
| + elif dart_js_interop and type_id == 'FontFaceSetForEachCallback':
|
| + # forEach is supported in the DOM for FontFaceSet as it iterates
|
| + # over the Javascript Object the callback parameters are also
|
| + # Javascript objects and must be wrapped.
|
| + parameters.append('unwrap_jso((fontFace, fontFaceAgain, set) => %s(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set)))' % p.name)
|
| + elif dart_js_interop and type_id == 'HeadersForEachCallback':
|
| + # forEach is supported in the DOM for Headers as it iterates
|
| + # over the Javascript Object the callback parameters are also
|
| + # Javascript objects and must be wrapped.
|
| + parameters.append('unwrap_jso((String value, String key, map) => %s(value, key, wrap_jso(map)))' % p.name)
|
| + elif dart_js_interop and type_is_callback and not(isRemoveOperation):
|
| + # Any remove operation that has a a callback doesn't need wrapping.
|
| + # TODO(terry): Kind of hacky but handles all the cases we care about
|
| + callback_type = type_registry._database._all_interfaces[type_id]
|
| + callback_args_decl = []
|
| + callback_args_call = []
|
| + for callback_arg in callback_type.operations[0].arguments:
|
| + if dart_js_interop:
|
| + dart_type = '' # For non-primitives we will be passing JsObject for non-primitives, so ignore types
|
| + else:
|
| + dart_type = type_registry.DartType(callback_arg.type.id) + ' '
|
| + callback_args_decl.append('%s%s' % (dart_type, callback_arg.id))
|
| + if wrap_unwrap_type_blink(callback_arg.type.id, type_registry):
|
| + callback_args_call.append('wrap_jso(%s)' % callback_arg.id)
|
| + else:
|
| + callback_args_call.append(callback_arg.id)
|
| + parameters.append('unwrap_jso((%s) => %s(%s))' %
|
| + (", ".join(callback_args_decl),
|
| + p.name,
|
| + ", ".join(callback_args_call)))
|
| else:
|
| parameters.append('unwrap_jso(%s)' % p.name)
|
| else:
|
| @@ -1396,3 +1430,34 @@ class TypeRegistry(object):
|
|
|
| class_name = '%sIDLTypeInfo' % type_data.clazz
|
| return globals()[class_name](type_name, type_data)
|
| +
|
| +def wrap_unwrap_list_blink(return_type, type_registry):
|
| + """Return True if the type is a List<Node>"""
|
| + return return_type.startswith('List<Node>')
|
| +
|
| +def wrap_unwrap_type_blink(return_type, type_registry):
|
| + """Returns True if the type is a blink type that requires wrap_jso or
|
| + unwrap_jso"""
|
| + if return_type and return_type.startswith('Html'):
|
| + return_type = return_type.replace('Html', 'HTML', 1)
|
| + return (type_registry.HasInterface(return_type) or not(return_type) or
|
| + return_type == 'Object' or
|
| + return_type == 'Future' or
|
| + return_type == 'SqlDatabase' or # renamed to Database
|
| + return_type == 'HTMLElement' or
|
| + return_type == 'MutationObserver')
|
| +
|
| +def wrap_type_blink(return_type, type_registry):
|
| + """Returns True if the type is a blink type that requires wrap_jso but
|
| + NOT unwrap_jso"""
|
| + return (return_type == 'Map' or
|
| + return_type == 'Rectangle')
|
| +
|
| +def wrap_return_type_blink(return_type, type_name, type_registry):
|
| + """Returns True if we should wrap the returned value. This checks
|
| + a number of different variations, calling the more basic functions
|
| + above."""
|
| + return (wrap_unwrap_type_blink(return_type, type_registry) or
|
| + wrap_unwrap_type_blink(type_name, type_registry) or
|
| + wrap_type_blink(return_type, type_registry) or
|
| + wrap_unwrap_list_blink(return_type, type_registry))
|
|
|