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

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',
Anton Muhin 2012/05/24 17:16:58 why this move?
podivilov 2012/05/25 12:00:35 contentWindow is not removed from dart:html, it ju
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 _Matches(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 if (DartType(ancestor_name) + '.' + member in candidates or
555 555 DartType(ancestor_name) + '.' + member_prefix + member in candidates):
556 def _Matches(self, interface, member, member_prefix, candidates):
557 for interface_name in self._AllAncestorInterfaces(interface):
558 if (DartType(interface_name) + '.' + member in candidates or
559 DartType(interface_name) + '.' + member_prefix + member in candidates) :
560 return True 556 return True
561 return False 557 return False
562 558
563 def _AllAncestorInterfaces(self, interface): 559 def _AllAncestorInterfaces(self, interface_name):
564 return [interface.id] + self._inheritance_closure[interface.id] 560 return [interface_name] + self._inheritance_closure[interface_name]
565 561
566 def RenameInHtmlLibrary(self, interface, member, member_prefix='', 562 def RenameInHtmlLibrary(self, interface_name, member, member_prefix='',
567 implementation_class=False): 563 implementation_class=False):
568 """ 564 """
569 Returns the name of the member in the HTML library or None if the member is 565 Returns the name of the member in the HTML library or None if the member is
570 suppressed in the HTML library 566 suppressed in the HTML library
571 """ 567 """
572 if not self._AllowInHtmlLibrary(interface, member, member_prefix): 568 if self._Matches(interface_name, member, member_prefix,
569 _html_library_remove):
573 return None 570 return None
574 571
575 target_name = member 572 target_name = member
576 for interface_name in self._AllAncestorInterfaces(interface): 573 for ancestor_name in self._AllAncestorInterfaces(interface_name):
Anton Muhin 2012/05/24 17:16:58 it looks like now you can merge this logic into _M
podivilov 2012/05/25 12:00:35 Could you please clarify? I don't see how it can b
Anton Muhin 2012/05/25 12:04:29 Sorry. It looks like the loop below is almost _Ma
podivilov 2012/05/25 12:16:32 _Matches works with sets, while _html_library_rena
Anton Muhin 2012/05/25 12:17:45 I think it's worth it, but up to you. On 2012/05/
podivilov 2012/05/25 12:37:54 Done.
Anton Muhin 2012/05/25 12:39:16 Thanks a lot! Still LGTM On 2012/05/25 12:37:54,
577 name = interface_name + '.' + member 574 name = ancestor_name + '.' + member
578 if name in _html_library_renames: 575 if name in _html_library_renames:
579 target_name = _html_library_renames[name] 576 target_name = _html_library_renames[name]
580 name = interface.id + '.' + member_prefix + member 577 name = interface_name + '.' + member_prefix + member
581 if name in _html_library_renames: 578 if name in _html_library_renames:
582 target_name = _html_library_renames[name] 579 target_name = _html_library_renames[name]
583 580
584 if not target_name.startswith('_'): 581 if not target_name.startswith('_'):
585 if self._PrivateInHtmlLibrary(interface, member, member_prefix): 582 if self._Matches(interface_name, member, member_prefix,
583 _private_html_members):
586 if not target_name.startswith('$dom_'): # e.g. $dom_svgClassName 584 if not target_name.startswith('$dom_'): # e.g. $dom_svgClassName
587 target_name = '$dom_' + target_name 585 target_name = '$dom_' + target_name
Anton Muhin 2012/05/24 17:16:58 this works by a chance as you don't account for me
podivilov 2012/05/25 12:00:35 member_prefix is passed to self._Matches above. Am
Anton Muhin 2012/05/25 12:04:29 Yes, sorry, I was wrong. On 2012/05/25 12:00:35,
588 586
589 # No rename required
590 return target_name 587 return target_name
591 588
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=''): 589 def IsCustomInHtmlLibrary(self, interface, member, member_prefix=''):
597 return self._Matches(interface, member, member_prefix, 590 return self._Matches(interface.id, member, member_prefix,
598 _html_library_custom) 591 _html_library_custom)
599 592
600 # TODO(jacobr): this already exists 593 # TODO(jacobr): this already exists
601 def _TraverseParents(self, interface, callback): 594 def _TraverseParents(self, interface, callback):
602 for parent in interface.parents: 595 for parent in interface.parents:
603 parent_id = parent.type.id 596 parent_id = parent.type.id
604 if self._database.HasInterface(parent_id): 597 if self._database.HasInterface(parent_id):
605 parent_interface = self._database.GetInterface(parent_id) 598 parent_interface = self._database.GetInterface(parent_id)
606 callback(parent_interface) 599 callback(parent_interface)
607 self._TraverseParents(parent_interface, callback) 600 self._TraverseParents(parent_interface, callback)
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 PARAMS=constructor_info.ParametersInterfaceDeclaration()) 823 PARAMS=constructor_info.ParametersInterfaceDeclaration())
831 for param in constructor_info.param_infos: 824 for param in constructor_info.param_infos:
832 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name) 825 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name)
833 826
834 return (constructor_info, info.factory_provider_name) 827 return (constructor_info, info.factory_provider_name)
835 828
836 829
837 def AddAttribute(self, getter, setter): 830 def AddAttribute(self, getter, setter):
838 dom_name = DartDomNameOfAttribute(getter) 831 dom_name = DartDomNameOfAttribute(getter)
839 html_getter_name = self._shared.RenameInHtmlLibrary( 832 html_getter_name = self._shared.RenameInHtmlLibrary(
840 self._interface, dom_name, 'get:') 833 self._interface.id, dom_name, 'get:')
841 html_setter_name = self._shared.RenameInHtmlLibrary( 834 html_setter_name = self._shared.RenameInHtmlLibrary(
842 self._interface, dom_name, 'set:') 835 self._interface.id, dom_name, 'set:')
843 836
844 if not html_getter_name or self._shared.IsPrivate(html_getter_name): 837 if not html_getter_name or self._shared.IsPrivate(html_getter_name):
845 getter = None 838 getter = None
846 if not html_setter_name or self._shared.IsPrivate(html_setter_name): 839 if not html_setter_name or self._shared.IsPrivate(html_setter_name):
847 setter = None 840 setter = None
848 if not getter and not setter: 841 if not getter and not setter:
849 return 842 return
850 843
851 # We don't yet handle inconsistent renames of the getter and setter yet. 844 # We don't yet handle inconsistent renames of the getter and setter yet.
852 if html_getter_name and html_setter_name: 845 if html_getter_name and html_setter_name:
(...skipping 16 matching lines...) Expand all
869 raise Exception('Unexpected getter/setter combination %s %s' % 862 raise Exception('Unexpected getter/setter combination %s %s' %
870 (getter, setter)) 863 (getter, setter))
871 864
872 def AddOperation(self, info): 865 def AddOperation(self, info):
873 """ 866 """
874 Arguments: 867 Arguments:
875 operations - contains the overloads, one or more operations with the same 868 operations - contains the overloads, one or more operations with the same
876 name. 869 name.
877 """ 870 """
878 html_name = self._shared.RenameInHtmlLibrary( 871 html_name = self._shared.RenameInHtmlLibrary(
879 self._interface, info.name) 872 self._interface.id, info.name)
880 if html_name and not self._shared.IsPrivate(html_name): 873 if html_name and not self._shared.IsPrivate(html_name):
881 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', 874 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */',
882 DOMINTERFACE=info.overloads[0].doc_js_interface_name, 875 DOMINTERFACE=info.overloads[0].doc_js_interface_name,
883 DOMNAME=info.name) 876 DOMNAME=info.name)
884 877
885 self._members_emitter.Emit('\n' 878 self._members_emitter.Emit('\n'
886 ' $TYPE $NAME($PARAMS);\n', 879 ' $TYPE $NAME($PARAMS);\n',
887 TYPE=info.type_name, 880 TYPE=info.type_name,
888 NAME=html_name, 881 NAME=html_name,
889 PARAMS=info.ParametersInterfaceDeclaration()) 882 PARAMS=info.ParametersInterfaceDeclaration())
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 template_file = 'immutable_list_mixin.darttemplate' 1048 template_file = 'immutable_list_mixin.darttemplate'
1056 template = self._system._templates.Load(template_file) 1049 template = self._system._templates.Load(template_file)
1057 self._members_emitter.Emit(template, E=DartType(element_type)) 1050 self._members_emitter.Emit(template, E=DartType(element_type))
1058 1051
1059 def AddAttribute(self, getter, setter): 1052 def AddAttribute(self, getter, setter):
1060 dom_name = DartDomNameOfAttribute(getter or setter) 1053 dom_name = DartDomNameOfAttribute(getter or setter)
1061 html_getter_name = None 1054 html_getter_name = None
1062 if not self._shared.IsCustomInHtmlLibrary( 1055 if not self._shared.IsCustomInHtmlLibrary(
1063 self._interface, dom_name, 'get:'): 1056 self._interface, dom_name, 'get:'):
1064 html_getter_name = self._shared.RenameInHtmlLibrary( 1057 html_getter_name = self._shared.RenameInHtmlLibrary(
1065 self._interface, dom_name, 'get:', 1058 self._interface.id, dom_name, 'get:',
1066 implementation_class=True) 1059 implementation_class=True)
1067 html_setter_name = None 1060 html_setter_name = None
1068 if not self._shared.IsCustomInHtmlLibrary( 1061 if not self._shared.IsCustomInHtmlLibrary(
1069 self._interface, dom_name, 'set:'): 1062 self._interface, dom_name, 'set:'):
1070 html_setter_name = self._shared.RenameInHtmlLibrary( 1063 html_setter_name = self._shared.RenameInHtmlLibrary(
1071 self._interface, dom_name, 'set:', 1064 self._interface.id, dom_name, 'set:',
1072 implementation_class=True) 1065 implementation_class=True)
1073 1066
1074 if not html_getter_name: 1067 if not html_getter_name:
1075 getter = None 1068 getter = None
1076 if not html_setter_name: 1069 if not html_setter_name:
1077 setter = None 1070 setter = None
1078 1071
1079 if not getter and not setter: 1072 if not getter and not setter:
1080 return 1073 return
1081 1074
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 1149
1157 def AddOperation(self, info): 1150 def AddOperation(self, info):
1158 """ 1151 """
1159 Arguments: 1152 Arguments:
1160 info: An OperationInfo object. 1153 info: An OperationInfo object.
1161 """ 1154 """
1162 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name): 1155 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name):
1163 return 1156 return
1164 1157
1165 html_name = self._shared.RenameInHtmlLibrary( 1158 html_name = self._shared.RenameInHtmlLibrary(
1166 self._interface, info.name, implementation_class=True) 1159 self._interface.id, info.name, implementation_class=True)
1167 if not html_name: 1160 if not html_name:
1168 return 1161 return
1169 1162
1170 # Do we need a native body? 1163 # Do we need a native body?
1171 if html_name != info.declared_name: 1164 if html_name != info.declared_name:
1172 return_type = self._NarrowOutputType(info.type_name) 1165 return_type = self._NarrowOutputType(info.type_name)
1173 1166
1174 operation_emitter = self._members_emitter.Emit('$!SCOPE', 1167 operation_emitter = self._members_emitter.Emit('$!SCOPE',
1175 TYPE=return_type, 1168 TYPE=return_type,
1176 HTML_NAME=html_name, 1169 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'. 1509 if name in self._base_members: # Avoid illegal Dart 'static override'.
1517 method_name = method_name + '_' + self._interface.id 1510 method_name = method_name + '_' + self._interface.id
1518 return method_name 1511 return method_name
1519 1512
1520 def AddAttribute(self, getter, setter): 1513 def AddAttribute(self, getter, setter):
1521 dom_name = DartDomNameOfAttribute(getter or setter) 1514 dom_name = DartDomNameOfAttribute(getter or setter)
1522 html_getter_name = None 1515 html_getter_name = None
1523 if not self._shared.IsCustomInHtmlLibrary( 1516 if not self._shared.IsCustomInHtmlLibrary(
1524 self._interface, dom_name, 'get:'): 1517 self._interface, dom_name, 'get:'):
1525 html_getter_name = self._shared.RenameInHtmlLibrary( 1518 html_getter_name = self._shared.RenameInHtmlLibrary(
1526 self._interface, dom_name, 'get:', 1519 self._interface.id, dom_name, 'get:',
1527 implementation_class=True) 1520 implementation_class=True)
1528 html_setter_name = None 1521 html_setter_name = None
1529 if not self._shared.IsCustomInHtmlLibrary( 1522 if not self._shared.IsCustomInHtmlLibrary(
1530 self._interface, dom_name, 'set:'): 1523 self._interface, dom_name, 'set:'):
1531 html_setter_name = self._shared.RenameInHtmlLibrary( 1524 html_setter_name = self._shared.RenameInHtmlLibrary(
1532 self._interface, dom_name, 'set:', 1525 self._interface.id, dom_name, 'set:',
1533 implementation_class=True) 1526 implementation_class=True)
1534 1527
1535 if getter and html_getter_name: 1528 if getter and html_getter_name:
1536 self._AddGetter(getter, html_getter_name) 1529 self._AddGetter(getter, html_getter_name)
1537 if setter and html_setter_name: 1530 if setter and html_setter_name:
1538 self._AddSetter(setter, html_setter_name) 1531 self._AddSetter(setter, html_setter_name)
1539 1532
1540 def _AddGetter(self, attr, html_name): 1533 def _AddGetter(self, attr, html_name):
1541 self._members_emitter.Emit( 1534 self._members_emitter.Emit(
1542 '\n' 1535 '\n'
1543 ' $TYPE get $(HTML_NAME)() => _wrap($(THIS).$DOM_NAME);\n', 1536 ' $TYPE get $(HTML_NAME)() => _wrap($(THIS).$HTML_NAME);\n',
1544 HTML_NAME=html_name, 1537 HTML_NAME=html_name,
1545 DOM_NAME=DartDomNameOfAttribute(attr),
1546 TYPE=DartType(attr.type.id), 1538 TYPE=DartType(attr.type.id),
1547 THIS=self.DomObjectName()) 1539 THIS=self.DomObjectName())
1548 1540
1549 def _AddSetter(self, attr, html_name): 1541 def _AddSetter(self, attr, html_name):
1550 self._members_emitter.Emit( 1542 self._members_emitter.Emit(
1551 '\n' 1543 '\n'
1552 ' void set $(HTML_NAME)($TYPE value) { ' 1544 ' void set $(HTML_NAME)($TYPE value) { '
1553 '$(THIS).$DOM_NAME = _unwrap(value); }\n', 1545 '$(THIS).$HTML_NAME = _unwrap(value); }\n',
1554 HTML_NAME=html_name, 1546 HTML_NAME=html_name,
1555 DOM_NAME=DartDomNameOfAttribute(attr),
1556 TYPE=DartType(attr.type.id), 1547 TYPE=DartType(attr.type.id),
1557 THIS=self.DomObjectName()) 1548 THIS=self.DomObjectName())
1558 1549
1559 def AddSecondaryAttribute(self, interface, getter, setter): 1550 def AddSecondaryAttribute(self, interface, getter, setter):
1560 self._SecondaryContext(interface) 1551 self._SecondaryContext(interface)
1561 self.AddAttribute(getter, setter) 1552 self.AddAttribute(getter, setter)
1562 1553
1563 def AddSecondaryOperation(self, interface, info): 1554 def AddSecondaryOperation(self, interface, info):
1564 self._SecondaryContext(interface) 1555 self._SecondaryContext(interface)
1565 self.AddOperation(info) 1556 self.AddOperation(info)
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 1645
1655 def AddOperation(self, info): 1646 def AddOperation(self, info):
1656 """ 1647 """
1657 Arguments: 1648 Arguments:
1658 info: An OperationInfo object. 1649 info: An OperationInfo object.
1659 """ 1650 """
1660 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name): 1651 if self._shared.IsCustomInHtmlLibrary(self._interface, info.name):
1661 return 1652 return
1662 1653
1663 html_name = self._shared.RenameInHtmlLibrary( 1654 html_name = self._shared.RenameInHtmlLibrary(
1664 self._interface, info.name, implementation_class=True) 1655 self._interface.id, info.name, implementation_class=True)
1665 1656
1666 if not html_name: 1657 if not html_name:
1667 return 1658 return
1668 1659
1669 arguments = self._UnwrappedParameters(info, len(info.param_infos)) 1660 arguments = self._UnwrappedParameters(info, len(info.param_infos))
1670 function_call = '%s.%s(%s)' % (self.DomObjectName(), info.name, arguments) 1661 function_call = '%s.%s(%s)' % (self.DomObjectName(), html_name, arguments)
1671 if info.type_name != 'void': 1662 if info.type_name != 'void':
1672 # We could place the logic for handling Document directly in _wrap 1663 # 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 1664 # but we chose to place it here so that bugs in the wrapper and
1674 # wrapperless implementations are more consistent. 1665 # wrapperless implementations are more consistent.
1675 function_call = '_wrap(%s)' % function_call 1666 function_call = '_wrap(%s)' % function_call
1676 1667
1677 self._members_emitter.Emit( 1668 self._members_emitter.Emit(
1678 '\n' 1669 '\n'
1679 ' $TYPE $HTML_NAME($PARAMS) => $FUNCTION_CALL;\n', 1670 ' $TYPE $HTML_NAME($PARAMS) => $FUNCTION_CALL;\n',
1680 TYPE=info.type_name, 1671 TYPE=info.type_name,
(...skipping 20 matching lines...) Expand all
1701 Collect(database.GetInterface(parent.type.id), 1692 Collect(database.GetInterface(parent.type.id),
1702 seen, collected) 1693 seen, collected)
1703 1694
1704 inheritance_closure = {} 1695 inheritance_closure = {}
1705 for interface in database.GetInterfaces(): 1696 for interface in database.GetInterfaces():
1706 seen = set() 1697 seen = set()
1707 collected = [] 1698 collected = []
1708 Collect(interface, seen, collected) 1699 Collect(interface, seen, collected)
1709 inheritance_closure[interface.id] = collected 1700 inheritance_closure[interface.id] = collected
1710 return inheritance_closure 1701 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