Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: lib/dom/scripts/systemhtml.py

Issue 10448009: Apply html renames to native wrappers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: . Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « lib/dom/scripts/dartdomgenerator.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 "Node.get:prefix", 246 "Node.get:prefix",
247 "Node.set:prefix", 247 "Node.set:prefix",
248 "Node.get:DOCUMENT_POSITION_PRECEDING", 248 "Node.get:DOCUMENT_POSITION_PRECEDING",
249 "Node.get:nodeValue", 249 "Node.get:nodeValue",
250 "Node.set:nodeValue", 250 "Node.set:nodeValue",
251 "Node.get:CDATA_SECTION_NODE", 251 "Node.get:CDATA_SECTION_NODE",
252 "Node.get:nodeName", 252 "Node.get:nodeName",
253 "Node.lookupPrefix", 253 "Node.lookupPrefix",
254 "Node.get:PROCESSING_INSTRUCTION_NODE", 254 "Node.get:PROCESSING_INSTRUCTION_NODE",
255 "IFrameElement.get:contentDocument", 255 "IFrameElement.get:contentDocument",
256 "IFrameElement.get:contentWindow",
257 "Window.get:frameElement", 256 "Window.get:frameElement",
258 ]) 257 ])
259 258
260 _html_library_custom = set([ 259 _html_library_custom = set([
261 'Document.querySelector', 260 'Document.querySelector',
261 'IFrameElement.get:contentWindow',
262 'Window.get:document', 262 'Window.get:document',
263 'Window.get:top', 263 'Window.get:top',
264 ]) 264 ])
265 265
266 # Events without onEventName attributes in the IDL we want to support. 266 # Events without onEventName attributes in the IDL we want to support.
267 # We can automatically extract most event event names by checking for 267 # We can automatically extract most event event names by checking for
268 # onEventName methods in the IDL but some events aren't listed so we need 268 # onEventName methods in the IDL but some events aren't listed so we need
269 # to manually add them here so that they are easy for users to find. 269 # to manually add them here so that they are easy for users to find.
270 _html_manual_events = { 270 _html_manual_events = {
271 'Element': ['touchleave', 'touchenter', 'webkitTransitionEnd'], 271 'Element': ['touchleave', 'touchenter', 'webkitTransitionEnd'],
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 542
543 # ------------------------------------------------------------------------------ 543 # ------------------------------------------------------------------------------
544 class HtmlSystemShared(object): 544 class HtmlSystemShared(object):
545 545
546 def __init__(self, database): 546 def __init__(self, database):
547 self._event_classes = set() 547 self._event_classes = set()
548 self._seen_event_names = {} 548 self._seen_event_names = {}
549 self._database = database 549 self._database = database
550 self._inheritance_closure = _ComputeInheritanceClosure(database) 550 self._inheritance_closure = _ComputeInheritanceClosure(database)
551 551
552 def _AllowInHtmlLibrary(self, interface, member, member_prefix): 552 def _FindMatch(self, interface_name, member, member_prefix, candidates):
553 return not self._Matches(interface, member, member_prefix, 553 for ancestor_name in self._AllAncestorInterfaces(interface_name):
554 _html_library_remove) 554 name = ancestor_name + '.' + member
555 if name in candidates:
556 return name
557 name = interface_name + '.' + member_prefix + member
558 if name in candidates:
559 return name
560 return None
555 561
556 def _Matches(self, interface, member, member_prefix, candidates): 562 def _AllAncestorInterfaces(self, interface_name):
557 for interface_name in self._AllAncestorInterfaces(interface): 563 return [interface_name] + self._inheritance_closure[interface_name]
558 if (DartType(interface_name) + '.' + member in candidates or
559 DartType(interface_name) + '.' + member_prefix + member in candidates) :
560 return True
561 return False
562 564
563 def _AllAncestorInterfaces(self, interface): 565 def RenameInHtmlLibrary(self, interface_name, member, member_prefix='',
564 return [interface.id] + self._inheritance_closure[interface.id]
565
566 def RenameInHtmlLibrary(self, interface, member, member_prefix='',
567 implementation_class=False): 566 implementation_class=False):
568 """ 567 """
569 Returns the name of the member in the HTML library or None if the member is 568 Returns the name of the member in the HTML library or None if the member is
570 suppressed in the HTML library 569 suppressed in the HTML library
571 """ 570 """
572 if not self._AllowInHtmlLibrary(interface, member, member_prefix): 571 if self._FindMatch(interface_name, member, member_prefix,
572 _html_library_remove):
573 return None 573 return None
574 574
575 target_name = member 575 name = self._FindMatch(interface_name, member, member_prefix,
576 for interface_name in self._AllAncestorInterfaces(interface): 576 _html_library_renames)
577 name = interface_name + '.' + member 577 target_name = _html_library_renames[name] if name else member
578 if name in _html_library_renames:
579 target_name = _html_library_renames[name]
580 name = interface.id + '.' + member_prefix + member
581 if name in _html_library_renames:
582 target_name = _html_library_renames[name]
583 578
584 if not target_name.startswith('_'): 579 if not target_name.startswith('_'):
585 if self._PrivateInHtmlLibrary(interface, member, member_prefix): 580 if self._FindMatch(interface_name, member, member_prefix,
581 _private_html_members):
586 if not target_name.startswith('$dom_'): # e.g. $dom_svgClassName 582 if not target_name.startswith('$dom_'): # e.g. $dom_svgClassName
587 target_name = '$dom_' + target_name 583 target_name = '$dom_' + target_name
588 584
589 # No rename required
590 return target_name 585 return target_name
591 586
592 def _PrivateInHtmlLibrary(self, interface, member, member_prefix):
593 return self._Matches(interface, member, member_prefix,
594 _private_html_members)
595
596 def IsCustomInHtmlLibrary(self, interface, member, member_prefix=''): 587 def IsCustomInHtmlLibrary(self, interface, member, member_prefix=''):
597 return self._Matches(interface, member, member_prefix, 588 return self._FindMatch(interface.id, member, member_prefix,
598 _html_library_custom) 589 _html_library_custom)
599 590
600 # TODO(jacobr): this already exists 591 # TODO(jacobr): this already exists
601 def _TraverseParents(self, interface, callback): 592 def _TraverseParents(self, interface, callback):
602 for parent in interface.parents: 593 for parent in interface.parents:
603 parent_id = parent.type.id 594 parent_id = parent.type.id
604 if self._database.HasInterface(parent_id): 595 if self._database.HasInterface(parent_id):
605 parent_interface = self._database.GetInterface(parent_id) 596 parent_interface = self._database.GetInterface(parent_id)
606 callback(parent_interface) 597 callback(parent_interface)
607 self._TraverseParents(parent_interface, callback) 598 self._TraverseParents(parent_interface, callback)
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 PARAMS=constructor_info.ParametersInterfaceDeclaration()) 821 PARAMS=constructor_info.ParametersInterfaceDeclaration())
831 for param in constructor_info.param_infos: 822 for param in constructor_info.param_infos:
832 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name) 823 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name)
833 824
834 return (constructor_info, info.factory_provider_name) 825 return (constructor_info, info.factory_provider_name)
835 826
836 827
837 def AddAttribute(self, getter, setter): 828 def AddAttribute(self, getter, setter):
838 dom_name = DartDomNameOfAttribute(getter) 829 dom_name = DartDomNameOfAttribute(getter)
839 html_getter_name = self._shared.RenameInHtmlLibrary( 830 html_getter_name = self._shared.RenameInHtmlLibrary(
840 self._interface, dom_name, 'get:') 831 self._interface.id, dom_name, 'get:')
841 html_setter_name = self._shared.RenameInHtmlLibrary( 832 html_setter_name = self._shared.RenameInHtmlLibrary(
842 self._interface, dom_name, 'set:') 833 self._interface.id, dom_name, 'set:')
843 834
844 if not html_getter_name or self._shared.IsPrivate(html_getter_name): 835 if not html_getter_name or self._shared.IsPrivate(html_getter_name):
845 getter = None 836 getter = None
846 if not html_setter_name or self._shared.IsPrivate(html_setter_name): 837 if not html_setter_name or self._shared.IsPrivate(html_setter_name):
847 setter = None 838 setter = None
848 if not getter and not setter: 839 if not getter and not setter:
849 return 840 return
850 841
851 # We don't yet handle inconsistent renames of the getter and setter yet. 842 # We don't yet handle inconsistent renames of the getter and setter yet.
852 if html_getter_name and html_setter_name: 843 if html_getter_name and html_setter_name:
(...skipping 16 matching lines...) Expand all
869 raise Exception('Unexpected getter/setter combination %s %s' % 860 raise Exception('Unexpected getter/setter combination %s %s' %
870 (getter, setter)) 861 (getter, setter))
871 862
872 def AddOperation(self, info): 863 def AddOperation(self, info):
873 """ 864 """
874 Arguments: 865 Arguments:
875 operations - contains the overloads, one or more operations with the same 866 operations - contains the overloads, one or more operations with the same
876 name. 867 name.
877 """ 868 """
878 html_name = self._shared.RenameInHtmlLibrary( 869 html_name = self._shared.RenameInHtmlLibrary(
879 self._interface, info.name) 870 self._interface.id, info.name)
880 if html_name and not self._shared.IsPrivate(html_name): 871 if html_name and not self._shared.IsPrivate(html_name):
881 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', 872 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */',
882 DOMINTERFACE=info.overloads[0].doc_js_interface_name, 873 DOMINTERFACE=info.overloads[0].doc_js_interface_name,
883 DOMNAME=info.name) 874 DOMNAME=info.name)
884 875
885 self._members_emitter.Emit('\n' 876 self._members_emitter.Emit('\n'
886 ' $TYPE $NAME($PARAMS);\n', 877 ' $TYPE $NAME($PARAMS);\n',
887 TYPE=info.type_name, 878 TYPE=info.type_name,
888 NAME=html_name, 879 NAME=html_name,
889 PARAMS=info.ParametersInterfaceDeclaration()) 880 PARAMS=info.ParametersInterfaceDeclaration())
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 template_file = 'immutable_list_mixin.darttemplate' 1046 template_file = 'immutable_list_mixin.darttemplate'
1056 template = self._system._templates.Load(template_file) 1047 template = self._system._templates.Load(template_file)
1057 self._members_emitter.Emit(template, E=DartType(element_type)) 1048 self._members_emitter.Emit(template, E=DartType(element_type))
1058 1049
1059 def AddAttribute(self, getter, setter): 1050 def AddAttribute(self, getter, setter):
1060 dom_name = DartDomNameOfAttribute(getter or setter) 1051 dom_name = DartDomNameOfAttribute(getter or setter)
1061 html_getter_name = None 1052 html_getter_name = None
1062 if not self._shared.IsCustomInHtmlLibrary( 1053 if not self._shared.IsCustomInHtmlLibrary(
1063 self._interface, dom_name, 'get:'): 1054 self._interface, dom_name, 'get:'):
1064 html_getter_name = self._shared.RenameInHtmlLibrary( 1055 html_getter_name = self._shared.RenameInHtmlLibrary(
1065 self._interface, dom_name, 'get:', 1056 self._interface.id, dom_name, 'get:',
1066 implementation_class=True) 1057 implementation_class=True)
1067 html_setter_name = None 1058 html_setter_name = None
1068 if not self._shared.IsCustomInHtmlLibrary( 1059 if not self._shared.IsCustomInHtmlLibrary(
1069 self._interface, dom_name, 'set:'): 1060 self._interface, dom_name, 'set:'):
1070 html_setter_name = self._shared.RenameInHtmlLibrary( 1061 html_setter_name = self._shared.RenameInHtmlLibrary(
1071 self._interface, dom_name, 'set:', 1062 self._interface.id, dom_name, 'set:',
1072 implementation_class=True) 1063 implementation_class=True)
1073 1064
1074 if not html_getter_name: 1065 if not html_getter_name:
1075 getter = None 1066 getter = None
1076 if not html_setter_name: 1067 if not html_setter_name:
1077 setter = None 1068 setter = None
1078 1069
1079 if not getter and not setter: 1070 if not getter and not setter:
1080 return 1071 return
1081 1072
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 1147
1157 def AddOperation(self, info): 1148 def AddOperation(self, info):
1158 """ 1149 """
1159 Arguments: 1150 Arguments:
1160 info: An OperationInfo object. 1151 info: An OperationInfo object.
1161 """ 1152 """
1162 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name): 1153 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name):
1163 return 1154 return
1164 1155
1165 html_name = self._shared.RenameInHtmlLibrary( 1156 html_name = self._shared.RenameInHtmlLibrary(
1166 self._interface, info.name, implementation_class=True) 1157 self._interface.id, info.name, implementation_class=True)
1167 if not html_name: 1158 if not html_name:
1168 return 1159 return
1169 1160
1170 # Do we need a native body? 1161 # Do we need a native body?
1171 if html_name != info.declared_name: 1162 if html_name != info.declared_name:
1172 return_type = self._NarrowOutputType(info.type_name) 1163 return_type = self._NarrowOutputType(info.type_name)
1173 1164
1174 operation_emitter = self._members_emitter.Emit('$!SCOPE', 1165 operation_emitter = self._members_emitter.Emit('$!SCOPE',
1175 TYPE=return_type, 1166 TYPE=return_type,
1176 HTML_NAME=html_name, 1167 HTML_NAME=html_name,
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
1516 if name in self._base_members: # Avoid illegal Dart 'static override'. 1507 if name in self._base_members: # Avoid illegal Dart 'static override'.
1517 method_name = method_name + '_' + self._interface.id 1508 method_name = method_name + '_' + self._interface.id
1518 return method_name 1509 return method_name
1519 1510
1520 def AddAttribute(self, getter, setter): 1511 def AddAttribute(self, getter, setter):
1521 dom_name = DartDomNameOfAttribute(getter or setter) 1512 dom_name = DartDomNameOfAttribute(getter or setter)
1522 html_getter_name = None 1513 html_getter_name = None
1523 if not self._shared.IsCustomInHtmlLibrary( 1514 if not self._shared.IsCustomInHtmlLibrary(
1524 self._interface, dom_name, 'get:'): 1515 self._interface, dom_name, 'get:'):
1525 html_getter_name = self._shared.RenameInHtmlLibrary( 1516 html_getter_name = self._shared.RenameInHtmlLibrary(
1526 self._interface, dom_name, 'get:', 1517 self._interface.id, dom_name, 'get:',
1527 implementation_class=True) 1518 implementation_class=True)
1528 html_setter_name = None 1519 html_setter_name = None
1529 if not self._shared.IsCustomInHtmlLibrary( 1520 if not self._shared.IsCustomInHtmlLibrary(
1530 self._interface, dom_name, 'set:'): 1521 self._interface, dom_name, 'set:'):
1531 html_setter_name = self._shared.RenameInHtmlLibrary( 1522 html_setter_name = self._shared.RenameInHtmlLibrary(
1532 self._interface, dom_name, 'set:', 1523 self._interface.id, dom_name, 'set:',
1533 implementation_class=True) 1524 implementation_class=True)
1534 1525
1535 if getter and html_getter_name: 1526 if getter and html_getter_name:
1536 self._AddGetter(getter, html_getter_name) 1527 self._AddGetter(getter, html_getter_name)
1537 if setter and html_setter_name: 1528 if setter and html_setter_name:
1538 self._AddSetter(setter, html_setter_name) 1529 self._AddSetter(setter, html_setter_name)
1539 1530
1540 def _AddGetter(self, attr, html_name): 1531 def _AddGetter(self, attr, html_name):
1541 self._members_emitter.Emit( 1532 self._members_emitter.Emit(
1542 '\n' 1533 '\n'
1543 ' $TYPE get $(HTML_NAME)() => _wrap($(THIS).$DOM_NAME);\n', 1534 ' $TYPE get $(HTML_NAME)() => _wrap($(THIS).$HTML_NAME);\n',
1544 HTML_NAME=html_name, 1535 HTML_NAME=html_name,
1545 DOM_NAME=DartDomNameOfAttribute(attr),
1546 TYPE=DartType(attr.type.id), 1536 TYPE=DartType(attr.type.id),
1547 THIS=self.DomObjectName()) 1537 THIS=self.DomObjectName())
1548 1538
1549 def _AddSetter(self, attr, html_name): 1539 def _AddSetter(self, attr, html_name):
1550 self._members_emitter.Emit( 1540 self._members_emitter.Emit(
1551 '\n' 1541 '\n'
1552 ' void set $(HTML_NAME)($TYPE value) { ' 1542 ' void set $(HTML_NAME)($TYPE value) { '
1553 '$(THIS).$DOM_NAME = _unwrap(value); }\n', 1543 '$(THIS).$HTML_NAME = _unwrap(value); }\n',
1554 HTML_NAME=html_name, 1544 HTML_NAME=html_name,
1555 DOM_NAME=DartDomNameOfAttribute(attr),
1556 TYPE=DartType(attr.type.id), 1545 TYPE=DartType(attr.type.id),
1557 THIS=self.DomObjectName()) 1546 THIS=self.DomObjectName())
1558 1547
1559 def AddSecondaryAttribute(self, interface, getter, setter): 1548 def AddSecondaryAttribute(self, interface, getter, setter):
1560 self._SecondaryContext(interface) 1549 self._SecondaryContext(interface)
1561 self.AddAttribute(getter, setter) 1550 self.AddAttribute(getter, setter)
1562 1551
1563 def AddSecondaryOperation(self, interface, info): 1552 def AddSecondaryOperation(self, interface, info):
1564 self._SecondaryContext(interface) 1553 self._SecondaryContext(interface)
1565 self.AddOperation(info) 1554 self.AddOperation(info)
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 1643
1655 def AddOperation(self, info): 1644 def AddOperation(self, info):
1656 """ 1645 """
1657 Arguments: 1646 Arguments:
1658 info: An OperationInfo object. 1647 info: An OperationInfo object.
1659 """ 1648 """
1660 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name): 1649 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name):
1661 return 1650 return
1662 1651
1663 html_name = self._shared.RenameInHtmlLibrary( 1652 html_name = self._shared.RenameInHtmlLibrary(
1664 self._interface, info.name, implementation_class=True) 1653 self._interface.id, info.name, implementation_class=True)
1665 1654
1666 if not html_name: 1655 if not html_name:
1667 return 1656 return
1668 1657
1669 arguments = self._UnwrappedParameters(info, len(info.param_infos)) 1658 arguments = self._UnwrappedParameters(info, len(info.param_infos))
1670 function_call = '%s.%s(%s)' % (self.DomObjectName(), info.name, arguments) 1659 function_call = '%s.%s(%s)' % (self.DomObjectName(), html_name, arguments)
1671 if info.type_name != 'void': 1660 if info.type_name != 'void':
1672 # We could place the logic for handling Document directly in _wrap 1661 # We could place the logic for handling Document directly in _wrap
1673 # but we chose to place it here so that bugs in the wrapper and 1662 # but we chose to place it here so that bugs in the wrapper and
1674 # wrapperless implementations are more consistent. 1663 # wrapperless implementations are more consistent.
1675 function_call = '_wrap(%s)' % function_call 1664 function_call = '_wrap(%s)' % function_call
1676 1665
1677 self._members_emitter.Emit( 1666 self._members_emitter.Emit(
1678 '\n' 1667 '\n'
1679 ' $TYPE $HTML_NAME($PARAMS) => $FUNCTION_CALL;\n', 1668 ' $TYPE $HTML_NAME($PARAMS) => $FUNCTION_CALL;\n',
1680 TYPE=info.type_name, 1669 TYPE=info.type_name,
(...skipping 20 matching lines...) Expand all
1701 Collect(database.GetInterface(parent.type.id), 1690 Collect(database.GetInterface(parent.type.id),
1702 seen, collected) 1691 seen, collected)
1703 1692
1704 inheritance_closure = {} 1693 inheritance_closure = {}
1705 for interface in database.GetInterfaces(): 1694 for interface in database.GetInterfaces():
1706 seen = set() 1695 seen = set()
1707 collected = [] 1696 collected = []
1708 Collect(interface, seen, collected) 1697 Collect(interface, seen, collected)
1709 inheritance_closure[interface.id] = collected 1698 inheritance_closure[interface.id] = collected
1710 return inheritance_closure 1699 return inheritance_closure
OLDNEW
« no previous file with comments | « lib/dom/scripts/dartdomgenerator.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698