| 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 | 
| 11 from generator import * | 11 from generator import * | 
| 12 from htmldartgenerator import * | 12 from htmldartgenerator import * | 
| 13 from idlnode import IDLArgument, IDLAttribute | 13 from idlnode import IDLArgument, IDLAttribute | 
| 14 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES | 14 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES | 
| 15 | 15 | 
| 16 # TODO(vsm): This logic needs to pulled from the source IDL.  These tables are | 16 # TODO(vsm): This logic needs to pulled from the source IDL.  These tables are | 
| 17 # an ugly workaround. | 17 # an ugly workaround. | 
| 18 _cpp_callback_map = { | 18 _cpp_callback_map = { | 
| 19   ('DataTransferItem', 'webkitGetAsEntry'): 'DataTransferItemFileSystem', | 19   ('DataTransferItem', 'webkitGetAsEntry'): 'DataTransferItemFileSystem', | 
|  | 20   ('Document', 'fonts'): 'DocumentFontFaceSet', | 
| 20   ('Document', 'webkitIsFullScreen'): 'DocumentFullscreen', | 21   ('Document', 'webkitIsFullScreen'): 'DocumentFullscreen', | 
| 21   ('Document', 'webkitFullScreenKeyboardInputAllowed'): 'DocumentFullscreen', | 22   ('Document', 'webkitFullScreenKeyboardInputAllowed'): 'DocumentFullscreen', | 
| 22   ('Document', 'webkitCurrentFullScreenElement'): 'DocumentFullscreen', | 23   ('Document', 'webkitCurrentFullScreenElement'): 'DocumentFullscreen', | 
| 23   ('Document', 'webkitCancelFullScreen'): 'DocumentFullscreen', | 24   ('Document', 'webkitCancelFullScreen'): 'DocumentFullscreen', | 
| 24   ('Document', 'webkitFullscreenEnabled'): 'DocumentFullscreen', | 25   ('Document', 'webkitFullscreenEnabled'): 'DocumentFullscreen', | 
| 25   ('Document', 'webkitFullscreenElement'): 'DocumentFullscreen', | 26   ('Document', 'webkitFullscreenElement'): 'DocumentFullscreen', | 
| 26   ('Document', 'webkitExitFullscreen'): 'DocumentFullscreen', | 27   ('Document', 'webkitExitFullscreen'): 'DocumentFullscreen', | 
| 27   ('DOMWindow', 'crypto'): 'DOMWindowCrypto', | 28   ('DOMWindow', 'crypto'): 'DOMWindowCrypto', | 
| 28   ('DOMWindow', 'indexedDB'): 'DOMWindowIndexedDatabase', | 29   ('DOMWindow', 'indexedDB'): 'DOMWindowIndexedDatabase', | 
| 29   ('DOMWindow', 'speechSynthesis'): 'DOMWindowSpeechSynthesis', | 30   ('DOMWindow', 'speechSynthesis'): 'DOMWindowSpeechSynthesis', | 
| 30   ('DOMWindow', 'webkitNotifications'): 'DOMWindowNotifications', | 31   ('DOMWindow', 'webkitNotifications'): 'DOMWindowNotifications', | 
| 31   ('DOMWindow', 'storage'): 'DOMWindowQuota', | 32   ('DOMWindow', 'storage'): 'DOMWindowQuota', | 
| 32   ('DOMWindow', 'webkitStorageInfo'): 'DOMWindowQuota', | 33   ('DOMWindow', 'webkitStorageInfo'): 'DOMWindowQuota', | 
| 33   ('DOMWindow', 'openDatabase'): 'DOMWindowWebDatabase', | 34   ('DOMWindow', 'openDatabase'): 'DOMWindowWebDatabase', | 
| 34   ('DOMWindow', 'webkitRequestFileSystem'): 'DOMWindowFileSystem', | 35   ('DOMWindow', 'webkitRequestFileSystem'): 'DOMWindowFileSystem', | 
| 35   ('DOMWindow', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem', | 36   ('DOMWindow', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem', | 
| 36   ('DOMWindow', 'atob'): 'DOMWindowBase64', | 37   ('DOMWindow', 'atob'): 'DOMWindowBase64', | 
| 37   ('DOMWindow', 'btoa'): 'DOMWindowBase64', | 38   ('DOMWindow', 'btoa'): 'DOMWindowBase64', | 
| 38   ('DOMWindow', 'clearTimeout'): 'DOMWindowTimers', | 39   ('DOMWindow', 'clearTimeout'): 'DOMWindowTimers', | 
| 39   ('DOMWindow', 'clearInterval'): 'DOMWindowTimers', | 40   ('DOMWindow', 'clearInterval'): 'DOMWindowTimers', | 
| 40   ('DOMWindow', 'createImageBitmap'): 'ImageBitmapFactories', | 41   ('DOMWindow', 'createImageBitmap'): 'ImageBitmapFactories', | 
| 41   ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem', | 42   ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem', | 
|  | 43   ('HTMLVideoElement', 'getVideoPlaybackQuality'): 'HTMLVideoElementMediaSource'
      , | 
| 42   ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack', | 44   ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack', | 
| 43   ('Navigator', 'geolocation'): 'NavigatorGeolocation', | 45   ('Navigator', 'geolocation'): 'NavigatorGeolocation', | 
| 44   ('Navigator', 'webkitPersistentStorage'): 'NavigatorStorageQuota', | 46   ('Navigator', 'webkitPersistentStorage'): 'NavigatorStorageQuota', | 
| 45   ('Navigator', 'webkitTemporaryStorage'): 'NavigatorStorageQuota', | 47   ('Navigator', 'webkitTemporaryStorage'): 'NavigatorStorageQuota', | 
| 46   ('Navigator', 'registerProtocolHandler'): 'NavigatorContentUtils', | 48   ('Navigator', 'registerProtocolHandler'): 'NavigatorContentUtils', | 
| 47   ('Navigator', 'unregisterProtocolHandler'): 'NavigatorContentUtils', | 49   ('Navigator', 'unregisterProtocolHandler'): 'NavigatorContentUtils', | 
| 48   ('Navigator', 'webkitGetUserMedia'): 'NavigatorMediaStream', | 50   ('Navigator', 'webkitGetUserMedia'): 'NavigatorMediaStream', | 
| 49   ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad', | 51   ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad', | 
| 50   ('Navigator', 'requestMIDIAccess'): 'NavigatorWebMIDI', | 52   ('Navigator', 'requestMIDIAccess'): 'NavigatorWebMIDI', | 
| 51   ('Navigator', 'vibrate'): 'NavigatorVibration', | 53   ('Navigator', 'vibrate'): 'NavigatorVibration', | 
| 52   ('Navigator', 'appName'): 'NavigatorID', | 54   ('Navigator', 'appName'): 'NavigatorID', | 
| 53   ('Navigator', 'appVersion'): 'NavigatorID', | 55   ('Navigator', 'appVersion'): 'NavigatorID', | 
| 54   ('Navigator', 'appCodeName'): 'NavigatorID', | 56   ('Navigator', 'appCodeName'): 'NavigatorID', | 
| 55   ('Navigator', 'platform'): 'NavigatorID', | 57   ('Navigator', 'platform'): 'NavigatorID', | 
| 56   ('Navigator', 'product'): 'NavigatorID', | 58   ('Navigator', 'product'): 'NavigatorID', | 
| 57   ('Navigator', 'userAgent'): 'NavigatorID', | 59   ('Navigator', 'userAgent'): 'NavigatorID', | 
| 58   ('Navigator', 'onLine'): 'NavigatorOnLine', | 60   ('Navigator', 'onLine'): 'NavigatorOnLine', | 
| 59   ('Navigator', 'registerServiceWorker'): 'NavigatorServiceWorker', | 61   ('Navigator', 'registerServiceWorker'): 'NavigatorServiceWorker', | 
| 60   ('Navigator', 'unregisterServiceWorker'): 'NavigatorServiceWorker', | 62   ('Navigator', 'unregisterServiceWorker'): 'NavigatorServiceWorker', | 
|  | 63   ('Navigator', 'maxTouchPoints'): 'NavigatorEvents', | 
| 61   ('WorkerGlobalScope', 'crypto'): 'WorkerGlobalScopeCrypto', | 64   ('WorkerGlobalScope', 'crypto'): 'WorkerGlobalScopeCrypto', | 
| 62   ('WorkerGlobalScope', 'indexedDB'): 'WorkerGlobalScopeIndexedDatabase', | 65   ('WorkerGlobalScope', 'indexedDB'): 'WorkerGlobalScopeIndexedDatabase', | 
| 63   ('WorkerGlobalScope', 'webkitNotifications'): 'WorkerGlobalScopeNotifications'
      , | 66   ('WorkerGlobalScope', 'webkitNotifications'): 'WorkerGlobalScopeNotifications'
      , | 
| 64   ('WorkerGlobalScope', 'openDatabase'): 'WorkerGlobalScopeWebDatabase', | 67   ('WorkerGlobalScope', 'openDatabase'): 'WorkerGlobalScopeWebDatabase', | 
| 65   ('WorkerGlobalScope', 'openDatabaseSync'): 'WorkerGlobalScopeWebDatabase', | 68   ('WorkerGlobalScope', 'openDatabaseSync'): 'WorkerGlobalScopeWebDatabase', | 
| 66   ('WorkerGlobalScope', 'performance'): 'WorkerGlobalScopePerformance', | 69   ('WorkerGlobalScope', 'performance'): 'WorkerGlobalScopePerformance', | 
| 67   ('WorkerGlobalScope', 'webkitRequestFileSystem'): 'WorkerGlobalScopeFileSystem
      ', | 70   ('WorkerGlobalScope', 'webkitRequestFileSystem'): 'WorkerGlobalScopeFileSystem
      ', | 
| 68   ('WorkerGlobalScope', 'webkitRequestFileSystemSync'): 'WorkerGlobalScopeFileSy
      stem', | 71   ('WorkerGlobalScope', 'webkitRequestFileSystemSync'): 'WorkerGlobalScopeFileSy
      stem', | 
| 69   ('WorkerGlobalScope', 'webkitResolveLocalFileSystemURL'): 'WorkerGlobalScopeFi
      leSystem', | 72   ('WorkerGlobalScope', 'webkitResolveLocalFileSystemURL'): 'WorkerGlobalScopeFi
      leSystem', | 
| 70   ('WorkerGlobalScope', 'webkitResolveLocalFileSystemSyncURL'): 'WorkerGlobalSco
      peFileSystem', | 73   ('WorkerGlobalScope', 'webkitResolveLocalFileSystemSyncURL'): 'WorkerGlobalSco
      peFileSystem', | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 82   ('DOMURL', 'createObjectUrlFromSourceCallback'): 'URLMediaSource', | 85   ('DOMURL', 'createObjectUrlFromSourceCallback'): 'URLMediaSource', | 
| 83   ('DOMURL', 'createObjectUrlFromStreamCallback'): 'URLMediaStream', | 86   ('DOMURL', 'createObjectUrlFromStreamCallback'): 'URLMediaStream', | 
| 84   ('DOMURL', '_createObjectUrlFromWebKitSourceCallback'): 'URLMediaSource', | 87   ('DOMURL', '_createObjectUrlFromWebKitSourceCallback'): 'URLMediaSource', | 
| 85   ('DOMURL', '_createObjectURL_2Callback'): 'URLMediaSource', | 88   ('DOMURL', '_createObjectURL_2Callback'): 'URLMediaSource', | 
| 86   ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaSource', | 89   ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaSource', | 
| 87   ('DOMURL', '_createObjectURL_4Callback'): 'URLMediaStream', | 90   ('DOMURL', '_createObjectURL_4Callback'): 'URLMediaStream', | 
| 88 } | 91 } | 
| 89 | 92 | 
| 90 _cpp_partial_map = {} | 93 _cpp_partial_map = {} | 
| 91 | 94 | 
|  | 95 # TODO(vsm): This should be recoverable from IDL, but we appear to not | 
|  | 96 # track the necessary info. | 
|  | 97 _url_utils = ['hash', 'host', 'hostname', 'origin', | 
|  | 98               'password', 'pathname', 'port', 'protocol', | 
|  | 99               'search', 'username'] | 
|  | 100 _cpp_static_call_map = { | 
|  | 101   'DOMURL': _url_utils + ['href', 'toString'], | 
|  | 102   'HTMLAnchorElement': _url_utils, | 
|  | 103   'HTMLAreaElement': _url_utils, | 
|  | 104 } | 
|  | 105 | 
| 92 def _GetCPPPartialNames(interface): | 106 def _GetCPPPartialNames(interface): | 
| 93   interface_name = interface.ext_attrs.get('ImplementedAs', interface.id) | 107   interface_name = interface.ext_attrs.get('ImplementedAs', interface.id) | 
| 94   if not _cpp_partial_map: | 108   if not _cpp_partial_map: | 
| 95     for (type, member) in _cpp_callback_map.keys(): | 109     for (type, member) in _cpp_callback_map.keys(): | 
| 96       if type not in _cpp_partial_map: | 110       if type not in _cpp_partial_map: | 
| 97         _cpp_partial_map[type] = set([]) | 111         _cpp_partial_map[type] = set([]) | 
| 98 | 112 | 
| 99       name_with_path = _cpp_callback_map[(type, member)] | 113       name_with_path = _cpp_callback_map[(type, member)] | 
| 100       if name_with_path in _cpp_import_map: | 114       if name_with_path in _cpp_import_map: | 
| 101         name_with_path = _cpp_import_map[name_with_path] | 115         name_with_path = _cpp_import_map[name_with_path] | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 156   def GenerateCallback(self, info): | 170   def GenerateCallback(self, info): | 
| 157     if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): | 171     if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): | 
| 158       return | 172       return | 
| 159 | 173 | 
| 160     cpp_impl_includes = set(['"' + partial + '.h"' | 174     cpp_impl_includes = set(['"' + partial + '.h"' | 
| 161                              for partial in _GetCPPPartialNames(self._interface)
      ]) | 175                              for partial in _GetCPPPartialNames(self._interface)
      ]) | 
