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 |
11 import monitored | 11 import monitored |
12 import os | 12 import os |
13 import re | 13 import re |
14 from htmlrenamer import custom_html_constructors, html_interface_renames, \ | 14 from htmlrenamer import custom_html_constructors, html_interface_renames, \ |
15 typed_array_renames | 15 typed_array_renames |
16 | 16 |
17 _pure_interfaces = monitored.Set('generator._pure_interfaces', [ | 17 _safe_interfaces = monitored.Set('generator._safe_interfaces', [ |
18 # TODO(sra): DOMStringMap should be a class implementing Map<String,String>. | 18 'double', |
19 'DOMStringMap', | 19 'Float32Array', |
20 'AbstractWorker', | 20 'Float64Array', |
21 'CanvasPathMethods', | 21 'Int8Array', |
22 'ChildNode', | 22 'Int16Array', |
23 'DocumentAnimation', | 23 'Int32Array', |
24 'DocumentFontFaceSet', | 24 'Uint8Array', |
25 'DocumentFullscreen', | 25 'Uint8ClampedArray', |
26 'DocumentXPathEvaluator', | 26 'Uint16Array', |
27 'ElementAnimation', | 27 'Uint32Array', |
28 'ElementFullscreen', | 28 'ArrayBufferView', |
29 'EventListener', | 29 'ArrayBuffer', |
30 'GlobalEventHandlers', | 30 'SourceBuffer', # IDL lies about this class being a pure interface. |
31 'ImageBitmapFactories', | 31 'Console', # this one is a bit of a hack as our console implementation |
32 'MediaQueryListListener', | 32 # in dart:html is non-standard for legacy reasons. |
33 'MouseEventHitRegion', | 33 'AudioContext', |
34 'MutationCallback', | 34 'AudioSourceNode', |
35 'NavigatorCPU', | 35 'WebGLVertexArrayObjectOES', # Added a polyfill for this. |
36 'NavigatorEvents', | 36 # Types where we can get access to the prototype easily enough. |
37 'NavigatorID', | 37 # We might consider in the future treating these are regular interface types
. |
38 'NavigatorLanguage', | 38 'StereoPannerNode', |
39 'NavigatorOnLine', | 39 'PannerNode', |
40 'ParentNode', | 40 'AudioNode', |
41 'SVGDocument', | 41 'FontFaceSet', |
42 'SVGExternalResourcesRequired', | 42 'MemoryInfo', |
43 'SVGFilterPrimitiveStandardAttributes', | 43 'ConsoleBase', |
44 'SVGFitToViewBox', | 44 'Geolocation', |
45 'SVGTests', | 45 'Animation', |
46 'SVGURIReference', | 46 'SourceBufferList', |
47 'SVGZoomAndPan', | 47 'GamepadList', |
48 'TimeoutHandler', | 48 |
49 'URLUtils', | 49 # The following classes are enabled just to get the build to go. |
50 'URLUtilsReadOnly', | 50 # SpeechRecognitionResultList isn't really allowed but the codegen creates |
51 'WebGLRenderingContextBase', | 51 # invalid output otherwise. |
52 'WindowBase64', | 52 |
53 'WindowEventHandlers', | 53 'SpeechRecognitionResultList', |
54 'WindowImageBitmapFactories', | 54 'SQLResultSetRowList', |
55 'WindowPagePopup', | |
56 'WindowTimers', | |
57 ]) | 55 ]) |
58 | 56 |
59 def IsPureInterface(interface_name): | 57 # These are interfaces that we have to treat as safe for dart2js and dartium |
60 return interface_name in _pure_interfaces | 58 # but going in dev compiler we should not treat as safe as these classes |
| 59 # really aren't guaranteed to have a stable interface name. |
| 60 _safe_interfaces_legacy = monitored.Set('generator._safe_interfaces_legacy', [ |
| 61 'ANGLEInstancedArrays', |
| 62 'Bluetooth', |
| 63 'Body', |
| 64 'NonDocumentTypeChildNode', |
| 65 'CHROMIUMSubscribeUniform', |
| 66 'CHROMIUMValuebuffer', |
| 67 'GeofencingRegion', |
| 68 'Coordinates', |
| 69 'DOMFileSystem', |
| 70 'DirectoryEntry', |
| 71 'DOMFileSystemSync', |
| 72 'Entry', |
| 73 'Database', |
| 74 'DeprecatedStorageInfo', |
| 75 'DeprecatedStorageQuota', |
| 76 'DeviceAcceleration', |
| 77 'DeviceRotationRate', |
| 78 'DirectoryReader', |
| 79 'EntrySync', |
| 80 'DirectoryEntrySync', |
| 81 'DirectoryReaderSync', |
| 82 'NonElementParentNode', |
| 83 'EXTBlendMinMax', |
| 84 'EXTFragDepth', |
| 85 'EXTShaderTextureLOD', |
| 86 'EXTTextureFilterAnisotropic', |
| 87 'EXTsRGB', |
| 88 'EffectModel', |
| 89 'FileEntry', |
| 90 'FileEntrySync', |
| 91 'FileWriter', |
| 92 'FileWriterSync', |
| 93 'FontFaceSetLoadEvent', |
| 94 'Geofencing', |
| 95 'Geoposition', |
| 96 'Iterator', |
| 97 'MediaDeviceInfo', |
| 98 'MediaStreamTrackEvent', |
| 99 'Metadata', |
| 100 'NavigatorStorageUtils', |
| 101 'StorageQuota', |
| 102 'NavigatorUserMediaError', |
| 103 'OESElementIndexUint', |
| 104 'OESStandardDerivatives', |
| 105 'OESTextureFloat', |
| 106 'OESTextureFloatLinear', |
| 107 'OESTextureHalfFloat', |
| 108 'OESTextureHalfFloatLinear', |
| 109 'OESVertexArrayObject', |
| 110 'PagePopupController', |
| 111 'PluginPlaceholderElement', |
| 112 'PositionError', |
| 113 'RTCDTMFSender', |
| 114 'RTCDataChannel', |
| 115 'RTCDataChannelEvent', |
| 116 'RTCIceCandidateEvent', |
| 117 'RTCStatsReport', |
| 118 'RTCStatsResponse', |
| 119 'ReadableByteStreamReader', |
| 120 'ReadableStreamReader', |
| 121 'ResourceProgressEvent', |
| 122 'SQLError', |
| 123 'SQLResultSet', |
| 124 'SQLTransaction', |
| 125 'SharedArrayBuffer', |
| 126 'SourceInfo', |
| 127 'SpeechRecognitionAlternative', |
| 128 'SpeechRecognitionResult', |
| 129 'SpeechSynthesis', |
| 130 'SpeechSynthesisVoice', |
| 131 'StorageInfo', |
| 132 'StyleMedia', |
| 133 'WebGL2RenderingContextBase', |
| 134 'WebGLCompressedTextureATC', |
| 135 'WebGLCompressedTextureETC1', |
| 136 'WebGLCompressedTexturePVRTC', |
| 137 'WebGLCompressedTextureS3TC', |
| 138 'WebGLDebugRendererInfo', |
| 139 'WebGLDebugShaders', |
| 140 'WebGLDepthTexture', |
| 141 'WebGLDrawBuffers', |
| 142 'WebGLLoseContext', |
| 143 'WorkerConsole', |
| 144 'WorkerPerformance', |
| 145 'XPathNSResolver', |
| 146 ]) |
| 147 |
| 148 # Classes we should just suppress? |
| 149 # SpeechGrammarList and friends |
| 150 |
| 151 def IsPureInterface(interface_name, database): |
| 152 if (interface_name in _safe_interfaces or |
| 153 interface_name in _safe_interfaces_legacy or |
| 154 database.HasInterface(interface_name)): |
| 155 return False |
| 156 |
| 157 interface = database.GetInterface(interface_name) |
| 158 |
| 159 if 'Constructor' in interface.ext_attrs: |
| 160 return False |
| 161 |
| 162 return interface.is_no_interface_object |
61 | 163 |
62 # | 164 # |
63 # Classes which have native constructors but which we are suppressing because | 165 # Classes which have native constructors but which we are suppressing because |
64 # they are not cross-platform. | 166 # they are not cross-platform. |
65 # | 167 # |
66 _suppressed_native_constructors = monitored.Set( | 168 _suppressed_native_constructors = monitored.Set( |
67 'generator._suppressed_native_constructors', [ | 169 'generator._suppressed_native_constructors', [ |
68 'DocumentFragment', | 170 'DocumentFragment', |
69 'Range', | 171 'Range', |
70 'Text', | 172 'Text', |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 'MutationObserver': 'MutationObserver,WebKitMutationObserver', | 258 'MutationObserver': 'MutationObserver,WebKitMutationObserver', |
157 | 259 |
158 'NamedNodeMap': 'NamedNodeMap,MozNamedAttrMap', | 260 'NamedNodeMap': 'NamedNodeMap,MozNamedAttrMap', |
159 | 261 |
160 'NodeList': 'NodeList,RadioNodeList', | 262 'NodeList': 'NodeList,RadioNodeList', |
161 | 263 |
162 'OscillatorNode': 'OscillatorNode,Oscillator', | 264 'OscillatorNode': 'OscillatorNode,Oscillator', |
163 | 265 |
164 'PannerNode': 'PannerNode,AudioPannerNode,webkitAudioPannerNode', | 266 'PannerNode': 'PannerNode,AudioPannerNode,webkitAudioPannerNode', |
165 | 267 |
166 'RTCPeerConnection': 'RTCPeerConnection,mozRTCPeerConnection', | 268 'RTCPeerConnection': 'RTCPeerConnection,webkitRTCPeerConnection,mozRTCPeerCo
nnection', |
167 | 269 |
168 'RTCIceCandidate': 'RTCIceCandidate,mozRTCIceCandidate', | 270 'RTCIceCandidate': 'RTCIceCandidate,mozRTCIceCandidate', |
169 | 271 |
170 'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent', | 272 'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent', |
171 | 273 |
172 'RTCSessionDescription': 'RTCSessionDescription,mozRTCSessionDescription', | 274 'RTCSessionDescription': 'RTCSessionDescription,mozRTCSessionDescription', |
173 | 275 |
174 'RTCDataChannel': 'RTCDataChannel,DataChannel', | 276 'RTCDataChannel': 'RTCDataChannel,DataChannel', |
175 | 277 |
176 'ScriptProcessorNode': 'ScriptProcessorNode,JavaScriptAudioNode', | 278 'ScriptProcessorNode': 'ScriptProcessorNode,JavaScriptAudioNode', |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
922 return 'List<%s>' % self._type_registry.TypeInfo(self._data.item_type).dar
t_type() | 1024 return 'List<%s>' % self._type_registry.TypeInfo(self._data.item_type).dar
t_type() |
923 return self._dart_interface_name | 1025 return self._dart_interface_name |
924 | 1026 |
925 def narrow_dart_type(self): | 1027 def narrow_dart_type(self): |
926 if self.list_item_type(): | 1028 if self.list_item_type(): |
927 return self.implementation_name() | 1029 return self.implementation_name() |
928 # TODO(podivilov): only primitive and collection types should override | 1030 # TODO(podivilov): only primitive and collection types should override |
929 # dart_type. | 1031 # dart_type. |
930 if self._data.dart_type != None: | 1032 if self._data.dart_type != None: |
931 return self.dart_type() | 1033 return self.dart_type() |
932 if IsPureInterface(self.idl_type()): | 1034 if IsPureInterface(self.idl_type(), self._type_registry._database): |
933 return self.idl_type() | 1035 return self.idl_type() |
934 return self.interface_name() | 1036 return self.interface_name() |
935 | 1037 |
936 def interface_name(self): | 1038 def interface_name(self): |
937 return self._dart_interface_name | 1039 return self._dart_interface_name |
938 | 1040 |
939 def implementation_name(self): | 1041 def implementation_name(self): |
940 implementation_name = self._dart_interface_name | 1042 implementation_name = self._dart_interface_name |
941 | 1043 |
942 if not self.has_generated_interface(): | 1044 if not self.has_generated_interface(): |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 return_type == 'Rectangle') | 1622 return_type == 'Rectangle') |
1521 | 1623 |
1522 def wrap_return_type_blink(return_type, type_name, type_registry): | 1624 def wrap_return_type_blink(return_type, type_name, type_registry): |
1523 """Returns True if we should wrap the returned value. This checks | 1625 """Returns True if we should wrap the returned value. This checks |
1524 a number of different variations, calling the more basic functions | 1626 a number of different variations, calling the more basic functions |
1525 above.""" | 1627 above.""" |
1526 return (wrap_unwrap_type_blink(return_type, type_registry) or | 1628 return (wrap_unwrap_type_blink(return_type, type_registry) or |
1527 wrap_unwrap_type_blink(type_name, type_registry) or | 1629 wrap_unwrap_type_blink(type_name, type_registry) or |
1528 wrap_type_blink(return_type, type_registry) or | 1630 wrap_type_blink(return_type, type_registry) or |
1529 wrap_unwrap_list_blink(return_type, type_registry)) | 1631 wrap_unwrap_list_blink(return_type, type_registry)) |
OLD | NEW |