#!/usr/bin/env python3
# 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.
import logging
import monitored
import re

typed_array_renames = {
    'ArrayBuffer': 'ByteBuffer',
    'ArrayBufferView': 'TypedData',
    'DataView': 'ByteData',
    'Float32Array': 'Float32List',
    'Float64Array': 'Float64List',
    'Int8Array': 'Int8List',
    'Int16Array': 'Int16List',
    'Int32Array': 'Int32List',
    'Uint8Array': 'Uint8List',
    'Uint8ClampedArray': 'Uint8ClampedList',
    'Uint16Array': 'Uint16List',
    'Uint32Array': 'Uint32List',
}

html_interface_renames = monitored.Dict(
    'htmlrenamer.html_interface_renames',
    dict(
        {
            'Attr':
            '_Attr',
            'BudgetService':
            '_BudgetService',
            'CDATASection':
            'CDataSection',
            'Clipboard':
            '_Clipboard',  # TODO(terry): Need to remove when ACX Clipboard is renamed to AcxClipboard.
            'Database':
            'SqlDatabase',  # Avoid conflict with Index DB's Database.
            'DatabaseSync':
            'SqlDatabaseSync',
            'DOMFileSystem':
            'FileSystem',
            'Entity':
            '_Entity',  # Not sure if we want to expose this yet, may conflict with other libs.
            'EntryCallback':
            '_EntryCallback',
            'EntriesCallback':
            '_EntriesCallback',
            'ErrorCallback':
            '_ErrorCallback',
            'FileCallback':
            '_FileCallback',
            'FileSystemCallback':
            '_FileSystemCallback',
            'FileWriterCallback':
            '_FileWriterCallback',
            'HTMLDocument':
            'HtmlDocument',
            'HTMLElement':
            'HtmlElement',
            'HTMLHtmlElement':
            'HtmlHtmlElement',
            'IDBFactory':
            'IdbFactory',  # Manual to avoid name conflicts.
            'Iterator':
            'DomIterator',
            'Key':
            'CryptoKey',
            'NamedNodeMap':
            '_NamedNodeMap',
            'NavigatorUserMediaErrorCallback':
            '_NavigatorUserMediaErrorCallback',
            'NavigatorUserMediaSuccessCallback':
            '_NavigatorUserMediaSuccessCallback',
            'NotificationPermissionCallback':
            '_NotificationPermissionCallback',
            'Position':
            'Geoposition',
            'PositionCallback':
            '_PositionCallback',
            'PositionErrorCallback':
            '_PositionErrorCallback',
            'Request':
            '_Request',
            'Report':
            '_Report',
            'RTCDTMFSender':
            'RtcDtmfSender',
            'RTCDTMFToneChangeEvent':
            'RtcDtmfToneChangeEvent',
            'RTCErrorCallback':
            '_RtcErrorCallback',
            'RTCSessionDescriptionCallback':
            '_RtcSessionDescriptionCallback',
            'SVGDocument':
            'SvgDocument',  # Manual to avoid name conflicts.
            'SVGElement':
            'SvgElement',  # Manual to avoid name conflicts.
            'SVGGradientElement':
            '_GradientElement',
            'SVGSVGElement':
            'SvgSvgElement',  # Manual to avoid name conflicts.
            'Stream':
            'FileStream',
            'StringCallback':
            '_StringCallback',
            'WebGL2RenderingContext':
            'RenderingContext2',
            'WebGL2RenderingContextBase':
            'RenderingContextBase2',
            'WindowTimers':
            '_WindowTimers',
            'XMLHttpRequest':
            'HttpRequest',
            'XMLHttpRequestUpload':
            'HttpRequestUpload',
            'XMLHttpRequestEventTarget':
            'HttpRequestEventTarget',
        },
        **typed_array_renames))

# Some callback interfaces are not just a simple callback functions.  If the callback
# interface is in this list then the interface is exposed as a class.
_gen_callback_interfaces = ['NodeFilter']


def generateCallbackInterface(id):
    return id in _gen_callback_interfaces


# Interfaces that are suppressed, but need to still exist for Dartium and to
# properly wrap DOM objects if/when encountered.
_removed_html_interfaces = [
    'Bluetooth',
    'BluetoothAdvertisingData',
    'BluetoothCharacteristicProperties',
    'BluetoothDevice',
    'BluetoothRemoteGATTCharacteristic',
    'BluetoothRemoteGATTServer',
    'BluetoothRemoteGATTService',
    'BluetoothUUID',
    'Cache',  # TODO: Symbol conflicts with Angular: dartbug.com/20937
    'CanvasPath',
    'CDataSection',
    'CSSPrimitiveValue',
    'CSSUnknownRule',
    'CSSValue',
    'Counter',
    'DOMFileSystemSync',  # Workers
    'DatabaseSync',  # Workers
    'DirectoryEntrySync',  # Workers
    'DirectoryReaderSync',  # Workers
    'DocumentType',
    'EntrySync',  # Workers
    'FileEntrySync',  # Workers
    'FileReaderSync',  # Workers
    'FileWriterSync',  # Workers
    'HTMLAllCollection',
    'HTMLAppletElement',
    'HTMLBaseFontElement',
    'HTMLDirectoryElement',
    'HTMLFontElement',
    'HTMLFrameElement',
    'HTMLFrameSetElement',
    'HTMLMarqueeElement',
    'IDBAny',
    'Mojo',
    'MojoHandle',
    'MojoInterfaceInterceptor',
    'MojoInterfaceRequestEvent',
    'MojoWatcher',
    'NFC',
    'Notation',
    'PagePopupController',
    'RGBColor',
    'RadioNodeList',  # Folded onto NodeList in dart2js.
    'Rect',
    'Response',  # TODO: Symbol conflicts with Angular: dartbug.com/20937
    'SQLTransactionSync',  # Workers
    'SQLTransactionSyncCallback',  # Workers
    'SVGAltGlyphDefElement',  # Webkit only.
    'SVGAltGlyphItemElement',  # Webkit only.
    'SVGAnimateColorElement',  # Deprecated. Use AnimateElement instead.
    'SVGColor',
    'SVGComponentTransferFunctionElement',  # Currently not supported anywhere.
    'SVGCursorElement',  # Webkit only.
    'SVGFEDropShadowElement',  # Webkit only for the following:
    'SVGFontElement',
    'SVGFontFaceElement',
    'SVGFontFaceFormatElement',
    'SVGFontFaceNameElement',
    'SVGFontFaceSrcElement',
    'SVGFontFaceUriElement',
    'SVGGlyphElement',
    'SVGGlyphRefElement',
    'SVGHKernElement',
    'SVGMPathElement',
    'SVGPaint',
    'SVGMissingGlyphElement',
    'SVGTRefElement',
    'SVGVKernElement',
    'SubtleCrypto',
    'USB',
    'USBAlternateInterface',
    'USBConfiguration',
    'USBConnectionEvent',
    'USBDevice',
    'USBEndpoint',
    'USBInTransferResult',
    'USBInterface',
    'USBIsochronousInTransferPacket',
    'USBIsochronousInTransferResult',
    'USBIsochronousOutTransferPacket',
    'USBIsochronousOutTransferResult',
    'USBOutTransferResult',
    'WebKitCSSFilterValue',
    'WebKitCSSMatrix',
    'WebKitCSSMixFunctionValue',
    'WebKitCSSTransformValue',
    'WebKitMediaSource',
    'WebKitNotification',
    'WebGLRenderingContextBase',
    'WebGL2RenderingContextBase',
    'WebKitSourceBuffer',
    'WebKitSourceBufferList',
    'WorkerLocation',  # Workers
    'WorkerNavigator',  # Workers
    'Worklet',  # Rendering Workers
    'XMLHttpRequestProgressEvent',
    # Obsolete event for NaCl.
    'ResourceProgressEvent',
]