| 162     cpp_header_handlers_emitter = emitter.Emitter() | 176     cpp_header_handlers_emitter = emitter.Emitter() | 
| 163     cpp_impl_handlers_emitter = emitter.Emitter() | 177     cpp_impl_handlers_emitter = emitter.Emitter() | 
| 164     class_name = 'Dart%s' % self._interface.id | 178     class_name = 'Dart%s' % self._interface.id | 
| 165     for operation in self._interface.operations: | 179     for operation in self._interface.operations: | 
|  | 180       function_name = operation.id | 
| 166       parameters = [] | 181       parameters = [] | 
| 167       arguments = [] | 182       arguments = [] | 
|  | 183       if operation.ext_attrs.get('CallWith') == 'ThisValue': | 
|  | 184         parameters.append('ScriptValue scriptValue') | 
| 168       conversion_includes = [] | 185       conversion_includes = [] | 
| 169       for argument in operation.arguments: | 186       for argument in operation.arguments: | 
| 170         argument_type_info = self._TypeInfo(argument.type.id) | 187         argument_type_info = self._TypeInfo(argument.type.id) | 
| 171         parameters.append('%s %s' % (argument_type_info.parameter_type(), | 188         parameters.append('%s %s' % (argument_type_info.parameter_type(), | 
| 172                                      argument.id)) | 189                                      argument.id)) | 
| 173         arguments.append(argument_type_info.to_dart_conversion(argument.id)) | 190         arguments.append(argument_type_info.to_dart_conversion(argument.id)) | 
| 174         conversion_includes.extend(argument_type_info.conversion_includes()) | 191         conversion_includes.extend(argument_type_info.conversion_includes()) | 
| 175 | 192 | 
|  | 193       # FIXME(vsm): Handle ThisValue attribute. | 
|  | 194       if operation.ext_attrs.get('CallWith') == 'ThisValue': | 
|  | 195         cpp_header_handlers_emitter.Emit( | 
|  | 196             '\n' | 
|  | 197             '    virtual bool $FUNCTION($PARAMETERS) {\n' | 
|  | 198             '        DART_UNIMPLEMENTED();\n' | 
|  | 199             '        return false;\n' | 
|  | 200             '    }\n', | 
|  | 201             FUNCTION=function_name, | 
|  | 202             PARAMETERS=', '.join(parameters)) | 
|  | 203         continue | 
|  | 204 | 
| 176       cpp_header_handlers_emitter.Emit( | 205       cpp_header_handlers_emitter.Emit( | 
| 177           '\n' | 206           '\n' | 
| 178           '    virtual bool handleEvent($PARAMETERS);\n', | 207           '    virtual bool $FUNCTION($PARAMETERS);\n', | 
|  | 208           FUNCTION=function_name, | 
| 179           PARAMETERS=', '.join(parameters)) | 209           PARAMETERS=', '.join(parameters)) | 
| 180 | 210 | 
| 181       if 'Custom' in operation.ext_attrs: | 211       if 'Custom' in operation.ext_attrs: | 
| 182         continue | 212         continue | 
| 183 | 213 | 
| 184       cpp_impl_includes |= set(conversion_includes) | 214       cpp_impl_includes |= set(conversion_includes) | 
| 185       arguments_declaration = 'Dart_Handle arguments[] = { %s }' % ', '.join(arg
      uments) | 215       arguments_declaration = 'Dart_Handle arguments[] = { %s }' % ', '.join(arg
      uments) | 
