Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stylo: replace product={gecko,servo} with engine={gecko,servo-2013,servo-2020} #23856

Merged
merged 3 commits into from Jul 30, 2019
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

Auto-generate CSSStyleDeclaration.webidl for CSS properties based on …

…the style crate
  • Loading branch information
SimonSapin committed Jul 29, 2019
commit f1300bb98b0267b552a3f12e64e30f2f414213a3
@@ -41,13 +41,11 @@ set(globalgen_deps
${bindings_src}/Configuration.py
${bindings_src}/CodegenRust.py
${bindings_src}/parser/WebIDL.py
${PROJECT_BINARY_DIR}/css_properties.json
)
set(bindinggen_deps
${globalgen_deps}
${bindings_src}/BindingGen.py
${bindings_src}/Bindings.conf
${bindings_src}/Configuration.py
${bindings_src}/CodegenRust.py
${bindings_src}/parser/WebIDL.py
)

add_custom_command(
@@ -71,6 +69,7 @@ add_custom_command(
${bindings_src}/Bindings.conf
.
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}/css_properties.json
DEPENDS Bindings _cache ${globalgen_deps} ${webidls}
VERBATIM
)
@@ -85,6 +84,7 @@ add_custom_command(
${bindings_src}/Bindings.conf
.
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}/css_properties.json
DEPENDS _cache ${globalgen_deps} ${webidls}
VERBATIM
)
@@ -15,6 +15,13 @@ use std::time::Instant;
fn main() {
let start = Instant::now();

let style_out_dir = PathBuf::from(env::var_os("DEP_SERVO_STYLE_CRATE_OUT_DIR").unwrap());
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
let build_dir = out_dir.join("build");
let json = "css_properties.json";
let _ = std::fs::create_dir(&build_dir); // Ignore errors: they most likely indicate it already exists
std::fs::copy(style_out_dir.join(json), build_dir.join(json)).unwrap();

// This must use the Ninja generator -- it's the only one that
// parallelizes cmake's output properly. (Cmake generates
// separate makefiles, each of which try to build
@@ -35,7 +42,7 @@ fn main() {
start.elapsed().as_secs()
);

let json = PathBuf::from(env::var_os("OUT_DIR").unwrap())
let json = out_dir
.join("build")
.join("InterfaceObjectMapData.json");
let json: Value = serde_json::from_reader(File::open(&json).unwrap()).unwrap();
@@ -7,6 +7,7 @@

import sys
import os
import json
sys.path.append(os.path.join(".", "parser"))
sys.path.append(os.path.join(".", "ply"))
import WebIDL
@@ -28,7 +29,7 @@ def generate_file(config, name, filename):
def main():
# Parse arguments.
from optparse import OptionParser
usageString = "usage: %prog [options] configFile outputdir webidldir [files]"
usageString = "usage: %prog [options] configFile outputdir webidldir cssProperties.json [files]"
o = OptionParser(usage=usageString)
o.add_option("--cachedir", dest='cachedir', default=None,
help="Directory in which to cache lex/parse tables.")
@@ -44,8 +45,9 @@ def main():
configFile = args[0]
outputdir = args[1]
baseDir = args[2]
css_properties_json = args[3]
if options.filelist is not None:
fileList = (l.strip() for l in open(options.filelist).xreadlines())
fileList = [l.strip() for l in open(options.filelist).xreadlines()]
else:
fileList = args[3:]

@@ -56,6 +58,9 @@ def main():
with open(fullPath, 'rb') as f:
lines = f.readlines()
parser.parse(''.join(lines), fullPath)

add_css_properties_attributes(fileList, css_properties_json, parser)

parserResults = parser.finish()

if not options.only_html:
@@ -86,5 +91,57 @@ def main():
for name, filename in to_generate:
generate_file(config, name, os.path.join(outputdir, filename))


def add_css_properties_attributes(webidl_files, css_properties_json, parser):
for filename in webidl_files:
if os.path.basename(filename) == "CSSStyleDeclaration.webidl":
break
else:
return

css_properties = json.load(open(css_properties_json, "rb"))
idl = "partial interface CSSStyleDeclaration {\n%s\n};\n" % "\n".join(
" [%sCEReactions, SetterThrows] attribute [TreatNullAs=EmptyString] DOMString %s;" % (
('Pref="%s", ' % pref if pref else ""),
attribute_name
)
for (property_name, pref) in css_properties
for attribute_name in attribute_names(property_name)
)
parser.parse(idl.encode("utf-8"), "CSSStyleDeclaration_generated.webidl")


def attribute_names(property_name):
# https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-dashed-attribute
if property_name != "float":
yield property_name
else:
yield "_float"

# https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-camel-cased-attribute
if "-" in property_name:
yield "".join(camel_case(property_name))

# https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-webkit-cased-attribute
if property_name.startswith("-webkit-"):
yield "".join(camel_case(property_name), True)


# https://drafts.csswg.org/cssom/#css-property-to-idl-attribute
def camel_case(chars, webkit_prefixed=False):
if webkit_prefixed:
chars = chars[1:]
next_is_uppercase = False
for c in chars:
if c == '-':
next_is_uppercase = True
elif next_is_uppercase:
next_is_uppercase = False
# Should be ASCII-uppercase, but all non-custom CSS property names are within ASCII
yield c.upper()
else:
yield c


if __name__ == '__main__':
main()
@@ -3344,7 +3344,7 @@ def withExtendedAttributes(self, attrs):
[self.location, attribute.location])
assert not self.nullable()
if not attribute.hasValue():
raise WebIDLError("[TreatNullAs] must take an identifier argument"
raise WebIDLError("[TreatNullAs] must take an identifier argument",
[attribute.location])
value = attribute.value()
if value != 'EmptyString':
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.