for interface in _removed_html_interfaces:
    html_interface_renames[interface] = '_' + interface

convert_to_future_members = monitored.Set(
    'htmlrenamer.converted_to_future_members', [
        'Database.changeVersion',
        'Database.readTransaction',
        'DataTransferItem.getAsString',
        'DirectoryEntry.getDirectory',
        'DirectoryEntry.getFile',
        'DirectoryEntry.removeRecursively',
        'Entry.copyTo',
        'Entry.getMetadata',
        'Entry.getParent',
        'Entry.moveTo',
        'Entry.remove',
        'FileEntry.createWriter',
        'FileEntry.file',
        'FontLoader.notifyWhenFontsReady',
        'MediaStreamTrack.getSources',
        'Notification.requestPermission',
        'SQLTransaction.executeSql',
        'StorageInfo.requestQuota',
        'StorageQuota.requestQuota',
        'Window.webkitRequestFileSystem',
        'Window.webkitResolveLocalFileSystemURL',
        'WorkerGlobalScope.webkitRequestFileSystem',
        'WorkerGlobalScope.webkitResolveLocalFileSystemURL',
    ])

# DDC Exposed Classes
ddc_extensions = monitored.Dict(
    'ddcextensions.ddc_extensions', {
        'DirectoryEntry': {
            'getDirectory': [''],
            'getFile': [
                'applyExtension(\'FileEntry\', value);',
            ]
        },
        'Entry': {
            'getMetadata': [
                'applyExtension(\'Metadata\', value);',
            ],
            'getParent': [
                'applyExtension(\'Entry\', value);',
            ]
        },
        'FileEntry': {
            'createWriter': ['applyExtension(\'FileWriter\', value);'],
            'file': ['applyExtension(\'File\', value);']
        },
        'SQLTransaction': {
            'executeSql': [
                'applyExtension(\'SQLResultSet\', resultSet);'
                'applyExtension(\'SQLResultSetRowList\', resultSet.rows);'
            ],
        },
        'Window': {
            'webkitRequestFileSystem': [
                'applyExtension(\'DOMFileSystem\', value);',
                'applyExtension(\'DirectoryEntry\', value.root);',
            ]
        },
    })


# DDC Extension for this interface operation?
def GetDDC_Extension(interface, operationName):
    if interface.id in ddc_extensions:
        entry = ddc_extensions[interface.id]
        if operationName in entry:
            return entry[operationName]
    return None


# Classes where we have customized constructors, but we need to keep the old
# constructor for dispatch purposes.
custom_html_constructors = monitored.Set(
    'htmlrenamer.custom_html_constructors',
    [
        'CompositionEvent',  # 45 Roll hide default constructor use Dart's custom
        'CustomEvent',  # 45 Roll hide default constructor use Dart's custom
        'Event',  # 45 Roll hide default constructor use Dart's custom
        'HashChangeEvent',  # 45 Roll hide default constructor use Dart's custom
        'HTMLAudioElement',
        'HTMLOptionElement',
        'KeyboardEvent',  # 45 Roll hide default constructor use Dart's custom
        'MessageEvent',  # 45 Roll hide default constructor use Dart's custom
        'MouseEvent',  # 45 Roll hide default constructor use Dart's custom
        'MutationObserver',
        'StorageEvent',  # 45 Roll hide default constructor use Dart's custom
        'UIEvent',  # 45 Roll hide default constructor use Dart's custom
        'WheelEvent',  # 45 Roll hide default constructor use Dart's custom
    ])

