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 the systems to generate | 6 """This module provides shared functionality for the systems to generate |
7 native binding from the IDL database.""" | 7 native binding from the IDL database.""" |
8 | 8 |
9 import emitter | 9 import emitter |
10 import os | 10 import os |
(...skipping 21 matching lines...) Expand all Loading... |
32 ('DOMWindow', 'storage'): 'DOMWindowQuota', | 32 ('DOMWindow', 'storage'): 'DOMWindowQuota', |
33 ('DOMWindow', 'webkitStorageInfo'): 'DOMWindowQuota', | 33 ('DOMWindow', 'webkitStorageInfo'): 'DOMWindowQuota', |
34 ('DOMWindow', 'openDatabase'): 'DOMWindowWebDatabase', | 34 ('DOMWindow', 'openDatabase'): 'DOMWindowWebDatabase', |
35 ('DOMWindow', 'webkitRequestFileSystem'): 'DOMWindowFileSystem', | 35 ('DOMWindow', 'webkitRequestFileSystem'): 'DOMWindowFileSystem', |
36 ('DOMWindow', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem', | 36 ('DOMWindow', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem', |
37 ('DOMWindow', 'atob'): 'DOMWindowBase64', | 37 ('DOMWindow', 'atob'): 'DOMWindowBase64', |
38 ('DOMWindow', 'btoa'): 'DOMWindowBase64', | 38 ('DOMWindow', 'btoa'): 'DOMWindowBase64', |
39 ('DOMWindow', 'clearTimeout'): 'DOMWindowTimers', | 39 ('DOMWindow', 'clearTimeout'): 'DOMWindowTimers', |
40 ('DOMWindow', 'clearInterval'): 'DOMWindowTimers', | 40 ('DOMWindow', 'clearInterval'): 'DOMWindowTimers', |
41 ('DOMWindow', 'createImageBitmap'): 'ImageBitmapFactories', | 41 ('DOMWindow', 'createImageBitmap'): 'ImageBitmapFactories', |
| 42 ('Element', 'animate'): 'ElementAnimation', |
42 ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem', | 43 ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem', |
43 ('HTMLVideoElement', 'getVideoPlaybackQuality'): 'HTMLVideoElementMediaSource'
, | 44 ('HTMLVideoElement', 'getVideoPlaybackQuality'): 'HTMLVideoElementMediaSource'
, |
44 ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack', | 45 ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack', |
45 ('Navigator', 'geolocation'): 'NavigatorGeolocation', | 46 ('Navigator', 'geolocation'): 'NavigatorGeolocation', |
46 ('Navigator', 'webkitPersistentStorage'): 'NavigatorStorageQuota', | 47 ('Navigator', 'webkitPersistentStorage'): 'NavigatorStorageQuota', |
47 ('Navigator', 'webkitTemporaryStorage'): 'NavigatorStorageQuota', | 48 ('Navigator', 'webkitTemporaryStorage'): 'NavigatorStorageQuota', |
48 ('Navigator', 'registerProtocolHandler'): 'NavigatorContentUtils', | 49 ('Navigator', 'registerProtocolHandler'): 'NavigatorContentUtils', |
49 ('Navigator', 'unregisterProtocolHandler'): 'NavigatorContentUtils', | 50 ('Navigator', 'unregisterProtocolHandler'): 'NavigatorContentUtils', |
50 ('Navigator', 'webkitGetUserMedia'): 'NavigatorMediaStream', | 51 ('Navigator', 'webkitGetUserMedia'): 'NavigatorMediaStream', |
51 ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad', | 52 ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad', |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): | 193 if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): |
193 return | 194 return |
194 | 195 |
195 cpp_impl_includes = set(['"' + partial + '.h"' | 196 cpp_impl_includes = set(['"' + partial + '.h"' |
196 for partial in _GetCPPPartialNames(self._interface)
]) | 197 for partial in _GetCPPPartialNames(self._interface)
]) |
197 cpp_header_handlers_emitter = emitter.Emitter() | 198 cpp_header_handlers_emitter = emitter.Emitter() |
198 cpp_impl_handlers_emitter = emitter.Emitter() | 199 cpp_impl_handlers_emitter = emitter.Emitter() |
199 class_name = 'Dart%s' % self._interface.id | 200 class_name = 'Dart%s' % self._interface.id |
200 for operation in self._interface.operations: | 201 for operation in self._interface.operations: |
201 function_name = operation.id | 202 function_name = operation.id |
| 203 return_type = self.SecureOutputType(operation.type.id) |
202 parameters = [] | 204 parameters = [] |
203 arguments = [] | 205 arguments = [] |
204 if operation.ext_attrs.get('CallWith') == 'ThisValue': | 206 if operation.ext_attrs.get('CallWith') == 'ThisValue': |
205 parameters.append('ScriptValue scriptValue') | 207 parameters.append('ScriptValue scriptValue') |
206 conversion_includes = [] | 208 conversion_includes = [] |
207 for argument in operation.arguments: | 209 for argument in operation.arguments: |
208 argument_type_info = self._TypeInfo(argument.type.id) | 210 argument_type_info = self._TypeInfo(argument.type.id) |
209 parameters.append('%s %s' % (argument_type_info.parameter_type(), | 211 parameters.append('%s %s' % (argument_type_info.parameter_type(), |
210 argument.id)) | 212 argument.id)) |
211 arguments.append(argument_type_info.to_dart_conversion(argument.id)) | 213 arguments.append(argument_type_info.to_dart_conversion(argument.id)) |
212 conversion_includes.extend(argument_type_info.conversion_includes()) | 214 conversion_includes.extend(argument_type_info.conversion_includes()) |
213 | 215 |
214 # FIXME(vsm): Handle ThisValue attribute. | 216 # FIXME(vsm): Handle ThisValue attribute. |
| 217 if (return_type == 'void'): |
| 218 ret = '' |
| 219 else: |
| 220 ret = ' return 0;\n' |
| 221 |
215 if operation.ext_attrs.get('CallWith') == 'ThisValue': | 222 if operation.ext_attrs.get('CallWith') == 'ThisValue': |
216 cpp_header_handlers_emitter.Emit( | 223 cpp_header_handlers_emitter.Emit( |
217 '\n' | 224 '\n' |
218 ' virtual bool $FUNCTION($PARAMETERS) {\n' | 225 ' virtual $RETURN_TYPE $FUNCTION($PARAMETERS) {\n' |
219 ' DART_UNIMPLEMENTED();\n' | 226 ' DART_UNIMPLEMENTED();\n' |
220 ' return false;\n' | 227 '$RET' |
221 ' }\n', | 228 ' }\n', |
| 229 RETURN_TYPE=return_type, |
| 230 RET=ret, |
222 FUNCTION=function_name, | 231 FUNCTION=function_name, |
223 PARAMETERS=', '.join(parameters)) | 232 PARAMETERS=', '.join(parameters)) |
224 continue | 233 continue |
225 | 234 |
226 cpp_header_handlers_emitter.Emit( | 235 cpp_header_handlers_emitter.Emit( |
227 '\n' | 236 '\n' |
228 ' virtual bool $FUNCTION($PARAMETERS);\n', | 237 ' virtual $RETURN_TYPE $FUNCTION($PARAMETERS);\n', |
| 238 RETURN_TYPE=return_type, |
229 FUNCTION=function_name, | 239 FUNCTION=function_name, |
230 PARAMETERS=', '.join(parameters)) | 240 PARAMETERS=', '.join(parameters)) |
231 | 241 |
232 if 'Custom' in operation.ext_attrs: | 242 if 'Custom' in operation.ext_attrs: |
233 continue | 243 continue |
234 | 244 |
235 cpp_impl_includes |= set(conversion_includes) | 245 cpp_impl_includes |= set(conversion_includes) |
236 arguments_declaration = 'Dart_Handle arguments[] = { %s }' % ', '.join(arg
uments) | 246 arguments_declaration = 'Dart_Handle arguments[] = { %s }' % ', '.join(arg
uments) |
237 if not len(arguments): | 247 if not len(arguments): |
238 arguments_declaration = 'Dart_Handle* arguments = 0' | 248 arguments_declaration = 'Dart_Handle* arguments = 0' |
| 249 if (return_type == 'void'): |
| 250 ret1 = 'return' |
| 251 ret2 = '' |
| 252 else: |
| 253 ret1 = 'return 0' |
| 254 ret2 = ' return' |
239 cpp_impl_handlers_emitter.Emit( | 255 cpp_impl_handlers_emitter.Emit( |
240 '\n' | 256 '\n' |
241 'bool $CLASS_NAME::$FUNCTION($PARAMETERS)\n' | 257 '$RETURN_TYPE $CLASS_NAME::$FUNCTION($PARAMETERS)\n' |
242 '{\n' | 258 '{\n' |
243 ' if (!m_callback.isIsolateAlive())\n' | 259 ' if (!m_callback.isIsolateAlive())\n' |
244 ' return false;\n' | 260 ' $RET1;\n' |
245 ' DartIsolateScope scope(m_callback.isolate());\n' | 261 ' DartIsolateScope scope(m_callback.isolate());\n' |
246 ' DartApiScope apiScope;\n' | 262 ' DartApiScope apiScope;\n' |
247 ' $ARGUMENTS_DECLARATION;\n' | 263 ' $ARGUMENTS_DECLARATION;\n' |
248 ' return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' | 264 ' $RET2 m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' |
249 '}\n', | 265 '}\n', |
| 266 RETURN_TYPE=return_type, |
| 267 RET1=ret1, |
| 268 RET2=ret2, |
250 CLASS_NAME=class_name, | 269 CLASS_NAME=class_name, |
251 FUNCTION=function_name, | 270 FUNCTION=function_name, |
252 PARAMETERS=', '.join(parameters), | 271 PARAMETERS=', '.join(parameters), |
253 ARGUMENTS_DECLARATION=arguments_declaration, | 272 ARGUMENTS_DECLARATION=arguments_declaration, |
254 ARGUMENT_COUNT=len(arguments)) | 273 ARGUMENT_COUNT=len(arguments)) |
255 | 274 |
256 cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( | 275 cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( |
257 self._interface.id, | 276 self._interface.id, |
258 self._renamer.GetLibraryName(self._interface), | 277 self._renamer.GetLibraryName(self._interface), |
259 True) | 278 True) |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 ' }\n' | 520 ' }\n' |
502 ' }\n' | 521 ' }\n' |
503 ' }\n' | 522 ' }\n' |
504 ' }\n', | 523 ' }\n', |
505 INTERFACE=self._interface.id) | 524 INTERFACE=self._interface.id) |
506 | 525 |
507 if ('CustomToV8' in ext_attrs or | 526 if ('CustomToV8' in ext_attrs or |
508 'PureInterface' in ext_attrs or | 527 'PureInterface' in ext_attrs or |
509 'CPPPureInterface' in ext_attrs or | 528 'CPPPureInterface' in ext_attrs or |
510 'SpecialWrapFor' in ext_attrs or | 529 'SpecialWrapFor' in ext_attrs or |
| 530 ('Custom' in ext_attrs and ext_attrs['Custom'] == 'Wrap') or |
| 531 ('Custom' in ext_attrs and ext_attrs['Custom'] == 'ToV8') or |
511 self._interface_type_info.custom_to_dart()): | 532 self._interface_type_info.custom_to_dart()): |
512 to_dart_emitter.Emit( | 533 to_dart_emitter.Emit( |
513 ' static Dart_Handle createWrapper(DartDOMData* domData, NativeType
* value);\n') | 534 ' static Dart_Handle createWrapper(DartDOMData* domData, NativeType
* value);\n') |
514 else: | 535 else: |
515 to_dart_emitter.Emit( | 536 to_dart_emitter.Emit( |
516 ' static Dart_Handle createWrapper(DartDOMData* domData, NativeType
* value)\n' | 537 ' static Dart_Handle createWrapper(DartDOMData* domData, NativeType
* value)\n' |
517 ' {\n' | 538 ' {\n' |
518 ' return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domDat
a, value);\n' | 539 ' return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domDat
a, value);\n' |
519 ' }\n', | 540 ' }\n', |
520 INTERFACE=self._interface.id) | 541 INTERFACE=self._interface.id) |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 if attr.id == 'operator': | 600 if attr.id == 'operator': |
580 webcore_function_name = '_operator' | 601 webcore_function_name = '_operator' |
581 elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': | 602 elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': |
582 webcore_function_name = 'svgTarget' | 603 webcore_function_name = 'svgTarget' |
583 elif attr.id == 'CSS': | 604 elif attr.id == 'CSS': |
584 webcore_function_name = 'css' | 605 webcore_function_name = 'css' |
585 else: | 606 else: |
586 webcore_function_name = self._ToWebKitName(attr.id) | 607 webcore_function_name = self._ToWebKitName(attr.id) |
587 | 608 |
588 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, attr) | 609 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, attr) |
| 610 raises = ('RaisesException' in attr.ext_attrs and |
| 611 attr.ext_attrs['RaisesException'] != 'Setter') |
589 self._GenerateNativeCallback( | 612 self._GenerateNativeCallback( |
590 cpp_callback_name, | 613 cpp_callback_name, |
591 True, | 614 True, |
592 function_expression, | 615 function_expression, |
593 attr, | 616 attr, |
594 [], | 617 [], |
595 attr.type.id, | 618 attr.type.id, |
596 attr.type.nullable, | 619 attr.type.nullable, |
597 'GetterRaisesException' in attr.ext_attrs or 'RaisesException' in attr.e
xt_attrs, | 620 raises, |
598 auto_scope_setup) | 621 auto_scope_setup) |
599 | 622 |
600 def _AddSetter(self, attr, html_name): | 623 def _AddSetter(self, attr, html_name): |
601 type_info = self._TypeInfo(attr.type.id) | 624 type_info = self._TypeInfo(attr.type.id) |
602 dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr
.type.id)) | 625 dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr
.type.id)) |
603 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext
_attrs) | 626 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext
_attrs) |
604 native_suffix = 'Setter' | 627 native_suffix = 'Setter' |
605 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) | 628 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) |
606 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, | 629 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, |
607 dart_declaration, native_suffix, is_custom, auto_scope_setup) | 630 dart_declaration, native_suffix, is_custom, auto_scope_setup) |
608 if is_custom: | 631 if is_custom: |
609 return | 632 return |
610 | 633 |
611 if 'Reflect' in attr.ext_attrs: | 634 if 'Reflect' in attr.ext_attrs: |
612 webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name() | 635 webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name() |
613 else: | 636 else: |
| 637 if 'ImplementedAs' in attr.ext_attrs: |
| 638 attr_name = attr.ext_attrs['ImplementedAs'] |
| 639 else: |
| 640 attr_name = attr.id |
614 webcore_function_name = re.sub(r'^(xml|css|(?=[A-Z])|\w)', | 641 webcore_function_name = re.sub(r'^(xml|css|(?=[A-Z])|\w)', |
615 lambda s: s.group(1).upper(), | 642 lambda s: s.group(1).upper(), |
616 attr.id) | 643 attr_name) |
617 webcore_function_name = 'set%s' % webcore_function_name | 644 webcore_function_name = 'set%s' % webcore_function_name |
618 | 645 |
619 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, attr) | 646 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, attr) |
| 647 raises = ('RaisesException' in attr.ext_attrs and |
| 648 attr.ext_attrs['RaisesException'] != 'Getter') |
620 self._GenerateNativeCallback( | 649 self._GenerateNativeCallback( |
621 cpp_callback_name, | 650 cpp_callback_name, |
622 True, | 651 True, |
623 function_expression, | 652 function_expression, |
624 attr, | 653 attr, |
625 [attr], | 654 [attr], |
626 'void', | 655 'void', |
627 False, | 656 False, |
628 'SetterRaisesException' in attr.ext_attrs, | 657 raises, |
629 auto_scope_setup, | 658 auto_scope_setup, |
630 generate_custom_element_scope_if_needed=True) | 659 generate_custom_element_scope_if_needed=True) |
631 | 660 |
632 def AddIndexer(self, element_type): | 661 def AddIndexer(self, element_type): |
633 """Adds all the methods required to complete implementation of List.""" | 662 """Adds all the methods required to complete implementation of List.""" |
634 # We would like to simply inherit the implementation of everything except | 663 # We would like to simply inherit the implementation of everything except |
635 # length, [], and maybe []=. It is possible to extend from a base | 664 # length, [], and maybe []=. It is possible to extend from a base |
636 # array implementation class only when there is no other implementation | 665 # array implementation class only when there is no other implementation |
637 # inheritance. There might be no implementation inheritance other than | 666 # inheritance. There might be no implementation inheritance other than |
638 # DOMBaseWrapper for many classes, but there might be some where the | 667 # DOMBaseWrapper for many classes, but there might be some where the |
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 ' goto fail;\n' | 1104 ' goto fail;\n' |
1076 ' }\n') | 1105 ' }\n') |
1077 | 1106 |
1078 | 1107 |
1079 if needs_receiver: | 1108 if needs_receiver: |
1080 interface_name = self._interface_type_info.native_type() | 1109 interface_name = self._interface_type_info.native_type() |
1081 # Hack to determine if this came from the _cpp_callback_map. | 1110 # Hack to determine if this came from the _cpp_callback_map. |
1082 # In this case, the getter is mapped to a static method. | 1111 # In this case, the getter is mapped to a static method. |
1083 if (not function_expression.startswith('receiver->') and | 1112 if (not function_expression.startswith('receiver->') and |
1084 not function_expression.startswith(interface_name + '::')): | 1113 not function_expression.startswith(interface_name + '::')): |
1085 if interface_name == 'DOMWindow' or interface_name == 'Navigator' or int
erface_name == 'WorkerGlobalScope': | 1114 if interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobal
Scope']: |
1086 cpp_arguments.insert(0, 'receiver') | 1115 cpp_arguments.insert(0, 'receiver') |
1087 else: | 1116 else: |
1088 cpp_arguments.append('receiver') | 1117 cpp_arguments.append('receiver') |
1089 elif self._IsStatic(node.id): | 1118 elif self._IsStatic(node.id): |
1090 cpp_arguments.insert(0, 'receiver') | 1119 cpp_arguments.insert(0, 'receiver') |
1091 | 1120 |
1092 function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments)) | 1121 function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments)) |
1093 if return_type == 'void': | 1122 if return_type == 'void': |
1094 invocation_emitter.Emit( | 1123 invocation_emitter.Emit( |
1095 ' $FUNCTION_CALL;\n', | 1124 ' $FUNCTION_CALL;\n', |
1096 FUNCTION_CALL=function_call) | 1125 FUNCTION_CALL=function_call) |
1097 else: | 1126 else: |
1098 return_type_info = self._TypeInfo(return_type) | 1127 return_type_info = self._TypeInfo(return_type) |
1099 self._cpp_impl_includes |= set(return_type_info.conversion_includes()) | 1128 self._cpp_impl_includes |= set(return_type_info.conversion_includes()) |
1100 | 1129 |
1101 if return_type_is_nullable: | 1130 if return_type_is_nullable: |
1102 invocation_emitter.Emit( | 1131 invocation_emitter.Emit( |
1103 ' bool isNull = false;\n' | 1132 ' bool isNull = false;\n' |
1104 ' $NATIVE_TYPE result = $FUNCTION_CALL;\n' | 1133 ' $NATIVE_TYPE result = $FUNCTION_CALL;\n' |
1105 ' if (isNull)\n' | 1134 ' if (isNull)\n' |
1106 ' return;\n', | 1135 ' return;\n', |
1107 NATIVE_TYPE=return_type_info.native_type(), | 1136 NATIVE_TYPE=return_type_info.parameter_type(), |
1108 FUNCTION_CALL=function_call) | 1137 FUNCTION_CALL=function_call) |
1109 value_expression = 'result' | 1138 value_expression = 'result' |
1110 else: | 1139 else: |
1111 value_expression = function_call | 1140 value_expression = function_call |
1112 | 1141 |
1113 # Generate to Dart conversion of C++ value. | 1142 # Generate to Dart conversion of C++ value. |
1114 if return_type_info.dart_type() == 'bool': | 1143 if return_type_info.dart_type() == 'bool': |
1115 set_return_value = 'Dart_SetBooleanReturnValue(args, %s)' % (value_expre
ssion) | 1144 set_return_value = 'Dart_SetBooleanReturnValue(args, %s)' % (value_expre
ssion) |
1116 elif return_type_info.dart_type() == 'int': | 1145 elif return_type_info.dart_type() == 'int': |
1117 if return_type_info.native_type() == 'unsigned': | 1146 if return_type_info.native_type() == 'unsigned': |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 e.Emit("};\n"); | 1402 e.Emit("};\n"); |
1374 e.Emit('\n'); | 1403 e.Emit('\n'); |
1375 e.Emit('} // namespace WebCore\n'); | 1404 e.Emit('} // namespace WebCore\n'); |
1376 | 1405 |
1377 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): | 1406 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): |
1378 return ( | 1407 return ( |
1379 interface.id.endswith('Event') and | 1408 interface.id.endswith('Event') and |
1380 operation.id.startswith('init') and | 1409 operation.id.startswith('init') and |
1381 argument.ext_attrs.get('Default') == 'Undefined' and | 1410 argument.ext_attrs.get('Default') == 'Undefined' and |
1382 argument.type.id == 'DOMString') | 1411 argument.type.id == 'DOMString') |
OLD | NEW |