author Jared Wein <>
Mon, 24 Dec 2018 16:19:20 +0000
changeset 511855 28805dd1b97ab5b421d9e886fd5d96460d5d26ab
parent 481611 9773c4edc6a652c68f4a549d4d8713b7f5543925
child 522948 6c09eccc4bd1ac6feabc803d8bc8d769cc911599
permissions -rw-r--r--
Bug 1507595 - Convert about:support to Fluent. r=Gijs,flod Initial patch by Collin Wing ( Differential Revision:

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at

import sys
import string
import argparse
import runpy

# Generates a line of WebIDL with the given spelling of the property name
# (whether camelCase, _underscorePrefixed, etc.) and the given array of
# extended attributes.
def generateLine(propName, extendedAttrs):
    return "  [%s] attribute DOMString %s;\n" % (", ".join(extendedAttrs),
def generate(output, idlFilename, dataFile):
    propList = runpy.run_path(dataFile)["data"]
    props = ""
    for p in propList:
        if "Internal" in p.flags:
        # Unfortunately, even some of the getters here are fallible
        # (e.g. on nsComputedDOMStyle).
        extendedAttrs = ["CEReactions", "Throws", "TreatNullAs=EmptyString",
        if p.pref is not "":
            extendedAttrs.append('Pref="%s"' % p.pref)

        prop = p.method

        # webkit properties get a camelcase "webkitFoo" accessor
        # as well as a capitalized "WebkitFoo" alias (added here).
        if (prop.startswith("Webkit")):
            extendedAttrs.append('BindingAlias="%s"' % prop)

        # Generate a name with camelCase spelling of property-name (or capitalized,
        # for Moz-prefixed properties):
        if not prop.startswith("Moz"):
            prop = prop[0].lower() + prop[1:]

        # Per spec, what's actually supposed to happen here is that we're supposed
        # to have properties for:
        # 1) Each supported CSS property name, camelCased.
        # 2) Each supported name that contains or starts with dashes,
        #    without any changes to the name.
        # 3) cssFloat
        # Note that "float" will cause a property called "float" to exist due to (1)
        # in that list.
        # In practice, cssFloat is the only case in which "name" doesn't contain
        # "-" but also doesn't match "prop".  So the generateLine() call will
        # cover (3) and all of (1) except "float".  If we now add an alias
        # for all the cases where "name" doesn't match "prop", that will cover
        # "float" and (2).
        if prop !=
            extendedAttrs.append('BindingAlias="%s"' %

        props += generateLine(prop, extendedAttrs)

    idlFile = open(idlFilename, "r")
    idlTemplate =

    output.write("/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */\n\n" +
                 string.Template(idlTemplate).substitute({"props": props}) + '\n')

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('idlFilename', help='IDL property file template')
    parser.add_argument('preprocessorHeader', help='Header file to pass through the preprocessor')
    args = parser.parse_args()
    generate(sys.stdout, args.idlFilename, args.preprocessorHeader)

if __name__ == '__main__':