# 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. They are exposed simply by placing an underscore in front of the
# name.
private_html_members = monitored.Set(
    'htmlrenamer.private_html_members',
    [
        'AudioNode.connect',
        'Cache.add',
        'Cache.delete',
        'Cache.keys',
        'Cache.match',
        'Cache.matchAll',
        'Cache.put',
        'CanvasRenderingContext2D.arc',
        'CanvasRenderingContext2D.drawImage',
        'CanvasRenderingContext2D.getLineDash',
        'Crypto.getRandomValues',
        'CSSStyleDeclaration.getPropertyValue',
        'CSSStyleDeclaration.setProperty',
        'CSSStyleDeclaration.var',
        'CompositionEvent.initCompositionEvent',
        'CustomEvent.detail',
        'CustomEvent.initCustomEvent',
        'DataTransferItem.webkitGetAsEntry',
        'DeviceOrientationEvent.initDeviceOrientationEvent',
        'DirectoryEntry.createReader',
        'DirectoryReader.readEntries',
        'Document.createElement',
        'Document.createElementNS',
        'Document.createEvent',
        'Document.createNodeIterator',
        'Document.createTextNode',
        'Document.createTouch',
        'Document.createTouchList',
        'Document.createTreeWalker',
        'Document.querySelectorAll',
        'DocumentFragment.querySelectorAll',

        # Moved to HTMLDocument.
        'Document.body',
        'Document.caretRangeFromPoint',
        'Document.elementFromPoint',
        'Document.getCSSCanvasContext',
        'Document.head',
        'Document.lastModified',
        'Document.preferredStylesheetSet',
        'Document.referrer',
        'Document.selectedStylesheetSet',
        'Document.styleSheets',
        'Document.title',
        'Document.webkitCancelFullScreen',
        'Document.webkitExitFullscreen',
        # Not prefixed.
        'Document.webkitFullscreenElement',
        'Document.webkitFullscreenEnabled',
        'Document.webkitHidden',
        'Document.webkitIsFullScreen',
        'Document.webkitVisibilityState',
        # Not prefixed but requires custom implementation for cross-browser compatibility.
        'Document.visibilityState',
        'Element.animate',
        'Element.childElementCount',
        'Element.firstElementChild',
        'Element.getClientRects',
        'Element.getElementsByTagName',
        'Element.insertAdjacentHTML',
        'Element.scrollIntoView',
        'Element.scrollIntoViewIfNeeded',
        'Element.getAttribute',
        'Element.getAttributeNS',
        'Element.hasAttribute',
        'Element.hasAttributeNS',
        'Element.removeAttribute',
        'Element.removeAttributeNS',
        'Element.setAttribute',
        'Element.setAttributeNS',
        'Element.innerHTML',
        'Element.querySelectorAll',
        # TODO(vsm): These have been converted from int to double in Chrome 36.
        # Special case them so we run on 34, 35, and 36.
        'Element.scrollLeft',
        'Element.scrollTop',
        'Element.scrollWidth',
        'Element.scrollHeight',
        'Event.initEvent',
        'EventTarget.addEventListener',
        'EventTarget.removeEventListener',
        'FileReader.result',
        'Geolocation.clearWatch',
        'Geolocation.getCurrentPosition',
        'Geolocation.watchPosition',
        'HashChangeEvent.initHashChangeEvent',
        'HTMLCanvasElement.toDataURL',
        'HTMLTableElement.createCaption',
        'HTMLTableElement.createTFoot',
        'HTMLTableElement.createTHead',
        'HTMLTableElement.createTBody',
        'HTMLTableElement.insertRow',
        'HTMLTableElement.rows',
        'HTMLTableElement.tBodies',
        'HTMLTableRowElement.cells',
        'HTMLTableRowElement.insertCell',
        'HTMLTableSectionElement.insertRow',
        'HTMLTableSectionElement.rows',
        'IDBCursor.delete',
        'IDBCursor.update',
        'IDBDatabase.createObjectStore',
        'IDBFactory.deleteDatabase',
        'IDBFactory.webkitGetDatabaseNames',
        'IDBFactory.open',
        'IDBIndex.count',
        'IDBIndex.get',
        'IDBIndex.getKey',
        'IDBIndex.openCursor',
        'IDBIndex.openKeyCursor',
        'IDBObjectStore.add',
        'IDBObjectStore.clear',
        'IDBObjectStore.count',
        'IDBObjectStore.createIndex',
        'IDBObjectStore.delete',
        'IDBObjectStore.get',
        'IDBObjectStore.openCursor',
        'IDBObjectStore.put',
        'KeyboardEvent.initKeyboardEvent',
        'KeyboardEvent.keyIdentifier',
        'MediaKeys.createSession',
        'MediaKeySession.update',
        'MessageEvent.initMessageEvent',
        'MessagePort.start',
        'MouseEvent.initMouseEvent',
        'MouseEvent.clientX',
        'MouseEvent.clientY',
        'MouseEvent.movementX',
        'MouseEvent.movementY',
        'MouseEvent.offsetX',
        'MouseEvent.offsetY',
        'MouseEvent.screenX',
        'MouseEvent.screenY',
        'MutationObserver.observe',
        'Navigator.getGamepads',
        'Node.attributes',
        'Node.localName',
        'Node.namespaceURI',
        'Node.removeChild',
        'Node.replaceChild',
        'ParentNode.childElementCount',
        'ParentNode.children',
        'ParentNode.firstElementChild',
        'ParentNode.lastElementChild',
        'ParentNode.querySelectorAll',
        'Range.getClientRects',
        'Screen.availHeight',
        'Screen.availLeft',
        'Screen.availTop',
        'Screen.availWidth',
        'ShadowRoot.resetStyleInheritance',
        'Storage.clear',
        'Storage.getItem',
        'Storage.key',
        'Storage.length',
        'Storage.removeItem',
        'Storage.setItem',
        'StorageEvent.initStorageEvent',
        'SubtleCrypto.encrypt',
        'SubtleCrypto.decrypt',
        'SubtleCrypto.sign',
        'SubtleCrypto.digest',
        'SubtleCrypto.importKey',
        'SubtleCrypto.unwrapKey',
        'ShadowRoot.applyAuthorStyles',
        'SpeechSynthesis.getVoices',
        'TextEvent.initTextEvent',
        # TODO(leafp): These have been converted from int to double in Chrome 37.
        # client, page, and screen were already special cased, adding radiusX/radiusY.
        # See impl_Touch.darttemplate for impedance matching code
        'Touch.clientX',
        'Touch.clientY',
        'Touch.pageX',
        'Touch.pageY',
        'Touch.screenX',
        'Touch.screenY',
        'Touch.radiusX',
        'Touch.radiusY',
        'UIEvent.initUIEvent',
        'UIEvent.layerX',
        'UIEvent.layerY',
        'UIEvent.pageX',
        'UIEvent.pageY',
        'UIEvent.which',
        'KeyboardEvent.charCode',
        'KeyboardEvent.keyCode',
        'KeyboardEvent.which',
        'WebGLRenderingContext.readPixels',
        'WebGL2RenderingContext.readPixels',
        'WheelEvent.initWebKitWheelEvent',
        'WheelEvent.deltaX',
        'WheelEvent.deltaY',
        'WorkerGlobalScope.webkitNotifications',
        'Window.getComputedStyle',
        'Window.clearInterval',
        'Window.clearTimeout',
        'Window.openDatabase',
        # TODO(tll): These have been converted from int to double in Chrome 39 for
        #            subpixel precision.  Special case for backward compatibility.
        'Window.pageXOffset',
        'Window.pageYOffset',
        'Window.scrollX',
        'Window.scrollY',
        'WindowTimers.clearInterval',
        'WindowTimers.clearTimeout',
        'WindowTimers.setInterval',
        'WindowTimers.setTimeout',
        'Window.moveTo',
        'Window.requestAnimationFrame',
        'Window.setInterval',
        'Window.setTimeout',
    ])