| 186       if not len(arguments): | 216       if not len(arguments): | 
| 187         arguments_declaration = 'Dart_Handle* arguments = 0' | 217         arguments_declaration = 'Dart_Handle* arguments = 0' | 
| 188       cpp_impl_handlers_emitter.Emit( | 218       cpp_impl_handlers_emitter.Emit( | 
| 189           '\n' | 219           '\n' | 
| 190           'bool $CLASS_NAME::handleEvent($PARAMETERS)\n' | 220           'bool $CLASS_NAME::$FUNCTION($PARAMETERS)\n' | 
| 191           '{\n' | 221           '{\n' | 
| 192           '    if (!m_callback.isIsolateAlive())\n' | 222           '    if (!m_callback.isIsolateAlive())\n' | 
| 193           '        return false;\n' | 223           '        return false;\n' | 
| 194           '    DartIsolateScope scope(m_callback.isolate());\n' | 224           '    DartIsolateScope scope(m_callback.isolate());\n' | 
| 195           '    DartApiScope apiScope;\n' | 225           '    DartApiScope apiScope;\n' | 
| 196           '    $ARGUMENTS_DECLARATION;\n' | 226           '    $ARGUMENTS_DECLARATION;\n' | 
| 197           '    return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' | 227           '    return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' | 
| 198           '}\n', | 228           '}\n', | 
| 199           CLASS_NAME=class_name, | 229           CLASS_NAME=class_name, | 
|  | 230           FUNCTION=function_name, | 
| 200           PARAMETERS=', '.join(parameters), | 231           PARAMETERS=', '.join(parameters), | 
| 201           ARGUMENTS_DECLARATION=arguments_declaration, | 232           ARGUMENTS_DECLARATION=arguments_declaration, | 
| 202           ARGUMENT_COUNT=len(arguments)) | 233           ARGUMENT_COUNT=len(arguments)) | 
| 203 | 234 | 
| 204     cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( | 235     cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( | 
| 205         self._interface.id, | 236         self._interface.id, | 
| 206         self._renamer.GetLibraryName(self._interface), | 237         self._renamer.GetLibraryName(self._interface), | 
| 207         True) | 238         True) | 
| 208     cpp_header_emitter.Emit( | 239     cpp_header_emitter.Emit( | 
| 209         self._template_loader.Load('cpp_callback_header.template'), | 240         self._template_loader.Load('cpp_callback_header.template'), | 
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 535     dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr
      .type.id)) | 566     dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr
      .type.id)) | 
