diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 2513b5b92eb..f6bb21932e6 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -8,6 +8,7 @@ from collections import defaultdict from itertools import groupby import operator +import os import re import string import textwrap @@ -6437,3 +6438,36 @@ impl %(base)s { # Done. return curr + + @staticmethod + def SupportedDomApis(config): + descriptors = config.getDescriptors(isExposedConditionally=False) + + base_path = os.path.join('dom', 'bindings', 'codegen') + with open(os.path.join(base_path, 'apis.html.template')) as f: + base_template = f.read() + with open(os.path.join(base_path, 'api.html.template')) as f: + api_template = f.read() + with open(os.path.join(base_path, 'property.html.template')) as f: + property_template = f.read() + with open(os.path.join(base_path, 'interface.html.template')) as f: + interface_template = f.read() + + apis = [] + interfaces = [] + for descriptor in descriptors: + props = [] + for m in descriptor.interface.members: + if PropertyDefiner.getStringAttr(m, 'Pref') or \ + PropertyDefiner.getStringAttr(m, 'Func') or \ + (m.isMethod() and m.isIdentifierLess()): + continue + display = m.identifier.name + ('()' if m.isMethod() else '') + props += [property_template.replace('${name}', display)] + name = descriptor.interface.identifier.name + apis += [(api_template.replace('${interface}', name) + .replace('${properties}', '\n'.join(props)))] + interfaces += [interface_template.replace('${interface}', name)] + + return CGGeneric((base_template.replace('${apis}', '\n'.join(apis)) + .replace('${interfaces}', '\n'.join(interfaces)))) diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 9a39b1bc623..4074736a462 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -87,6 +87,8 @@ class Configuration: getter = lambda x: x.interface.isJSImplemented() elif key == 'isGlobal': getter = lambda x: x.isGlobal() + elif key == 'isExposedConditionally': + getter = lambda x: x.interface.isExposedConditionally() else: getter = lambda x: getattr(x, key) curr = filter(lambda x: getter(x) == val, curr) diff --git a/components/script/dom/bindings/codegen/GlobalGen.py b/components/script/dom/bindings/codegen/GlobalGen.py index 72a2faa71e4..23779d9e6d5 100644 --- a/components/script/dom/bindings/codegen/GlobalGen.py +++ b/components/script/dom/bindings/codegen/GlobalGen.py @@ -32,6 +32,8 @@ def main(): o = OptionParser(usage=usageString) o.add_option("--cachedir", dest='cachedir', default=None, help="Directory in which to cache lex/parse tables.") + o.add_option("--only-html", dest='only_html', action="store_true", + help="Only generate HTML from WebIDL inputs") (options, args) = o.parse_args() if len(args) < 2: @@ -51,24 +53,30 @@ def main(): parser.parse(''.join(lines), fullPath) parserResults = parser.finish() - # Write the parser results out to a pickle. - resultsPath = os.path.join(outputdir, 'ParserResults.pkl') - with open(resultsPath, 'wb') as resultsFile: - cPickle.dump(parserResults, resultsFile, -1) + if not options.only_html: + # Write the parser results out to a pickle. + resultsPath = os.path.join(outputdir, 'ParserResults.pkl') + with open(resultsPath, 'wb') as resultsFile: + cPickle.dump(parserResults, resultsFile, -1) # Load the configuration. config = Configuration(configFile, parserResults) to_generate = [ - ('PrototypeList', 'PrototypeList.rs'), - ('RegisterBindings', 'RegisterBindings.rs'), - ('InterfaceObjectMap', 'InterfaceObjectMap.rs'), - ('InterfaceTypes', 'InterfaceTypes.rs'), - ('InheritTypes', 'InheritTypes.rs'), - ('Bindings', os.path.join('Bindings', 'mod.rs')), - ('UnionTypes', 'UnionTypes.rs'), + ('SupportedDomApis', 'apis.html'), ] + if not options.only_html: + to_generate = [ + ('PrototypeList', 'PrototypeList.rs'), + ('RegisterBindings', 'RegisterBindings.rs'), + ('InterfaceObjectMap', 'InterfaceObjectMap.rs'), + ('InterfaceTypes', 'InterfaceTypes.rs'), + ('InheritTypes', 'InheritTypes.rs'), + ('Bindings', os.path.join('Bindings', 'mod.rs')), + ('UnionTypes', 'UnionTypes.rs'), + ] + for name, filename in to_generate: generate_file(config, name, os.path.join(outputdir, filename)) diff --git a/components/script/dom/bindings/codegen/api.html.template b/components/script/dom/bindings/codegen/api.html.template new file mode 100644 index 00000000000..807392693a4 --- /dev/null +++ b/components/script/dom/bindings/codegen/api.html.template @@ -0,0 +1,6 @@ + + + + +${properties} +
${interface}
diff --git a/components/script/dom/bindings/codegen/apis.html.template b/components/script/dom/bindings/codegen/apis.html.template new file mode 100644 index 00000000000..a6f1e59d4ab --- /dev/null +++ b/components/script/dom/bindings/codegen/apis.html.template @@ -0,0 +1,35 @@ + + + + + + + + + Supported DOM APIs - servo - Rust + + + + + + +
+

DOM APIs currently supported in Servo

+
+ ${apis} +
+
+ + diff --git a/components/script/dom/bindings/codegen/interface.html.template b/components/script/dom/bindings/codegen/interface.html.template new file mode 100644 index 00000000000..92b023165e2 --- /dev/null +++ b/components/script/dom/bindings/codegen/interface.html.template @@ -0,0 +1 @@ +
  • ${interface}
  • diff --git a/components/script/dom/bindings/codegen/property.html.template b/components/script/dom/bindings/codegen/property.html.template new file mode 100644 index 00000000000..7b16aa78d0f --- /dev/null +++ b/components/script/dom/bindings/codegen/property.html.template @@ -0,0 +1,3 @@ + + ${name} + diff --git a/components/script/makefile.cargo b/components/script/makefile.cargo index 5611b127c5a..e12c4bdab23 100644 --- a/components/script/makefile.cargo +++ b/components/script/makefile.cargo @@ -18,7 +18,7 @@ bindinggen_dependencies := $(addprefix $(BINDINGS_SRC)/,BindingGen.py Bindings.c globalgen_dependencies := $(addprefix $(BINDINGS_SRC)/,GlobalGen.py Bindings.conf Configuration.py CodegenRust.py parser/WebIDL.py) $(CACHE_DIR)/.done $(OUT_DIR)/Bindings/.done -.PHONY: all +.PHONY: all dom_docs all: $(AUTOGEN_SRC) $(OUT_DIR)/Bindings/.done: @@ -38,6 +38,16 @@ $(OUT_DIR)/ParserResults.pkl: $(globalgen_dependencies) $(WEBIDLS) . \ $(WEBIDLS) +dom_docs: $(CACHE_DIR)/.done + $(PYTHON) \ + $(BINDINGS_SRC)/GlobalGen.py \ + --cachedir=$(CACHE_DIR) \ + --only-html \ + $(BINDINGS_SRC)/Bindings.conf \ + $(OUT_DIR) \ + . \ + $(WEBIDLS) + $(AUTOGEN_SRC): $(OUT_DIR)/Bindings/%Binding.rs: $(bindinggen_dependencies) \ $(addprefix $(WEBIDLS_SRC)/,%.webidl) $(PYTHON) \ diff --git a/etc/ci/upload_docs.sh b/etc/ci/upload_docs.sh index 980032a1350..c172c4331cc 100755 --- a/etc/ci/upload_docs.sh +++ b/etc/ci/upload_docs.sh @@ -16,5 +16,7 @@ cp etc/doc.servo.org/* target/doc/ python components/style/properties/build.py servo html +OUT_DIR="`pwd`/target/doc" make -f makefile.cargo -C components/script dom_docs + ghp-import -n target/doc git push -qf "https://${TOKEN}@github.com/servo/doc.servo.org.git" gh-pages