# Members from the standard dom that exist in the dart:html library with
# identical functionality but with cleaner names.
renamed_html_members = monitored.Dict(
    'htmlrenamer.renamed_html_members',
    {
        'ConsoleBase.assert': 'assertCondition',
        'CSSKeyframesRule.insertRule': 'appendRule',
        'DirectoryEntry.getDirectory': '_getDirectory',
        'DirectoryEntry.getFile': '_getFile',
        'Document.createCDATASection': 'createCDataSection',
        'Document.defaultView': 'window',
        'Window.CSS': 'css',
        'Window.webkitNotifications': 'notifications',
        'Window.webkitRequestFileSystem': '_requestFileSystem',
        'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
        'Navigator.webkitGetUserMedia': '_getUserMedia',
        'Node.appendChild': 'append',
        'Node.cloneNode': 'clone',
        'Node.nextSibling': 'nextNode',
        'Node.parentElement': 'parent',
        'Node.previousSibling': 'previousNode',
        'Node.textContent': 'text',
        'SVGElement.className': '_svgClassName',
        'SVGStopElement.offset': 'gradientOffset',
        'URL.createObjectURL': 'createObjectUrl',
        'URL.revokeObjectURL': 'revokeObjectUrl',
        #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem',
        #'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync',

        # OfflineAudioContext.suspend has an signature incompatible with shadowed
        # base class method AudioContext.suspend.
        'OfflineAudioContext.suspend': 'suspendFor',
    })

# Members that have multiple definitions, but their types are vary, so we rename
# them to make them distinct.
renamed_overloads = monitored.Dict(
    'htmldartgenerator.renamed_overloads', {
        'AudioContext.createBuffer(ArrayBuffer buffer, boolean mixToMono)':
        'createBufferFromBuffer',
        'CSS.supports(DOMString conditionText)':
        'supportsCondition',
        'DataTransferItemList.add(File file)':
        'addFile',
        'DataTransferItemList.add(DOMString data, DOMString type)':
        'addData',
        'FormData.append(DOMString name, Blob value, DOMString filename)':
        'appendBlob',
        'RTCDataChannel.send(ArrayBuffer data)':
        'sendByteBuffer',
        'RTCDataChannel.send(ArrayBufferView data)':
        'sendTypedData',
        'RTCDataChannel.send(Blob data)':
        'sendBlob',
        'RTCDataChannel.send(DOMString data)':
        'sendString',
        'SourceBuffer.appendBuffer(ArrayBufferView data)':
        'appendTypedData',
        'URL.createObjectURL(MediaSource source)':
        'createObjectUrlFromSource',
        'URL.createObjectURL(WebKitMediaSource source)':
        '_createObjectUrlFromWebKitSource',
        'URL.createObjectURL(MediaStream stream)':
        'createObjectUrlFromStream',
        'URL.createObjectURL(Blob blob)':
        'createObjectUrlFromBlob',
        'WebSocket.send(ArrayBuffer data)':
        'sendByteBuffer',
        'WebSocket.send(ArrayBufferView data)':
        'sendTypedData',
        'WebSocket.send(DOMString data)':
        'sendString',
        'WebSocket.send(Blob data)':
        'sendBlob',
        'Window.setInterval(DOMString handler, long timeout, any arguments)':
        '_setInterval_String',
        'Window.setTimeout(DOMString handler, long timeout, any arguments)':
        '_setTimeout_String',
        'WindowTimers.setInterval(DOMString handler, long timeout, any arguments)':
        '_setInterval_String',
        'WindowTimers.setTimeout(DOMString handler, long timeout, any arguments)':
        '_setTimeout_String',
    })

# Members that have multiple definitions, but their types are identical (only
# number of arguments vary), so we do not rename them as a _raw method.
keep_overloaded_members = monitored.Set(
    'htmldartgenerator.keep_overloaded_members', [
        'CanvasRenderingContext2D.putImageData',
        'CanvasRenderingContext2D.webkitPutImageDataHD',
        'DataTransferItemList.add', 'Document.createElement',
        'Document.createElementNS', 'HTMLInputElement.setRangeText',
        'HTMLTextAreaElement.setRangeText', 'IDBDatabase.transaction',
        'RTCDataChannel.send', 'URL.createObjectURL', 'WebSocket.send',
        'XMLHttpRequest.send'
    ])

# Members that can be overloaded.
overloaded_and_renamed = monitored.Set(
    'htmldartgenerator.overloaded_and_renamed', [
        'CanvasRenderingContext2D.clip',
        'CanvasRenderingContext2D.drawFocusIfNeeded',
        'CanvasRenderingContext2D.fill',
        'CanvasRenderingContext2D.isPointInPath',
        'CanvasRenderingContext2D.isPointInStroke',
        'CanvasRenderingContext2D.stroke',
        'Navigator.sendBeacon',
    ])