| 536     is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext
      _attrs) | 567     is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext
      _attrs) | 
| 537     cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, | 568     cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, | 
| 538         dart_declaration, 'Setter', is_custom) | 569         dart_declaration, 'Setter', is_custom) | 
| 539     if is_custom: | 570     if is_custom: | 
| 540       return | 571       return | 
| 541 | 572 | 
| 542     if 'Reflect' in attr.ext_attrs: | 573     if 'Reflect' in attr.ext_attrs: | 
| 543       webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name() | 574       webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name() | 
| 544     else: | 575     else: | 
| 545       webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)', | 576       webcore_function_name = re.sub(r'^(xml|css|(?=[A-Z])|\w)', | 
| 546                                      lambda s: s.group(1).upper(), | 577                                      lambda s: s.group(1).upper(), | 
| 547                                      attr.id) | 578                                      attr.id) | 
| 548       webcore_function_name = 'set%s' % webcore_function_name | 579       webcore_function_name = 'set%s' % webcore_function_name | 
| 549 | 580 | 
| 550     function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
      on_name, attr) | 581     function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
      on_name, attr) | 
| 551     self._GenerateNativeCallback( | 582     self._GenerateNativeCallback( | 
| 552         cpp_callback_name, | 583         cpp_callback_name, | 
| 553         True, | 584         True, | 
| 554         function_expression, | 585         function_expression, | 
| 555         attr, | 586         attr, | 
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 734       needs_receiver, | 765       needs_receiver, | 
| 735       function_expression, | 766       function_expression, | 
| 736       node, | 767       node, | 
| 737       arguments, | 768       arguments, | 
| 738       return_type, | 769       return_type, | 
| 739       return_type_is_nullable, | 770       return_type_is_nullable, | 
| 740       raises_dom_exception, | 771       raises_dom_exception, | 
| 741       generate_custom_element_scope_if_needed=False): | 772       generate_custom_element_scope_if_needed=False): | 
| 742 | 773 | 
| 743     ext_attrs = node.ext_attrs | 774     ext_attrs = node.ext_attrs | 
|  | 775     if self._IsStatic(node.id): | 
|  | 776       needs_receiver = True | 
| 744 | 777 | 
| 745     cpp_arguments = [] | 778     cpp_arguments = [] | 
| 746     runtime_check = None | 779     runtime_check = None | 
| 747     raises_exceptions = raises_dom_exception or arguments | 780     raises_exceptions = raises_dom_exception or arguments | 
| 748     needs_custom_element_callbacks = False | 781     needs_custom_element_callbacks = False | 
| 749 | 782 | 
| 750     # TODO(antonm): unify with ScriptState below. | 783     # TODO(antonm): unify with ScriptState below. | 
| 751     requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptS
      tate' or | 784     requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptS
      tate' or | 
