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 system to generate | 6 """This module provides shared functionality for the system to generate |
7 Dart:html APIs from the IDL database.""" | 7 Dart:html APIs from the IDL database.""" |
8 | 8 |
9 from systemfrog import * | 9 from systemfrog import * |
10 from systeminterface import * | 10 from systeminterface import * |
(...skipping 16 matching lines...) Expand all Loading... |
27 'Element.scrollHeight', | 27 'Element.scrollHeight', |
28 'Element.childElementCount', | 28 'Element.childElementCount', |
29 'Element.firstElementChild', | 29 'Element.firstElementChild', |
30 'Element.hasAttribute', | 30 'Element.hasAttribute', |
31 'Element.getAttribute', | 31 'Element.getAttribute', |
32 'Element.removeAttribute', | 32 'Element.removeAttribute', |
33 'Element.setAttribute', | 33 'Element.setAttribute', |
34 'Element.className', | 34 'Element.className', |
35 'Element.children', | 35 'Element.children', |
36 'Element.querySelectorAll', | 36 'Element.querySelectorAll', |
| 37 'NodeSelector.querySelectorAll', |
37 'Document.querySelectorAll', | 38 'Document.querySelectorAll', |
| 39 'DocumentFragment.querySelectorAll', |
38 'Element.getBoundingClientRect', | 40 'Element.getBoundingClientRect', |
39 'Element.getClientRects', | 41 'Element.getClientRects', |
40 'Node.appendChild', | 42 'Node.appendChild', |
41 'Node.removeChild', | 43 'Node.removeChild', |
42 'Node.replaceChild', | 44 'Node.replaceChild', |
43 'Node.attributes', | 45 'Node.attributes', |
44 'Node.childNodes', | 46 'Node.childNodes', |
45 'Document.createElement', | 47 'Document.createElement', |
46 'Document.createEvent', | 48 'Document.createEvent', |
47 'Document.createTextNode', | 49 'Document.createTextNode', |
48 'Document.createTouchList', | 50 'Document.createTouchList', |
49 'Window.getComputedStyle', | 51 'Window.getComputedStyle', |
50 'EventTarget.removeEventListener', | 52 'EventTarget.removeEventListener', |
51 'EventTarget.addEventListener', | 53 'EventTarget.addEventListener', |
52 'EventTarget.dispatchEvent', | 54 'EventTarget.dispatchEvent', |
53 'Event.initEvent', | 55 'Event.initEvent', |
54 'MouseEvent.initMouseEvent', | 56 'MouseEvent.initMouseEvent', |
55 ]) | 57 ]) |
56 | 58 |
57 # Members from the standard dom that exist in the dart:html library with | 59 # Members from the standard dom that exist in the dart:html library with |
58 # identical functionality but with cleaner names. | 60 # identical functionality but with cleaner names. |
59 _html_library_renames = { | 61 _html_library_renames = { |
60 'Document.defaultView': 'window', | 62 'Document.defaultView': 'window', |
61 'DocumentFragment.querySelector': 'query', | 63 'DocumentFragment.querySelector': 'query', |
| 64 'NodeSelector.querySelector': 'query', |
62 'Element.querySelector': 'query', | 65 'Element.querySelector': 'query', |
63 'Element.webkitMatchesSelector' : 'matchesSelector', | 66 'Element.webkitMatchesSelector' : 'matchesSelector', |
64 'Element.scrollIntoViewIfNeeded': 'scrollIntoView', | 67 'Element.scrollIntoViewIfNeeded': 'scrollIntoView', |
65 'Document.querySelector': 'query', | 68 'Document.querySelector': 'query', |
66 'DocumentFragment.querySelectorAll': 'queryAll', | |
67 'DocumentFragment.querySelectorAll': 'queryAll', | |
68 'Node.cloneNode': 'clone', | 69 'Node.cloneNode': 'clone', |
69 'Node.nextSibling': 'nextNode', | 70 'Node.nextSibling': 'nextNode', |
70 'Node.ownerDocument': 'document', | 71 'Node.ownerDocument': 'document', |
71 'Node.parentNode': 'parent', | 72 'Node.parentNode': 'parent', |
72 'Node.previousSibling': 'previousNode', | 73 'Node.previousSibling': 'previousNode', |
73 'Node.textContent': 'text', | 74 'Node.textContent': 'text', |
| 75 'SVGElement.className': '_svgClassName', |
| 76 'SVGAnimatedString.className': '_svgClassName', |
| 77 'SVGStylable.className': '_svgClassName', |
74 } | 78 } |
75 | 79 |
76 #TODO(jacobr): inject annotations into the interfaces based on this table and | 80 #TODO(jacobr): inject annotations into the interfaces based on this table and |
77 # on _html_library_renames. | 81 # on _html_library_renames. |
78 _injected_doc_fragments = { | 82 _injected_doc_fragments = { |
79 'Element.query': ' /** @domName querySelector, Document.getElementById */', | 83 'Element.query': ' /** @domName querySelector, Document.getElementById */', |
80 } | 84 } |
81 # Members and classes from the dom that should be removed completelly from | 85 # Members and classes from the dom that should be removed completelly from |
82 # dart:html. These could be expressed in the IDL instead but expressing this | 86 # dart:html. These could be expressed in the IDL instead but expressing this |
83 # as a simple table instead is more concise. | 87 # as a simple table instead is more concise. |
84 # Syntax is: ClassName.(get\.|set\.)?MemberName | 88 # Syntax is: ClassName.(get\.|set\.)?MemberName |
85 # Using get: and set: is optional and should only be used when a getter needs | 89 # Using get: and set: is optional and should only be used when a getter needs |
86 # to be suppressed but not the setter, etc. | 90 # to be suppressed but not the setter, etc. |
87 # TODO(jacobr): cleanup and augment this list. | 91 # TODO(jacobr): cleanup and augment this list. |
88 _html_library_remove = set([ | 92 _html_library_remove = set([ |
89 'Window.get:document', # Removed as we have a custom implementation. | 93 'Window.get:document', # Removed as we have a custom implementation. |
90 'NodeList.item', | 94 'NodeList.item', |
91 "Attr.*", | 95 "Attr.*", |
92 # "BarProp.*", | 96 # "BarProp.*", |
93 # "BarInfo.*", | 97 # "BarInfo.*", |
94 # "Blob.webkitSlice", | 98 # "Blob.webkitSlice", |
95 # "CDATASection.*", | 99 # "CDATASection.*", |
96 # "Comment.*", | 100 # "Comment.*", |
97 # "DOMImplementation.*", | 101 # "DOMImplementation.*", |
98 # TODO(jacobr): listing title here is a temporary hack due to a frog bug | |
99 # involving when an interface inherits from another interface and defines | |
100 # the same field. BUG(1633) | |
101 "Document.title", | |
102 "Element.title", | |
103 "Document.get:documentElement", | 102 "Document.get:documentElement", |
104 "Document.get:forms", | 103 "Document.get:forms", |
105 # "Document.get:selectedStylesheetSet", | 104 # "Document.get:selectedStylesheetSet", |
106 # "Document.set:selectedStylesheetSet", | 105 # "Document.set:selectedStylesheetSet", |
107 # "Document.get:preferredStylesheetSet", | 106 # "Document.get:preferredStylesheetSet", |
108 "Document.get:links", | 107 "Document.get:links", |
109 "Document.getElementsByTagName", | 108 "Document.getElementsByTagName", |
110 "Document.set:domain", | 109 "Document.set:domain", |
111 "Document.get:implementation", | 110 "Document.get:implementation", |
112 "Document.createAttributeNS", | 111 "Document.createAttributeNS", |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 "Element.set:outerHTML", | 193 "Element.set:outerHTML", |
195 "Element.itemScope", | 194 "Element.itemScope", |
196 "Element.itemValue", | 195 "Element.itemValue", |
197 "Element.itemId", | 196 "Element.itemId", |
198 "Element.get:itemProp", | 197 "Element.get:itemProp", |
199 'Element.scrollIntoView', | 198 'Element.scrollIntoView', |
200 "EmbedElement.getSVGDocument", | 199 "EmbedElement.getSVGDocument", |
201 "FormElement.get:elements", | 200 "FormElement.get:elements", |
202 "HTMLFrameElement.*", | 201 "HTMLFrameElement.*", |
203 "HTMLFrameSetElement.*", | 202 "HTMLFrameSetElement.*", |
204 "HTMLHtmlElement.version", | 203 "HtmlElement.version", |
| 204 "HtmlElement.manifest", |
| 205 "Document.version", |
| 206 "Document.manifest", |
205 # "IFrameElement.getSVGDocument", #TODO(jacobr): should this be removed | 207 # "IFrameElement.getSVGDocument", #TODO(jacobr): should this be removed |
206 "InputElement.dirName", | 208 "InputElement.dirName", |
207 "HTMLIsIndexElement.*", | 209 "HTMLIsIndexElement.*", |
208 "ObjectElement.getSVGDocument", | 210 "ObjectElement.getSVGDocument", |
209 "HTMLOptionsCollection.*", | 211 "HTMLOptionsCollection.*", |
210 "HTMLPropertiesCollection.*", | 212 "HTMLPropertiesCollection.*", |
211 "SelectElement.remove", | 213 "SelectElement.remove", |
212 "TextAreaElement.dirName", | 214 "TextAreaElement.dirName", |
213 "NamedNodeMap.*", | 215 "NamedNodeMap.*", |
214 "Node.isEqualNode", | 216 "Node.isEqualNode", |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 self._event_classes = set() | 405 self._event_classes = set() |
404 self._seen_event_names = {} | 406 self._seen_event_names = {} |
405 self._database = database | 407 self._database = database |
406 self._generator = generator | 408 self._generator = generator |
407 | 409 |
408 def _AllowInHtmlLibrary(self, interface, member, member_prefix): | 410 def _AllowInHtmlLibrary(self, interface, member, member_prefix): |
409 return not self._Matches(interface, member, member_prefix, | 411 return not self._Matches(interface, member, member_prefix, |
410 _html_library_remove) | 412 _html_library_remove) |
411 | 413 |
412 def _Matches(self, interface, member, member_prefix, candidates): | 414 def _Matches(self, interface, member, member_prefix, candidates): |
413 for interface_name in ([interface.id] + | 415 for interface_name in self._AllAncestorInterfaces(interface): |
414 self._generator._AllImplementedInterfaces(interface)): | |
415 if (DartType(interface_name) + '.' + member in candidates or | 416 if (DartType(interface_name) + '.' + member in candidates or |
416 DartType(interface_name) + '.' + member_prefix + member in candidates)
: | 417 DartType(interface_name) + '.' + member_prefix + member in candidates)
: |
417 return True | 418 return True |
418 return False | 419 return False |
419 | 420 |
420 def MaybeReturnDocument(self, return_type): | 421 def MaybeReturnDocument(self, return_type): |
421 """ | 422 """ |
422 To make it appear that there are not a distinct Document and | 423 To make it appear that there are not a distinct Document and |
423 HTMLHtmlElement (document.documentElement) objects we always use | 424 HTMLHtmlElement (document.documentElement) objects we always use |
424 documentElement instead of the regular document object so must not | 425 documentElement instead of the regular document object so must not |
425 allow a regular document to leak out. | 426 allow a regular document to leak out. |
426 """ | 427 """ |
427 # TODO(jacobr): any method that returns a Node could also theoretically | 428 # TODO(jacobr): any method that returns a Node could also theoretically |
428 # really return a Document but there are alot of methods that return nodes | 429 # really return a Document but there are alot of methods that return nodes |
429 # and they all appear to be safe. Consider the alternate strategy of | 430 # and they all appear to be safe. Consider the alternate strategy of |
430 # whitelisting just the known safe methods that return Nodes. | 431 # whitelisting just the known safe methods that return Nodes. |
431 return (DartType(return_type) == 'EventTarget' or | 432 return (DartType(return_type) == 'EventTarget' or |
432 DartType(return_type) == 'Document') | 433 DartType(return_type) == 'Document') |
433 | 434 |
| 435 def _AllAncestorInterfaces(self, interface): |
| 436 interfaces = ([interface.id] + |
| 437 self._generator._AllImplementedInterfaces(interface)) |
| 438 return interfaces |
| 439 |
434 def RenameInHtmlLibrary(self, interface, member, member_prefix=''): | 440 def RenameInHtmlLibrary(self, interface, member, member_prefix=''): |
435 """ | 441 """ |
436 Returns the name of the member in the HTML library or None if the member is | 442 Returns the name of the member in the HTML library or None if the member is |
437 suppressed in the HTML library | 443 suppressed in the HTML library |
438 """ | 444 """ |
439 if not self._AllowInHtmlLibrary(interface, member, member_prefix): | 445 if not self._AllowInHtmlLibrary(interface, member, member_prefix): |
440 return None | 446 return None |
441 | 447 |
442 for interface_name in ([interface.id] + | 448 for interface_name in self._AllAncestorInterfaces(interface): |
443 self._generator._AllImplementedInterfaces(interface)): | 449 name = interface_name + '.' + member |
444 name = interface.id + '.' + member | |
445 if name in _html_library_renames: | 450 if name in _html_library_renames: |
446 return _html_library_renames[name] | 451 return _html_library_renames[name] |
447 name = interface.id + '.' + member_prefix + member | 452 name = interface.id + '.' + member_prefix + member |
448 if name in _html_library_renames: | 453 if name in _html_library_renames: |
449 return _html_library_renames[name] | 454 return _html_library_renames[name] |
450 | 455 |
451 if self._PrivateInHtmlLibrary(interface, member, member_prefix): | 456 if self._PrivateInHtmlLibrary(interface, member, member_prefix): |
452 return '_' + member | 457 return '_' + member |
453 | 458 |
454 # No rename required | 459 # No rename required |
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1660 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee | 1665 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee |
1661 # that Y = Z-X, so we need to check for Y. | 1666 # that Y = Z-X, so we need to check for Y. |
1662 true_code = emitter.Emit( | 1667 true_code = emitter.Emit( |
1663 '$(INDENT)if ($COND) {\n' | 1668 '$(INDENT)if ($COND) {\n' |
1664 '$!TRUE' | 1669 '$!TRUE' |
1665 '$(INDENT)}\n', | 1670 '$(INDENT)}\n', |
1666 COND=test, INDENT=indent) | 1671 COND=test, INDENT=indent) |
1667 self.GenerateDispatch( | 1672 self.GenerateDispatch( |
1668 true_code, info, indent + ' ', position + 1, positive) | 1673 true_code, info, indent + ' ', position + 1, positive) |
1669 return True | 1674 return True |
OLD | NEW |