def convertedFutureMembers(member):
    return member in convert_to_future_members


for member in convert_to_future_members:
    if member in renamed_html_members:
        renamed_html_members[member] = '_' + renamed_html_members[member]
    else:
        renamed_html_members[member] = '_' + member[member.find('.') + 1:]

# Members and classes from the dom that should be removed completely 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\:|call\:|on\:)?MemberName
# Using get: and set: is optional and should only be used when a getter needs
# to be suppressed but not the setter, etc.
# Prepending ClassName with = will only match against direct class, not for
# subclasses.
# TODO(jacobr): cleanup and augment this list.
removed_html_members = monitored.Set(
    'htmlrenamer.removed_html_members',
    [
        'Attr.textContent',  # Not needed as it is the same as Node.textContent.
        'AudioContext.decodeAudioData',
        'AudioBufferSourceNode.looping',  # TODO(vsm): Use deprecated IDL annotation
        'CSSStyleDeclaration.getPropertyCSSValue',
        'HTMLCanvasElement.toBlob',
        'CanvasRenderingContext2D.clearShadow',
        'CanvasRenderingContext2D.drawImageFromRect',
        'CanvasRenderingContext2D.setAlpha',
        'CanvasRenderingContext2D.setCompositeOperation',
        'CanvasRenderingContext2D.setFillColor',
        'CanvasRenderingContext2D.setLineCap',
        'CanvasRenderingContext2D.setLineJoin',
        'CanvasRenderingContext2D.setLineWidth',
        'CanvasRenderingContext2D.setMiterLimit',
        'CanvasRenderingContext2D.setShadow',
        'CanvasRenderingContext2D.setStrokeColor',
        # Disable the webKit version, imageSmoothingEnabled is exposed.
        'CanvasRenderingContext2D.webkitImageSmoothingEnabled',
        'CharacterData.remove',
        'ChildNode.replaceWith',
        'CSSStyleDeclaration.__getter__',
        'CSSStyleDeclaration.__setter__',
        'Window.call:blur',
        'Window.call:focus',
        'Window.clientInformation',
        'Window.createImageBitmap',
        'Window.get:frames',
        'Window.get:length',
        'Window.on:beforeUnload',
        'Window.on:webkitTransitionEnd',
        'Window.pagePopupController',
        'Window.prompt',
        'Window.webkitCancelAnimationFrame',
        'Window.webkitCancelRequestAnimationFrame',
        'Window.webkitIndexedDB',
        'Window.webkitRequestAnimationFrame',
        'Document.alinkColor',
        'Document.all',
        'Document.append',
        'Document.applets',
        'Document.bgColor',
        'Document.clear',
        'Document.createAttribute',
        'Document.createAttributeNS',
        'Document.createComment',
        'Document.createExpression',
        'Document.createNSResolver',
        'Document.createProcessingInstruction',
        'Document.designMode',
        'Document.dir',
        'Document.evaluate',
        'Document.fgColor',
        'Document.get:URL',
        'Document.get:anchors',
        'Document.get:characterSet',
        'Document.get:compatMode',
        'Document.get:defaultCharset',
        'Document.get:doctype',
        'Document.get:documentURI',
        'Document.get:embeds',
        'Document.get:forms',
        'Document.get:inputEncoding',
        'Document.get:links',
        'Document.get:plugins',
        'Document.get:scripts',
        'Document.get:xmlEncoding',
        'Document.getElementsByTagNameNS',
        'Document.getOverrideStyle',
        'Document.getSelection',
        'Document.images',
        'Document.linkColor',
        'Document.location',
        'Document.on:wheel',
        'Document.open',
        'Document.prepend',
        'Document.register',
        'Document.set:domain',
        'Document.vlinkColor',
        'Document.webkitCurrentFullScreenElement',
        'Document.webkitFullScreenKeyboardInputAllowed',
        'Document.write',
        'Document.writeln',
        'Document.xmlStandalone',
        'Document.xmlVersion',
        'DocumentFragment.children',
        'DocumentType.*',
        'DOMException.code',
        'DOMException.ABORT_ERR',
        'DOMException.DATA_CLONE_ERR',
        'DOMException.DOMSTRING_SIZE_ERR',
        'DOMException.HIERARCHY_REQUEST_ERR',
        'DOMException.INDEX_SIZE_ERR',
        'DOMException.INUSE_ATTRIBUTE_ERR',
        'DOMException.INVALID_ACCESS_ERR',
        'DOMException.INVALID_CHARACTER_ERR',
        'DOMException.INVALID_MODIFICATION_ERR',
        'DOMException.INVALID_NODE_TYPE_ERR',
        'DOMException.INVALID_STATE_ERR',
        'DOMException.NAMESPACE_ERR',
        'DOMException.NETWORK_ERR',
        'DOMException.NOT_FOUND_ERR',
        'DOMException.NOT_SUPPORTED_ERR',
        'DOMException.NO_DATA_ALLOWED_ERR',
        'DOMException.NO_MODIFICATION_ALLOWED_ERR',
        'DOMException.QUOTA_EXCEEDED_ERR',
        'DOMException.SECURITY_ERR',
        'DOMException.SYNTAX_ERR',
        'DOMException.TIMEOUT_ERR',
        'DOMException.TYPE_MISMATCH_ERR',
        'DOMException.URL_MISMATCH_ERR',
        'DOMException.VALIDATION_ERR',
        'DOMException.WRONG_DOCUMENT_ERR',
        'Element.accessKey',
        'Element.append',
        'Element.children',
        'Element.dataset',
        'Element.get:classList',
        'Element.getAttributeNode',
        'Element.getAttributeNodeNS',
        'Element.getElementsByTagNameNS',
        'Element.innerText',
        # TODO(terry): All offset* attributes are in both HTMLElement and Element
        #              (it's a Chrome bug with a FIXME note to correct - sometime).
        #              Until corrected these Element attributes must be ignored.
        'Element.offsetParent',
        'Element.offsetTop',
        'Element.offsetLeft',
        'Element.offsetWidth',
        'Element.offsetHeight',
        'Element.outerText',
        'Element.prepend',
        'Element.removeAttributeNode',
        'Element.set:outerHTML',
        'Element.setApplyScroll',
        'Element.setAttributeNode',
        'Element.setAttributeNodeNS',
        'Element.setDistributeScroll',
        'Element.webkitCreateShadowRoot',
        'Element.webkitMatchesSelector',
        'Element.webkitPseudo',
        'Element.webkitShadowRoot',
        '=Event.returnValue',  # Only suppress on Event, allow for BeforeUnloadEvnt.
        'Event.srcElement',
        'EventSource.URL',
        'FontFace.ready',
        'FontFaceSet.load',
        'FontFaceSet.ready',
        'HTMLAnchorElement.charset',
        'HTMLAnchorElement.coords',
        'HTMLAnchorElement.rev',
        'HTMLAnchorElement.shape',
        'HTMLAnchorElement.text',
        'HTMLAppletElement.*',
        'HTMLAreaElement.noHref',
        'HTMLBRElement.clear',
        'HTMLBaseFontElement.*',
        'HTMLBodyElement.aLink',
        'HTMLBodyElement.background',
        'HTMLBodyElement.bgColor',
        'HTMLBodyElement.link',
        'HTMLBodyElement.on:beforeUnload',
        'HTMLBodyElement.text',
        'HTMLBodyElement.vLink',
        'HTMLDListElement.compact',
        'HTMLDirectoryElement.*',
        'HTMLDivElement.align',
        'HTMLFontElement.*',
        'HTMLFormControlsCollection.__getter__',
        'HTMLFormElement.get:elements',
        'HTMLFrameElement.*',
        'HTMLFrameSetElement.*',
        'HTMLHRElement.align',
        'HTMLHRElement.noShade',
        'HTMLHRElement.size',
        'HTMLHRElement.width',
        'HTMLHeadElement.profile',
        'HTMLHeadingElement.align',
        'HTMLHtmlElement.manifest',
        'HTMLHtmlElement.version',
        'HTMLIFrameElement.align',
        'HTMLIFrameElement.frameBorder',
        'HTMLIFrameElement.longDesc',
        'HTMLIFrameElement.marginHeight',
        'HTMLIFrameElement.marginWidth',
        'HTMLIFrameElement.scrolling',
        'HTMLImageElement.align',
        'HTMLImageElement.hspace',
        'HTMLImageElement.longDesc',
        'HTMLImageElement.name',
        'HTMLImageElement.vspace',
        'HTMLInputElement.align',
        'HTMLLegendElement.align',
        'HTMLLinkElement.charset',
        'HTMLLinkElement.rev',
        'HTMLLinkElement.target',
        'HTMLMarqueeElement.*',
        'HTMLMenuElement.compact',
        'HTMLMetaElement.scheme',
        'HTMLOListElement.compact',
        'HTMLObjectElement.align',
        'HTMLObjectElement.archive',
        'HTMLObjectElement.border',
        'HTMLObjectElement.codeBase',
        'HTMLObjectElement.codeType',
        'HTMLObjectElement.declare',
        'HTMLObjectElement.hspace',
        'HTMLObjectElement.standby',
        'HTMLObjectElement.vspace',
        'HTMLOptionElement.text',
        'HTMLOptionsCollection.*',
        'HTMLParagraphElement.align',
        'HTMLParamElement.type',
        'HTMLParamElement.valueType',
        'HTMLPreElement.width',
        'HTMLScriptElement.text',
        'HTMLSelectElement.options',
        'HTMLSelectElement.selectedOptions',
        'HTMLTableCaptionElement.align',
        'HTMLTableCellElement.abbr',
        'HTMLTableCellElement.align',
        'HTMLTableCellElement.axis',
        'HTMLTableCellElement.bgColor',
        'HTMLTableCellElement.ch',
        'HTMLTableCellElement.chOff',
        'HTMLTableCellElement.height',
        'HTMLTableCellElement.noWrap',
        'HTMLTableCellElement.scope',
        'HTMLTableCellElement.vAlign',
        'HTMLTableCellElement.width',
        'HTMLTableColElement.align',
        'HTMLTableColElement.ch',
        'HTMLTableColElement.chOff',
        'HTMLTableColElement.vAlign',
        'HTMLTableColElement.width',
        'HTMLTableElement.align',
        'HTMLTableElement.bgColor',
        'HTMLTableElement.cellPadding',
        'HTMLTableElement.cellSpacing',
        'HTMLTableElement.frame',
        'HTMLTableElement.rules',
        'HTMLTableElement.summary',
        'HTMLTableElement.width',
        'HTMLTableRowElement.align',
        'HTMLTableRowElement.bgColor',
        'HTMLTableRowElement.ch',
        'HTMLTableRowElement.chOff',
        'HTMLTableRowElement.vAlign',
        'HTMLTableSectionElement.align',
        'HTMLTableSectionElement.ch',
        'HTMLTableSectionElement.chOff',
        'HTMLTableSectionElement.vAlign',
        'HTMLTitleElement.text',
        'HTMLUListElement.compact',
        'HTMLUListElement.type',
        'IDBDatabase.transaction',  # We do this in a template without the generated implementation at all.
        'Location.valueOf',
        'MessageEvent.data',
        'MouseEvent.webkitMovementX',
        'MouseEvent.webkitMovementY',
        'MouseEvent.x',
        'MouseEvent.y',
        'Navigator.bluetooth',
        'Navigator.isProtocolHandlerRegistered',
        'Navigator.unregisterProtocolHandler',
        'Navigator.usb',
        'Node.compareDocumentPosition',
        'Node.get:DOCUMENT_POSITION_CONTAINED_BY',
        'Node.get:DOCUMENT_POSITION_CONTAINS',
        'Node.get:DOCUMENT_POSITION_DISCONNECTED',
        'Node.get:DOCUMENT_POSITION_FOLLOWING',
        'Node.get:DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC',
        'Node.get:DOCUMENT_POSITION_PRECEDING',
        'Node.get:childNodes',
        'Node.get:prefix',
        'Node.hasAttributes',
        'Node.isDefaultNamespace',
        'Node.isEqualNode',
        'Node.isSameNode',
        'Node.isSupported',
        'Node.lookupNamespaceURI',
        'Node.lookupPrefix',
        'Node.normalize',
        'Node.set:nodeValue',
        'NodeFilter.acceptNode',
        'NodeIterator.expandEntityReferences',
        'NodeIterator.filter',
        'NodeList.item',
        'ParentNode.append',
        'ParentNode.prepend',
        'RTCPeerConnection.generateCertificate',
        'ShadowRoot.getElementsByTagNameNS',
        'SVGElement.getPresentationAttribute',
        'SVGElementInstance.on:wheel',
        'Touch.get:webkitRadiusX',
        'Touch.get:webkitRadiusY',
        'Touch.get:webkitForce',
        'Touch.get:webkitRotationAngle',
        'WheelEvent.wheelDelta',
        'WheelEvent.wheelDeltaX',
        'WheelEvent.wheelDeltaY',
        'Window.on:wheel',
        'WindowEventHandlers.on:beforeUnload',
        'WorkerGlobalScope.webkitIndexedDB',
        'XMLHttpRequest.open',
        # TODO(jacobr): should these be removed?
        'Document.close',
        'Document.hasFocus',
    ])

