diff options
Diffstat (limited to 'dom/bindings/GenerateCSS2PropertiesWebIDL.py')
-rw-r--r-- | dom/bindings/GenerateCSS2PropertiesWebIDL.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/dom/bindings/GenerateCSS2PropertiesWebIDL.py b/dom/bindings/GenerateCSS2PropertiesWebIDL.py new file mode 100644 index 0000000000..b74d8ef92d --- /dev/null +++ b/dom/bindings/GenerateCSS2PropertiesWebIDL.py @@ -0,0 +1,104 @@ +# 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 http://mozilla.org/MPL/2.0/. + +import argparse +import runpy +import string +import sys + +# 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 [LegacyNullToEmptyString] UTF8String %s;\n" % ( + ", ".join(extendedAttrs), + propName, + ) + + +def generate(output, idlFilename, dataFile): + propList = runpy.run_path(dataFile)["data"] + props = "" + for p in propList: + if "Internal" in p.flags: + continue + + # Skip properties which aren't valid in style rules. + if "Style" not in p.rules: + continue + + # Unfortunately, even some of the getters here are fallible + # (e.g. on nsComputedDOMStyle). + extendedAttrs = [ + "CEReactions", + "Throws", + "SetterNeedsSubjectPrincipal=NonSystem", + ] + + if p.pref != "": + # BackdropFilter is a special case where we want WebIDL to check + # a function instead of checking the pref directly. + if p.method == "BackdropFilter": + extendedAttrs.append('Func="nsCSSProps::IsBackdropFilterAvailable"') + else: + 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 != p.name: + extendedAttrs.append('BindingAlias="%s"' % p.name) + + props += generateLine(prop, extendedAttrs) + + idlFile = open(idlFilename, "r") + idlTemplate = idlFile.read() + idlFile.close() + + 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__": + main() |