| 752                            ext_attrs.get('ConstructorCallWith') == 'ScriptArgume
      nts|ScriptState' or | 785                            ext_attrs.get('ConstructorCallWith') == 'ScriptArgume
      nts|ScriptState' or | 
| 753                            ext_attrs.get('CallWith') == 'ScriptArguments&ScriptS
      tate' or | 786                            ext_attrs.get('CallWith') == 'ScriptArguments&ScriptS
      tate' or | 
| 754                            ext_attrs.get('ConstructorCallWith') == 'ScriptArgume
      nts&ScriptState') | 787                            ext_attrs.get('ConstructorCallWith') == 'ScriptArgume
      nts&ScriptState') | 
| 755     if requires_stack_info: | 788     if requires_stack_info: | 
| 756       raises_exceptions = True | 789       raises_exceptions = True | 
| 757       cpp_arguments = ['&state', 'scriptArguments.release()'] | 790       cpp_arguments = ['&state', 'scriptArguments.release()'] | 
| 758       # WebKit uses scriptArguments to reconstruct last argument, so | 791       # WebKit uses scriptArguments to reconstruct last argument, so | 
| 759       # it's not needed and should be just removed. | 792       # it's not needed and should be just removed. | 
| 760       arguments = arguments[:-1] | 793       arguments = arguments[:-1] | 
| 761 | 794 | 
| 762     # TODO(antonm): unify with ScriptState below. | 795     # TODO(antonm): unify with ScriptState below. | 
| 763     requires_script_arguments = (ext_attrs.get('CallWith') == 'ScriptArguments' 
      or | 796     requires_script_arguments = (ext_attrs.get('CallWith') == 'ScriptArguments' 
      or | 
| 764                                  ext_attrs.get('ConstructorCallWith') == 'Script
      Arguments') | 797                                  ext_attrs.get('ConstructorCallWith') == 'Script
      Arguments') | 
| 765     if requires_script_arguments: | 798     if requires_script_arguments: | 
| 766       raises_exceptions = True | 799       raises_exceptions = True | 
| 767       cpp_arguments = ['scriptArguments.release()'] | 800       cpp_arguments = ['scriptArguments.release()'] | 
| 768       # WebKit uses scriptArguments to reconstruct last argument, so | 801       # WebKit uses scriptArguments to reconstruct last argument, so | 
| 769       # it's not needed and should be just removed. | 802       # it's not needed and should be just removed. | 
| 770       arguments = arguments[:-1] | 803       arguments = arguments[:-1] | 
| 771 | 804 | 
| 772     requires_script_execution_context = (ext_attrs.get('CallWith') == 'ScriptExe
      cutionContext' or | 805     requires_script_execution_context = (ext_attrs.get('CallWith') == 'Execution
      Context' or | 
| 773                                          ext_attrs.get('ConstructorCallWith') ==
       'ScriptExecutionContext') | 806                                          ext_attrs.get('ConstructorCallWith') ==
       'ExecutionContext') | 
| 774 | 807 | 
| 775     requires_document = ext_attrs.get('ConstructorCallWith') == 'Document' | 808     requires_document = ext_attrs.get('ConstructorCallWith') == 'Document' | 
| 776 | 809 | 
| 777     if requires_script_execution_context: | 810     if requires_script_execution_context: | 
| 778       raises_exceptions = True | 811       raises_exceptions = True | 
| 779       cpp_arguments = ['context'] | 812       cpp_arguments = ['context'] | 
| 780 | 813 | 
| 781     requires_script_state = (ext_attrs.get('CallWith') == 'ScriptState' or | 814     requires_script_state = (ext_attrs.get('CallWith') == 'ScriptState' or | 
| 782                              ext_attrs.get('ConstructorCallWith') == 'ScriptStat
      e') | 815                              ext_attrs.get('ConstructorCallWith') == 'ScriptStat
      e') | 
| 783     if requires_script_state: | 816     if requires_script_state: | 
| 784       raises_exceptions = True | 817       raises_exceptions = True | 
| 785       cpp_arguments = ['&state'] | 818       cpp_arguments = ['&state'] | 
| 786 | 819 | 
| 787     requires_dom_window = 'NamedConstructor' in ext_attrs | 820     requires_dom_window = 'NamedConstructor' in ext_attrs | 
| 788     if requires_dom_window or requires_document: | 821     if requires_dom_window or requires_document: | 
| 789       raises_exceptions = True | 822       raises_exceptions = True | 
| 790       cpp_arguments = ['document'] | 823       cpp_arguments = ['document'] | 
| 791 | 824 | 
| 792     if 'ImplementedBy' in ext_attrs: | 825     if 'ImplementedBy' in ext_attrs: | 
| 793       assert needs_receiver | 826       assert needs_receiver | 
| 794       self._cpp_impl_includes.add('"%s.h"' % ext_attrs['ImplementedBy']) | 827       self._cpp_impl_includes.add('"%s.h"' % ext_attrs['ImplementedBy']) | 
| 795       cpp_arguments.append('receiver') | 828       cpp_arguments.append('receiver') | 
| 796 | 829 | 
| 797     if 'Reflect' in ext_attrs: | 830     if 'Reflect' in ext_attrs: | 
| 798       cpp_arguments = [self._GenerateWebCoreReflectionAttributeName(node)] | 831       cpp_arguments = [self._GenerateWebCoreReflectionAttributeName(node)] | 
| 799 | 832 | 
| 800     if generate_custom_element_scope_if_needed and (ext_attrs.get('CustomElement
      Callbacks', 'None') != 'None' or 'Reflect' in ext_attrs): | 833     if generate_custom_element_scope_if_needed and (ext_attrs.get('CustomElement
      Callbacks', 'None') != 'None' or 'Reflect' in ext_attrs): | 
| 801       self._cpp_impl_includes.add('"core/dom/CustomElementCallbackDispatcher.h"'
      ) | 834       self._cpp_impl_includes.add('"core/dom/custom/CustomElementCallbackDispatc
      her.h"') | 
| 802       needs_custom_element_callbacks = True | 835       needs_custom_element_callbacks = True | 
| 803 | 836 | 
| 804     if return_type_is_nullable: | 837     if return_type_is_nullable: | 
| 805       cpp_arguments = ['isNull'] | 838       cpp_arguments = ['isNull'] | 
| 806 | 839 | 
| 807     v8EnabledPerContext = ext_attrs.get('synthesizedV8EnabledPerContext', ext_at
      trs.get('V8EnabledPerContext')) | 840     v8EnabledPerContext = ext_attrs.get('synthesizedV8EnabledPerContext', ext_at
      trs.get('V8EnabledPerContext')) | 
| 808     v8EnabledAtRuntime = ext_attrs.get('synthesizedV8EnabledAtRuntime', ext_attr
      s.get('V8EnabledAtRuntime')) | 841     v8EnabledAtRuntime = ext_attrs.get('synthesizedV8EnabledAtRuntime', ext_attr
      s.get('V8EnabledAtRuntime')) | 
| 809     assert(not (v8EnabledPerContext and v8EnabledAtRuntime)) | 842     assert(not (v8EnabledPerContext and v8EnabledAtRuntime)) | 
| 810 | 843 | 
| 811     if v8EnabledPerContext: | 844     if v8EnabledPerContext: | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 852         '        return;\n' | 885         '        return;\n' | 
| 853         '    }\n') | 886         '    }\n') | 
| 854 | 887 | 
| 855     if runtime_check: | 888     if runtime_check: | 
| 856       body_emitter.Emit( | 889       body_emitter.Emit( | 
| 857           '$RUNTIME_CHECK\n', | 890           '$RUNTIME_CHECK\n', | 
| 858           RUNTIME_CHECK=runtime_check) | 891           RUNTIME_CHECK=runtime_check) | 
| 859 | 892 | 
| 860     if requires_script_execution_context: | 893     if requires_script_execution_context: | 
| 861       body_emitter.Emit( | 894       body_emitter.Emit( | 
| 862           '        ScriptExecutionContext* context = DartUtilities::scriptExecut
      ionContext();\n' | 895           '        ExecutionContext* context = DartUtilities::scriptExecutionCon
      text();\n' | 
| 863           '        if (!context) {\n' | 896           '        if (!context) {\n' | 
| 864           '            exception = Dart_NewStringFromCString("Failed to retrieve
       a context");\n' | 897           '            exception = Dart_NewStringFromCString("Failed to retrieve
       a context");\n' | 
| 865           '            goto fail;\n' | 898           '            goto fail;\n' | 
| 866           '        }\n\n') | 899           '        }\n\n') | 
| 867 | 900 | 
| 868     if requires_script_state: | 901     if requires_script_state: | 
| 869       body_emitter.Emit( | 902       body_emitter.Emit( | 
| 870           '        ScriptState* currentState = DartUtilities::currentScriptState
      ();\n' | 903           '        ScriptState* currentState = DartUtilities::currentScriptState
      ();\n' | 
| 871           '        if (!currentState) {\n' | 904           '        if (!currentState) {\n' | 
| 872           '            exception = Dart_NewStringFromCString("Failed to retrieve
       a script state");\n' | 905           '            exception = Dart_NewStringFromCString("Failed to retrieve
       a script state");\n' | 
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 999     if needs_receiver: | 1032     if needs_receiver: | 
| 1000       interface_name = self._interface_type_info.native_type() | 1033       interface_name = self._interface_type_info.native_type() | 
| 1001       # Hack to determine if this came from the _cpp_callback_map. | 1034       # Hack to determine if this came from the _cpp_callback_map. | 
| 1002       # In this case, the getter is mapped to a static method. | 1035       # In this case, the getter is mapped to a static method. | 
| 1003       if (not function_expression.startswith('receiver->') and | 1036       if (not function_expression.startswith('receiver->') and | 
| 1004           not function_expression.startswith(interface_name + '::')): | 1037           not function_expression.startswith(interface_name + '::')): | 
| 1005         if interface_name == 'DOMWindow' or interface_name == 'Navigator' or int
      erface_name == 'WorkerGlobalScope': | 1038         if interface_name == 'DOMWindow' or interface_name == 'Navigator' or int
      erface_name == 'WorkerGlobalScope': | 
| 1006           cpp_arguments.insert(0, 'receiver') | 1039           cpp_arguments.insert(0, 'receiver') | 
| 1007         else: | 1040         else: | 
| 1008           cpp_arguments.append('receiver') | 1041           cpp_arguments.append('receiver') | 
|  | 1042       elif self._IsStatic(node.id): | 
|  | 1043         cpp_arguments.insert(0, 'receiver') | 
| 1009 | 1044 | 
| 1010     function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments)) | 1045     function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments)) | 
| 1011     if return_type == 'void': | 1046     if return_type == 'void': | 
| 1012       invocation_emitter.Emit( | 1047       invocation_emitter.Emit( | 
| 1013         '        $FUNCTION_CALL;\n', | 1048         '        $FUNCTION_CALL;\n', | 
| 1014         FUNCTION_CALL=function_call) | 1049         FUNCTION_CALL=function_call) | 
| 1015     else: | 1050     else: | 
| 1016       return_type_info = self._TypeInfo(return_type) | 1051       return_type_info = self._TypeInfo(return_type) | 
| 1017       self._cpp_impl_includes |= set(return_type_info.conversion_includes()) | 1052       self._cpp_impl_includes |= set(return_type_info.conversion_includes()) | 
| 1018 | 1053 | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1098     svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', | 1133     svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', | 
| 1099                       'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', | 1134                       'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', | 
| 1100                       'onmouseup', 'onresize', 'onscroll', 'onunload'] | 1135                       'onmouseup', 'onresize', 'onscroll', 'onunload'] | 
| 1101     if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: | 1136     if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: | 
| 1102       namespace = 'SVGNames' | 1137       namespace = 'SVGNames' | 
| 1103     self._cpp_impl_includes.add('"%s.h"' % namespace) | 1138     self._cpp_impl_includes.add('"%s.h"' % namespace) | 
| 1104 | 1139 | 
| 1105     attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() | 1140     attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() | 
| 1106     return 'WebCore::%s::%sAttr' % (namespace, attribute_name) | 1141     return 'WebCore::%s::%sAttr' % (namespace, attribute_name) | 
| 1107 | 1142 | 
|  | 1143   def _IsStatic(self, attribute_name): | 
|  | 1144     cpp_type_name = self._interface_type_info.native_type() | 
|  | 1145     if cpp_type_name in _cpp_static_call_map: | 
|  | 1146       return attribute_name in _cpp_static_call_map[cpp_type_name] | 
|  | 1147     return False | 
|  | 1148 | 
| 1108   def _GenerateWebCoreFunctionExpression(self, function_name, idl_node, cpp_call
      back_name=None): | 1149   def _GenerateWebCoreFunctionExpression(self, function_name, idl_node, cpp_call
      back_name=None): | 