# Manual dart: library name lookup.
_library_names = monitored.Dict(
    'htmlrenamer._library_names', {
        'ANGLEInstancedArrays': 'web_gl',
        'CHROMIUMSubscribeUniform': 'web_gl',
        'Database': 'web_sql',
        'Navigator': 'html',
        'Window': 'html',
        'AnalyserNode': 'web_audio',
        'AudioBufferCallback': 'web_audio',
        'AudioBuffer': 'web_audio',
        'AudioBufferSourceNode': 'web_audio',
        'AudioContext': 'web_audio',
        'AudioDestinationNode': 'web_audio',
        'AudioElement': 'web_audio',
        'AudioListener': 'web_audio',
        'AudioNode': 'web_audio',
        'AudioParam': 'web_audio',
        'AudioParamMap': 'web_audio',
        'AudioProcessingEvent': 'web_audio',
        'AudioScheduledSourceNode': 'web_audio',
        'AudioSourceNode': 'web_audio',
        'AudioTrack': 'web_audio',
        'AudioTrackList': 'web_audio',
        'AudioWorkletGlobalScope': 'web_audio',
        'AudioWorkletNode': 'web_audio',
        'AudioWorkletProcessor': 'web_audio',
        'BaseAudioContext': 'web_audio',
        'BiquadFilterNode': 'web_audio',
        'ChannelMergerNode': 'web_audio',
        'ChannelSplitterNode': 'web_audio',
        'ConstantSourceNode': 'web_audio',
        'ConvolverNode': 'web_audio',
        'DelayNode': 'web_audio',
        'DynamicsCompressorNode': 'web_audio',
        'GainNode': 'web_audio',
        'IIRFilterNode': 'web_audio',
        'MediaElementAudioSourceNode': 'web_audio',
        'MediaStreamAudioDestinationNode': 'web_audio',
        'MediaStreamAudioSourceNode': 'web_audio',
        'OfflineAudioCompletionEvent': 'web_audio',
        'OfflineAudioContext': 'web_audio',
        'OscillatorNode': 'web_audio',
        'PannerNode': 'web_audio',
        'PeriodicWave': 'web_audio',
        'ScriptProcessorNode': 'web_audio',
        'StereoPannerNode': 'web_audio',
        'WaveShaperNode': 'web_audio',
        'WindowWebAudio': 'web_audio',
    })

