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

Unified Diff: lib/dom/scripts/htmlrenamer.py

Issue 10703194: Extract interfaces and members renaming logic to a new HtmlRenamer class. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: lib/dom/scripts/htmlrenamer.py
diff --git a/lib/dom/scripts/htmlrenamer.py b/lib/dom/scripts/htmlrenamer.py
new file mode 100644
index 0000000000000000000000000000000000000000..6a8d85db3ee9a6767f62f4f0d67e15ee7fad34b7
--- /dev/null
+++ b/lib/dom/scripts/htmlrenamer.py
@@ -0,0 +1,312 @@
+#!/usr/bin/python
+# Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+_html_strip_webkit_prefix_classes = [
+ 'Animation',
+ 'AnimationEvent',
+ 'AnimationList',
+ 'BlobBuilder',
+ 'CSSKeyframeRule',
+ 'CSSKeyframesRule',
+ 'CSSMatrix',
+ 'CSSTransformValue',
+ 'Flags',
+ 'LoseContext',
+ 'Point',
+ 'TransitionEvent']
+
+# Members from the standard dom that should not be exposed publicly in dart:html
+# but need to be exposed internally to implement dart:html on top of a standard
+# browser.
+_private_html_members = set([
+ 'Document.createElement',
+ 'Document.createElementNS',
+ 'Document.createEvent',
+ 'Document.createTextNode',
+ 'Document.createTouchList',
+ 'Document.getElementById',
+ 'Document.getElementsByClassName',
+ 'Document.getElementsByName',
+ 'Document.getElementsByTagName',
+ 'Document.querySelector',
+ 'Document.querySelectorAll',
+ 'DocumentFragment.querySelector',
+ 'DocumentFragment.querySelectorAll',
+ 'Element.childElementCount',
+ 'Element.children',
+ 'Element.className',
+ 'Element.clientHeight',
+ 'Element.clientLeft',
+ 'Element.clientTop',
+ 'Element.clientWidth',
+ 'Element.firstElementChild',
+ 'Element.getAttribute',
+ 'Element.getBoundingClientRect',
+ 'Element.getClientRects',
+ 'Element.getElementsByClassName',
+ 'Element.getElementsByTagName',
+ 'Element.hasAttribute',
+ 'Element.lastElementChild',
+ 'Element.offsetHeight',
+ 'Element.offsetLeft',
+ 'Element.offsetTop',
+ 'Element.offsetWidth',
+ 'Element.querySelector',
+ 'Element.querySelectorAll',
+ 'Element.removeAttribute',
+ 'Element.scrollHeight',
+ 'Element.scrollLeft',
+ 'Element.scrollTop',
+ 'Element.scrollWidth',
+ 'Element.setAttribute',
+ 'Event.initEvent',
+ 'EventTarget.addEventListener',
+ 'EventTarget.dispatchEvent',
+ 'EventTarget.removeEventListener',
+ 'MouseEvent.initMouseEvent',
+ 'Node.appendChild',
+ 'Node.attributes',
+ 'Node.childNodes',
+ 'Node.firstChild',
+ 'Node.lastChild',
+ "Node.nodeType",
+ 'Node.removeChild',
+ 'Node.replaceChild',
+ 'Storage.length',
+ 'Storage.clear',
+ 'Storage.getItem',
+ 'Storage.key',
+ 'Storage.removeItem',
+ 'Storage.setItem',
+ 'Window.getComputedStyle',
+])
+
+# Members from the standard dom that exist in the dart:html library with
+# identical functionality but with cleaner names.
+_renamed_html_members = {
+ 'Document.defaultView': 'window',
+ 'Element.webkitMatchesSelector' : 'matchesSelector',
+ 'Element.scrollIntoViewIfNeeded': 'scrollIntoView',
+ 'Node.cloneNode': 'clone',
+ 'Node.nextSibling': 'nextNode',
+ 'Node.ownerDocument': 'document',
+ 'Node.parentNode': 'parent',
+ 'Node.previousSibling': 'previousNode',
+ 'Node.textContent': 'text',
+ 'SVGElement.className': '$dom_svgClassName',
+ 'SVGAnimatedString.className': '$dom_svgClassName',
+ 'SVGStylable.className': '$dom_svgClassName',
+}
+
+# Members and classes from the dom that should be removed completelly from
+# dart:html. These could be expressed in the IDL instead but expressing this
+# as a simple table instead is more concise.
+# Syntax is: ClassName.(get\.|set\.)?MemberName
+# Using get: and set: is optional and should only be used when a getter needs
+# to be suppressed but not the setter, etc.
+# TODO(jacobr): cleanup and augment this list.
+_removed_html_members = set([
+ 'NodeList.item',
+ "Attr.*",
+# "BarProp.*",
+# "BarInfo.*",
+# "Blob.webkitSlice",
+# "CDATASection.*",
+# "Comment.*",
+# "DOMImplementation.*",
+ "Document.get:forms",
+# "Document.get:selectedStylesheetSet",
+# "Document.set:selectedStylesheetSet",
+# "Document.get:preferredStylesheetSet",
+ "Document.get:links",
+ "Document.set:domain",
+ "Document.get:implementation",
+ "Document.createAttributeNS",
+ "Document.get:inputEncoding",
+ "Document.get:height",
+ "Document.get:width",
+ "Element.getElementsByTagNameNS",
+ "Document.get:compatMode",
+ "Document.importNode",
+ "Document.evaluate",
+ "Document.get:images",
+ "Document.createExpression",
+ "Document.getOverrideStyle",
+ "Document.xmlStandalone",
+ "Document.createComment",
+ "Document.adoptNode",
+ "Document.get:characterSet",
+ "Document.createAttribute",
+ "Document.get:URL",
+ "Document.createEntityReference",
+ "Document.get:documentURI",
+ "Document.set:documentURI",
+ "Document.createNodeIterator",
+ "Document.createProcessingInstruction",
+ "Document.get:doctype",
+ "Document.createTreeWalker",
+ "Document.location",
+ "Document.createNSResolver",
+ "Document.get:xmlEncoding",
+ "Document.get:defaultCharset",
+ "Document.get:applets",
+ "Document.getSelection",
+ "Document.xmlVersion",
+ "Document.get:anchors",
+ "Document.getElementsByTagNameNS",
+ "DocumentType.*",
+ "Element.hasAttributeNS",
+ "Element.getAttributeNS",
+ "Element.setAttributeNode",
+ "Element.getAttributeNode",
+ "Element.removeAttributeNode",
+ "Element.removeAttributeNS",
+ "Element.setAttributeNodeNS",
+ "Element.getAttributeNodeNS",
+ "Element.setAttributeNS",
+ "BodyElement.text",
+ "AnchorElement.text",
+ "OptionElement.text",
+ "ScriptElement.text",
+ "TitleElement.text",
+# "EventSource.get:url",
+# TODO(jacobr): should these be removed?
+ "Document.close",
+ "Document.hasFocus",
+
+ "Document.vlinkColor",
+ "Document.captureEvents",
+ "Document.releaseEvents",
+ "Document.get:compatMode",
+ "Document.designMode",
+ "Document.dir",
+ "Document.all",
+ "Document.write",
+ "Document.fgColor",
+ "Document.bgColor",
+ "Document.get:plugins",
+ "Document.alinkColor",
+ "Document.get:embeds",
+ "Document.open",
+ "Document.clear",
+ "Document.get:scripts",
+ "Document.writeln",
+ "Document.linkColor",
+ "Element.get:itemRef",
+ "Element.outerText",
+ "Element.accessKey",
+ "Element.get:itemType",
+ "Element.innerText",
+ "Element.set:outerHTML",
+ "Element.itemScope",
+ "Element.itemValue",
+ "Element.itemId",
+ "Element.get:itemProp",
+ 'Element.scrollIntoView',
+ 'Element.get:classList',
+ "EmbedElement.getSVGDocument",
+ "FormElement.get:elements",
+ "HTMLFrameElement.*",
+ "HTMLFrameSetElement.*",
+ "HtmlElement.version",
+ "HtmlElement.manifest",
+ "Document.version",
+ "Document.manifest",
+# "IFrameElement.getSVGDocument", #TODO(jacobr): should this be removed
+ "InputElement.dirName",
+ "HTMLIsIndexElement.*",
+ "ObjectElement.getSVGDocument",
+ "HTMLOptionsCollection.*",
+ "HTMLPropertiesCollection.*",
+ "SelectElement.remove",
+ "TextAreaElement.dirName",
+ "NamedNodeMap.*",
+ "Node.isEqualNode",
+ "Node.get:TEXT_NODE",
+ "Node.hasAttributes",
+ "Node.get:DOCUMENT_TYPE_NODE",
+ "Node.get:DOCUMENT_POSITION_FOLLOWING",
+ "Node.lookupNamespaceURI",
+ "Node.get:ELEMENT_NODE",
+ "Node.get:namespaceURI",
+ "Node.get:DOCUMENT_FRAGMENT_NODE",
+ "Node.get:localName",
+ "Node.isDefaultNamespace",
+ "Node.compareDocumentPosition",
+ "Node.get:baseURI",
+ "Node.isSameNode",
+ "Node.get:DOCUMENT_POSITION_DISCONNECTED",
+ "Node.get:DOCUMENT_NODE",
+ "Node.get:DOCUMENT_POSITION_CONTAINS",
+ "Node.get:COMMENT_NODE",
+ "Node.get:ENTITY_REFERENCE_NODE",
+ "Node.isSupported",
+ "Node.get:DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC",
+ "Node.get:NOTATION_NODE",
+ "Node.normalize",
+ "Node.get:parentElement",
+ "Node.get:ATTRIBUTE_NODE",
+ "Node.get:ENTITY_NODE",
+ "Node.get:DOCUMENT_POSITION_CONTAINED_BY",
+ "Node.get:prefix",
+ "Node.set:prefix",
+ "Node.get:DOCUMENT_POSITION_PRECEDING",
+ "Node.get:nodeValue",
+ "Node.set:nodeValue",
+ "Node.get:CDATA_SECTION_NODE",
+ "Node.get:nodeName",
+ "Node.lookupPrefix",
+ "Node.get:PROCESSING_INSTRUCTION_NODE",
+ "IFrameElement.get:contentDocument",
+ "Window.get:frameElement",
+ ])
+
+class HtmlRenamer(object):
+ def __init__(self, database):
+ self._database = database
+
+ def RenameInterface(self, interface):
+ if interface.id.startswith('HTML'):
+ def IsElementOrDocument(interface):
+ return interface.id in ['Element', 'Document']
+ if self._database.FindInHierarchy(interface, IsElementOrDocument):
+ return interface.id[4:]
+ elif interface.id.startswith('WebKit'):
+ if interface.id[6:] in _html_strip_webkit_prefix_classes:
Anton Muhin 2012/07/16 10:27:04 [len('WebKit'):] instead 6? Overall, it might be
podivilov 2012/07/16 12:08:36 Done.
+ return interface.id[6:]
+ elif interface.id == 'DOMWindow':
+ return 'Window'
+ return interface.id
+
+ def RenameMember(self, interface_name, member, member_prefix=''):
+ """
+ Returns the name of the member in the HTML library or None if the member is
+ suppressed in the HTML library
+ """
+ interface = self._database.GetInterface(interface_name)
+
+ if self._FindMatch(interface, member, member_prefix, _removed_html_members):
+ return None
+
+ name = self._FindMatch(interface, member, member_prefix,
+ _renamed_html_members)
+ target_name = _renamed_html_members[name] if name else member
+ if self._FindMatch(interface, member, member_prefix, _private_html_members):
+ if not target_name.startswith('$dom_'): # e.g. $dom_svgClassName
+ target_name = '$dom_' + target_name
+ return target_name
+
+ def _FindMatch(self, interface, member, member_prefix, candidates):
+ def Test(interface):
+ html_interface_name = self.RenameInterface(interface)
+ name = html_interface_name + '.' + member
+ if name in candidates:
+ return name
+ name = html_interface_name + '.' + member_prefix + member
+ if name in candidates:
+ return name
+ matched_interface = self._database.FindInHierarchy(interface, Test)
+ if matched_interface:
+ return Test(matched_interface)

Powered by Google App Engine
This is Rietveld 408576698