| 1109     if 'ImplementedBy' in idl_node.ext_attrs: | 1150     if 'ImplementedBy' in idl_node.ext_attrs: | 
| 1110       return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name) | 1151       return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name) | 
| 1111     cpp_type_name = self._interface_type_info.native_type() | 1152     cpp_type_name = self._interface_type_info.native_type() | 
| 1112     impl_type_name = _GetCPPTypeName(cpp_type_name, function_name, cpp_callback_
      name) | 1153     impl_type_name = _GetCPPTypeName(cpp_type_name, function_name, cpp_callback_
      name) | 
| 1113     if idl_node.is_static: | 1154     if idl_node.is_static or self._IsStatic(idl_node.id): | 
| 1114       return '%s::%s' % (impl_type_name, function_name) | 1155       return '%s::%s' % (impl_type_name, function_name) | 
| 1115     if cpp_type_name == impl_type_name: | 1156     if cpp_type_name == impl_type_name: | 
| 1116       return '%s%s' % (self._interface_type_info.receiver(), function_name) | 1157       return '%s%s' % (self._interface_type_info.receiver(), function_name) | 
| 1117     else: | 1158     else: | 
| 1118       return '%s::%s' % (impl_type_name, function_name) | 1159       return '%s::%s' % (impl_type_name, function_name) | 
| 1119 | 1160 | 
| 1120   def _IsArgumentOptionalInWebCore(self, operation, argument): | 1161   def _IsArgumentOptionalInWebCore(self, operation, argument): | 
| 1121     if not IsOptional(argument): | 1162     if not IsOptional(argument): | 
| 1122       return False | 1163       return False | 
| 1123     if 'Callback' in argument.ext_attrs: | 1164     if 'Callback' in argument.ext_attrs: | 
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1279     e.Emit("};\n"); | 1320     e.Emit("};\n"); | 
| 1280     e.Emit('\n'); | 1321     e.Emit('\n'); | 
| 1281     e.Emit('} // namespace WebCore\n'); | 1322     e.Emit('} // namespace WebCore\n'); | 
| 1282 | 1323 | 
| 1283 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): | 1324 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): | 
| 1284   return ( | 1325   return ( | 
| 1285       interface.id.endswith('Event') and | 1326       interface.id.endswith('Event') and | 
| 1286       operation.id.startswith('init') and | 1327       operation.id.startswith('init') and | 
| 1287       argument.ext_attrs.get('Default') == 'Undefined' and | 1328       argument.ext_attrs.get('Default') == 'Undefined' and | 
| 1288       argument.type.id == 'DOMString') | 1329       argument.type.id == 'DOMString') | 
| OLD | NEW | 
|---|