_library_ids = monitored.Dict(
    'htmlrenamer._library_names', {
        'ANGLEInstancedArrays': 'WebGl',
        'CHROMIUMSubscribeUniform': 'WebGl',
        'Database': 'WebSql',
        'Navigator': 'Html',
        'Window': 'Html',
        'AnalyserNode': 'WebAudio',
        'AudioBufferCallback': 'WebAudio',
        'AudioBuffer': 'WebAudio',
        'AudioBufferSourceNode': 'WebAudio',
        'AudioContext': 'WebAudio',
        'AudioDestinationNode': 'WebAudio',
        'AudioListener': 'WebAudio',
        'AudioNode': 'WebAudio',
        'AudioParam': 'WebAudio',
        'AudioProcessingEvent': 'WebAudio',
        'AudioSourceNode': 'WebAudio',
        'BiquadFilterNode': 'WebAudio',
        'ChannelMergerNode': 'WebAudio',
        'ChannelSplitterNode': 'WebAudio',
        'ConvolverNode': 'WebAudio',
        'DelayNode': 'WebAudio',
        'DynamicsCompressorNode': 'WebAudio',
        'GainNode': 'WebAudio',
        'IIRFilterNode': 'WebAudio',
        'MediaElementAudioSourceNode': 'WebAudio',
        'MediaStreamAudioDestinationNode': 'WebAudio',
        'MediaStreamAudioSourceNode': 'WebAudio',
        'OfflineAudioCompletionEvent': 'WebAudio',
        'OfflineAudioContext': 'WebAudio',
        'OscillatorNode': 'WebAudio',
        'PannerNode': 'WebAudio',
        'PeriodicWave': 'WebAudio',
        'ScriptProcessorNode': 'WebAudio',
        'StereoPannerNode': 'WebAudio',
        'WaveShaperNode': 'WebAudio',
        'WindowWebAudio': 'WebAudio',
    })


