| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
| 4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 """This module provides shared functionality for systems to generate | 6 """This module provides shared functionality for systems to generate |
| 7 Dart APIs from the IDL database.""" | 7 Dart APIs from the IDL database.""" |
| 8 | 8 |
| 9 import copy | 9 import copy |
| 10 import json | 10 import json |
| (...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 if parameter_count is None: | 536 if parameter_count is None: |
| 537 parameter_count = len(self.param_infos) | 537 parameter_count = len(self.param_infos) |
| 538 if not type_registry: | 538 if not type_registry: |
| 539 return [p.name for p in self.param_infos[:parameter_count]] | 539 return [p.name for p in self.param_infos[:parameter_count]] |
| 540 else: | 540 else: |
| 541 parameters = [] | 541 parameters = [] |
| 542 for p in self.param_infos[:parameter_count]: | 542 for p in self.param_infos[:parameter_count]: |
| 543 type_id = p.type_id | 543 type_id = p.type_id |
| 544 # Unwrap the type to get the JsObject if Type is: | 544 # Unwrap the type to get the JsObject if Type is: |
| 545 # | 545 # |
| 546 # - known IDL type | |
| 547 # - type_id is None then it's probably a union type or overloaded | 546 # - type_id is None then it's probably a union type or overloaded |
| 548 # it's a dynamic/any type | 547 # it's a dynamic/any type |
| 549 # - type is Object | 548 # - type is Object |
| 550 # | 549 # |
| 551 # JsObject maybe stored in the Dart class. | |
| 552 if (wrap_unwrap_type_blink(type_id, type_registry)): | 550 if (wrap_unwrap_type_blink(type_id, type_registry)): |
| 553 type_is_callback = self.isCallback(type_registry, type_id) | 551 type_is_callback = self.isCallback(type_registry, type_id) |
| 554 if (dart_js_interop and type_id == 'EventListener' and | 552 if (dart_js_interop and type_id == 'EventListener' and |
| 555 self.name in ['addEventListener', 'removeEventListener']): | 553 self.name in ['addEventListener', 'removeEventListener']): |
| 556 # Events fired need use a JsFunction not a anonymous closure to | 554 # Events fired need use a JSFunction not a anonymous closure to |
| 557 # insure the event can really be removed. | 555 # insure the event can really be removed. |
| 558 parameters.append('unwrap_jso(js.allowInterop(%s))' % p.name) | 556 parameters.append('js.allowInterop(%s)' % p.name) |
| 559 elif dart_js_interop and type_id == 'FontFaceSetForEachCallback': | 557 # These commented out cases don't actually generate any code. |
| 558 # elif dart_js_interop and type_id == 'FontFaceSetForEachCallback': |
| 560 # forEach is supported in the DOM for FontFaceSet as it iterates | 559 # forEach is supported in the DOM for FontFaceSet as it iterates |
| 561 # over the Javascript Object the callback parameters are also | 560 # over the Javascript Object the callback parameters are also |
| 562 # Javascript objects and must be wrapped. | 561 # Javascript objects and must be wrapped. |
| 563 parameters.append('unwrap_jso((fontFace, fontFaceAgain, set) => %s
(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set)))' % p.name) | 562 # parameters.append('(fontFace, fontFaceAgain, set) => %s(fontFace,
fontFaceAgain, wrap_jso(set))' % p.name) |
| 564 elif dart_js_interop and type_id == 'HeadersForEachCallback': | 563 # elif dart_js_interop and type_id == 'HeadersForEachCallback': |
| 565 # forEach is supported in the DOM for Headers as it iterates | 564 # forEach is supported in the DOM for Headers as it iterates |
| 566 # over the Javascript Object the callback parameters are also | 565 # over the Javascript Object the callback parameters are also |
| 567 # Javascript objects and must be wrapped. | 566 # Javascript objects and must be wrapped. |
| 568 parameters.append('unwrap_jso((String value, String key, map) => %
s(value, key, wrap_jso(map)))' % p.name) | 567 # parameters.append('(String value, String key, map) => %s(value, k
ey, wrap_jso(map))' % p.name) |
| 569 elif dart_js_interop and type_is_callback and not(isRemoveOperation): | 568 elif dart_js_interop and type_is_callback and not(isRemoveOperation): |
| 570 # Any remove operation that has a a callback doesn't need wrapping. | 569 # Any remove operation that has a a callback doesn't need wrapping. |
| 571 # TODO(terry): Kind of hacky but handles all the cases we care about | 570 # TODO(terry): Kind of hacky but handles all the cases we care about |
| 572 callback_type = type_registry._database._all_interfaces[type_id] | 571 callback_type = type_registry._database._all_interfaces[type_id] |
| 573 callback_args_decl = [] | 572 callback_args_decl = [] |
| 574 callback_args_call = [] | 573 callback_args_call = [] |
| 575 for callback_arg in callback_type.operations[0].arguments: | 574 for callback_arg in callback_type.operations[0].arguments: |
| 576 if dart_js_interop: | 575 if dart_js_interop: |
| 577 dart_type = '' # For non-primitives we will be passing JsObject
for non-primitives, so ignore types | 576 dart_type = '' # For non-primitives we will be passing JsObject
for non-primitives, so ignore types |
| 578 else: | 577 else: |
| 579 dart_type = type_registry.DartType(callback_arg.type.id) + ' ' | 578 dart_type = type_registry.DartType(callback_arg.type.id) + ' ' |
| 580 callback_args_decl.append('%s%s' % (dart_type, callback_arg.id)) | 579 callback_args_decl.append('%s%s' % (dart_type, callback_arg.id)) |
| 581 if wrap_unwrap_type_blink(callback_arg.type.id, type_registry): | 580 if wrap_unwrap_type_blink(callback_arg.type.id, type_registry): |
| 582 callback_args_call.append('wrap_jso(%s)' % callback_arg.id) | 581 callback_args_call.append(callback_arg.id) |
| 583 else: | 582 else: |
| 584 callback_args_call.append(callback_arg.id) | 583 callback_args_call.append(callback_arg.id) |
| 585 parameters.append('unwrap_jso((%s) => %s(%s))' % | 584 parameters.append('(%s) => %s(%s)' % |
| 586 (", ".join(callback_args_decl), | 585 (", ".join(callback_args_decl), |
| 587 p.name, | 586 p.name, |
| 588 ", ".join(callback_args_call))) | 587 ", ".join(callback_args_call))) |
| 589 else: | 588 else: |
| 590 parameters.append('unwrap_jso(%s)' % p.name) | 589 parameters.append(p.name) |
| 591 else: | 590 else: |
| 592 if dart_js_interop: | 591 if dart_js_interop: |
| 593 conversion = backend._InputConversion(p.type_id, self.declared_name) | 592 conversion = backend._InputConversion(p.type_id, self.declared_name) |
| 594 passParam = p.name | 593 passParam = p.name |
| 595 if conversion: | 594 if conversion: |
| 596 # Need to pass the IDL Dictionary from Dart Map to JavaScript obje
ct. | 595 # Need to pass the IDL Dictionary from Dart Map to JavaScript obje
ct. |
| 597 passParam = '{0}({1})'.format(conversion.function_name, p.name) | 596 passParam = '{0}({1})'.format(conversion.function_name, p.name) |
| 598 else: | 597 else: |
| 599 passParam = p.name | 598 passParam = p.name |
| 600 parameters.append(passParam) | 599 parameters.append(passParam) |
| (...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1488 class_name = '%sIDLTypeInfo' % type_data.clazz | 1487 class_name = '%sIDLTypeInfo' % type_data.clazz |
| 1489 return globals()[class_name](type_name, type_data) | 1488 return globals()[class_name](type_name, type_data) |
| 1490 | 1489 |
| 1491 def isList(return_type): | 1490 def isList(return_type): |
| 1492 return return_type.startswith('List<') if return_type else False | 1491 return return_type.startswith('List<') if return_type else False |
| 1493 | 1492 |
| 1494 def get_list_type(return_type): | 1493 def get_list_type(return_type): |
| 1495 # Get the list type NNNN inside of List<NNNN> | 1494 # Get the list type NNNN inside of List<NNNN> |
| 1496 return return_type[5:-1] if isList(return_type) else return_type | 1495 return return_type[5:-1] if isList(return_type) else return_type |
| 1497 | 1496 |
| 1497 # TODO(jacobr): remove these obsolete methods as we don't actually |
| 1498 # perform any wrapping. |
| 1498 def wrap_unwrap_list_blink(return_type, type_registry): | 1499 def wrap_unwrap_list_blink(return_type, type_registry): |
| 1499 """Return True if the type is the list type is a blink know | 1500 """Return True if the type is the list type is a blink know |
| 1500 type e.g., List<Node>, List<FontFace>, etc.""" | 1501 type e.g., List<Node>, List<FontFace>, etc.""" |
| 1501 if isList(return_type): | 1502 if isList(return_type): |
| 1502 list_type = get_list_type(return_type) | 1503 list_type = get_list_type(return_type) |
| 1503 if type_registry.HasInterface(list_type): | 1504 if type_registry.HasInterface(list_type): |
| 1504 return True; | 1505 return True; |
| 1505 | 1506 |
| 1506 def wrap_unwrap_type_blink(return_type, type_registry): | 1507 def wrap_unwrap_type_blink(return_type, type_registry): |
| 1507 """Returns True if the type is a blink type that requires wrap_jso or | 1508 """Returns True if the type is a blink type that requires wrap_jso or |
| 1508 unwrap_jso""" | 1509 unwrap_jso""" |
| 1509 if return_type and return_type.startswith('Html'): | 1510 if return_type and return_type.startswith('Html'): |
| 1510 return_type = return_type.replace('Html', 'HTML', 1) | 1511 return_type = return_type.replace('Html', 'HTML', 1) |
| 1511 return (type_registry.HasInterface(return_type) or not(return_type) or | 1512 return (not(return_type) or |
| 1512 return_type == 'Object' or | 1513 return_type == 'Object' or |
| 1513 return_type == 'dynamic' or | 1514 return_type == 'dynamic') |
| 1514 return_type == 'Future' or | |
| 1515 return_type == 'SqlDatabase' or # renamed to Database | |
| 1516 return_type == 'HTMLElement' or | |
| 1517 return_type == 'MutationObserver' or | |
| 1518 (return_type.endswith('[]') and return_type != 'DOMString[]')) | |
| 1519 | 1515 |
| 1520 def wrap_type_blink(return_type, type_registry): | 1516 def wrap_type_blink(return_type, type_registry): |
| 1521 """Returns True if the type is a blink type that requires wrap_jso but | 1517 """Returns True if the type is a blink type that requires wrap_jso but |
| 1522 NOT unwrap_jso""" | 1518 NOT unwrap_jso""" |
| 1523 return (return_type == 'Map' or | 1519 return (return_type == 'Map' or |
| 1524 return_type == 'Rectangle') | 1520 return_type == 'Rectangle') |
| 1525 | 1521 |
| 1526 def wrap_return_type_blink(return_type, type_name, type_registry): | 1522 def wrap_return_type_blink(return_type, type_name, type_registry): |
| 1527 """Returns True if we should wrap the returned value. This checks | 1523 """Returns True if we should wrap the returned value. This checks |
| 1528 a number of different variations, calling the more basic functions | 1524 a number of different variations, calling the more basic functions |
| 1529 above.""" | 1525 above.""" |
| 1530 return (wrap_unwrap_type_blink(return_type, type_registry) or | 1526 return (wrap_unwrap_type_blink(return_type, type_registry) or |
| 1531 wrap_unwrap_type_blink(type_name, type_registry) or | 1527 wrap_unwrap_type_blink(type_name, type_registry) or |
| 1532 wrap_type_blink(return_type, type_registry) or | 1528 wrap_type_blink(return_type, type_registry) or |
| 1533 wrap_unwrap_list_blink(return_type, type_registry)) | 1529 wrap_unwrap_list_blink(return_type, type_registry)) |
| OLD | NEW |