class HtmlRenamer(object):

    def __init__(self, database, metadata):
        self._database = database
        self._metadata = metadata

    def RenameInterface(self, interface):
        if 'Callback' in interface.ext_attrs:
            if interface.id in _removed_html_interfaces:
                return None

        candidate = self.RenameInterfaceId(interface.id)
        if candidate:
            return candidate

        if interface.id.startswith('HTML'):
            if any(interface.id in ['Element', 'Document']
                   for interface in self._database.Hierarchy(interface)):
                return interface.id[len('HTML'):]
        return self._DartifyName(interface.javascript_binding_name)

    def RenameInterfaceId(self, interface_id):
        if interface_id in html_interface_renames:
            return html_interface_renames[interface_id]
        return None

    def isPrivate(self, interface, member):
        return self._FindMatch(interface, member, '', private_html_members)

    def RenameMember(self,
                     interface_name,
                     member_node,
                     member,
                     member_prefix='',
                     dartify_name=True):
        """
    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 not member:
            if 'ImplementedAs' in member_node.ext_attrs:
                member = member_node.ext_attrs['ImplementedAs']

        if self.ShouldSuppressMember(interface, member, member_prefix):
            return None

        if 'CheckSecurity' in member_node.ext_attrs:
            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('_'):  # e.g. _svgClassName
                target_name = '_' + target_name

        if not name and target_name.startswith('webkit'):
            target_name = member[len('webkit'):]
            target_name = target_name[:1].lower() + target_name[1:]

        if dartify_name:
            target_name = self._DartifyMemberName(target_name)
        return target_name

    def ShouldSuppressMember(self, interface, member, member_prefix=''):
        """ Returns true if the member should be suppressed."""
        if self._FindMatch(interface, member, member_prefix,
                           removed_html_members):
            return True
        if interface.id in _removed_html_interfaces:
            return True
        metadata_member = member
        if member_prefix == 'on:':
            metadata_member = 'on' + metadata_member.lower()
        if self._metadata.IsSuppressed(interface, metadata_member):
            return True
        return False

    def ShouldSuppressInterface(self, interface):
        """ Returns true if the interface should be suppressed."""
        if interface.id in _removed_html_interfaces:
            return True

    def _FindMatch(self, interface, member, member_prefix, candidates):

        def find_match(interface_id):
            member_name = interface_id + '.' + member
            if member_name in candidates:
                return member_name
            member_name = interface_id + '.' + member_prefix + member
            if member_name in candidates:
                return member_name
            member_name = interface_id + '.*'
            if member_name in candidates:
                return member_name

        # Check direct matches first
        match = find_match('=%s' % interface.id)
        if match:
            return match

        for interface in self._database.Hierarchy(interface):
            match = find_match(interface.id)
            if match:
                return match

    def GetLibraryName(self, interface):
        # Some types have attributes merged in from many other interfaces.
        if interface.id in _library_names:
            return _library_names[interface.id]

        # Support for IDL conditional has been removed from indexed db, web_sql,
        # svg and web_gl so we can no longer determine the library based on conditional.
        # Use interface prefix to do that.  web_audio interfaces have no common prefix
        # - all audio interfaces added to _library_names/_library_ids.
        if interface.id.startswith("IDB"):
            return 'indexed_db'
        if interface.id.startswith("SQL"):
            return 'web_sql'
        if interface.id.startswith("SVG"):
            return 'svg'
        if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
            or interface.id.startswith("EXT") \
            or interface.id == "WebGL":    # Name of the synthesized class for WebGL constants.
            return 'web_gl'

        if interface.id in typed_array_renames:
            return 'typed_data'

        return 'html'

    def GetLibraryId(self, interface):
        # Some types have attributes merged in from many other interfaces.
        if interface.id in _library_ids:
            return _library_ids[interface.id]

        # Support for IDL conditional has been removed from indexed db, web_sql,
        # svg and web_gl so we can no longer determine the library based on conditional.
        # Use interface prefix to do that.  web_audio interfaces have no common prefix
        # - all audio interfaces added to _library_names/_library_ids.
        if interface.id.startswith("IDB"):
            return 'IndexedDb'
        if interface.id.startswith("SQL"):
            return 'WebSql'
        if interface.id.startswith("SVG"):
            return 'Svg'
        if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
            or interface.id.startswith("EXT") \
            or interface.id == 'WebGL':     # Name of the synthesized class for WebGL constants.
            return 'WebGl'

        if interface.id in typed_array_renames:
            return 'TypedData'

        return 'Html'

    def DartifyTypeName(self, type_name):
        """Converts a DOM name to a Dart-friendly class name. """

        if type_name in html_interface_renames:
            return html_interface_renames[type_name]

        return self._DartifyName(type_name)

    def _DartifyName(self, dart_name):
        # Strip off any standard prefixes.
        name = re.sub(r'^SVG', '', dart_name)
        name = re.sub(r'^IDB', '', name)
        # Don't Strip the synthesized class name WebGL contains all rendering/draw constants.
        if name != 'WebGL':
            name = re.sub(r'^WebGL', '', name)
        name = re.sub(r'^WebKit', '', name)

        return self._CamelCaseName(name)

    def _DartifyMemberName(self, member_name):
        # Strip off any OpenGL ES suffixes.
        name = re.sub(r'OES$', '', member_name)
        return self._CamelCaseName(name)

    def _CamelCaseName(self, name):

        def toLower(match):
            return match.group(1) + match.group(2).lower() + match.group(3)

        # We're looking for a sequence of letters which start with capital letter
        # then a series of caps and finishes with either the end of the string or
        # a capital letter.
        # The [0-9] check is for names such as 2D or 3D
        # The following test cases should match as:
        #   WebKitCSSFilterValue: WebKit(C)(SS)(F)ilterValue
        #   XPathNSResolver: (X)()(P)ath(N)(S)(R)esolver (no change)
        #   IFrameElement: (I)()(F)rameElement (no change)
        return re.sub(r'([A-Z])([A-Z]{2,})([A-Z]|$)', toLower, name)
