зеркало из https://github.com/mozilla/gecko-dev.git
170 строки
4.9 KiB
Python
170 строки
4.9 KiB
Python
# 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 https://mozilla.org/MPL/2.0/.
|
|
|
|
def _assign_slots(obj, args):
|
|
for i, attr in enumerate(obj.__slots__):
|
|
setattr(obj, attr, args[i])
|
|
|
|
|
|
class Longhand(object):
|
|
__slots__ = ["name", "method", "id", "rules", "flags", "pref", "aliases"]
|
|
|
|
def __init__(self, *args):
|
|
_assign_slots(self, args)
|
|
|
|
@staticmethod
|
|
def type():
|
|
return "longhand"
|
|
|
|
|
|
class Shorthand(object):
|
|
__slots__ = ["name", "method", "id", "rules", "flags", "pref", "subprops", "aliases"]
|
|
|
|
def __init__(self, *args):
|
|
_assign_slots(self, args)
|
|
|
|
@staticmethod
|
|
def type():
|
|
return "shorthand"
|
|
|
|
|
|
class Alias(object):
|
|
__slots__ = ["name", "method", "alias_id", "prop_id", "rules", "flags", "pref"]
|
|
|
|
def __init__(self, *args):
|
|
_assign_slots(self, args)
|
|
|
|
@staticmethod
|
|
def type():
|
|
return "alias"
|
|
|
|
<%!
|
|
# See bug 1454823 for situation of internal flag.
|
|
def is_internal(prop):
|
|
# A property which is not controlled by pref and not enabled in
|
|
# content by default is an internal property.
|
|
return not prop.gecko_pref and not prop.enabled_in_content()
|
|
|
|
def method(prop):
|
|
if prop.name == "float":
|
|
return "CssFloat"
|
|
if prop.name.startswith("-x-"):
|
|
return prop.camel_case[1:]
|
|
return prop.camel_case
|
|
|
|
# TODO(emilio): Get this to zero.
|
|
LONGHANDS_NOT_SERIALIZED_WITH_SERVO = [
|
|
# Servo serializes one value when both are the same, a few tests expect two.
|
|
"border-spacing",
|
|
|
|
# These resolve auto to zero in a few cases, but not all.
|
|
"max-height",
|
|
"max-width",
|
|
"min-height",
|
|
"min-width",
|
|
|
|
# resistfingerprinting stuff.
|
|
"-moz-osx-font-smoothing",
|
|
|
|
# Layout dependent.
|
|
"width",
|
|
"height",
|
|
"grid-template-rows",
|
|
"grid-template-columns",
|
|
"perspective-origin",
|
|
"transform-origin",
|
|
"transform",
|
|
"top",
|
|
"right",
|
|
"bottom",
|
|
"left",
|
|
"border-top-width",
|
|
"border-right-width",
|
|
"border-bottom-width",
|
|
"border-left-width",
|
|
"margin-top",
|
|
"margin-right",
|
|
"margin-bottom",
|
|
"margin-left",
|
|
"padding-top",
|
|
"padding-right",
|
|
"padding-bottom",
|
|
"padding-left",
|
|
]
|
|
|
|
def serialized_by_servo(prop):
|
|
if prop.type() == "shorthand" or prop.type() == "alias":
|
|
return True
|
|
# Keywords are all fine, except -moz-osx-font-smoothing, which does
|
|
# resistfingerprinting stuff.
|
|
if prop.keyword and prop.name != "-moz-osx-font-smoothing":
|
|
return True
|
|
return prop.name not in LONGHANDS_NOT_SERIALIZED_WITH_SERVO
|
|
|
|
def exposed_on_getcs(prop):
|
|
if "Style" not in prop.rule_types_allowed_names():
|
|
return False
|
|
if is_internal(prop):
|
|
return False
|
|
return True
|
|
|
|
def rules(prop):
|
|
return ", ".join('"{}"'.format(rule) for rule in prop.rule_types_allowed_names())
|
|
|
|
RUST_TO_CPP_FLAGS = {
|
|
"CAN_ANIMATE_ON_COMPOSITOR": "CanAnimateOnCompositor",
|
|
"AFFECTS_LAYOUT": "AffectsLayout",
|
|
"AFFECTS_PAINT": "AffectsPaint",
|
|
"AFFECTS_OVERFLOW": "AffectsOverflow",
|
|
}
|
|
|
|
def flags(prop):
|
|
result = []
|
|
if prop.explicitly_enabled_in_chrome():
|
|
result.append("EnabledInUASheetsAndChrome")
|
|
elif prop.explicitly_enabled_in_ua_sheets():
|
|
result.append("EnabledInUASheets")
|
|
if is_internal(prop):
|
|
result.append("Internal")
|
|
if prop.enabled_in == "":
|
|
result.append("Inaccessible")
|
|
for (k, v) in RUST_TO_CPP_FLAGS.items():
|
|
if k in prop.flags:
|
|
result.append(v)
|
|
if exposed_on_getcs(prop):
|
|
result.append("ExposedOnGetCS")
|
|
if prop.type() == "shorthand" and "SHORTHAND_IN_GETCS" in prop.flags:
|
|
result.append("ShorthandUnconditionallyExposedOnGetCS")
|
|
if serialized_by_servo(prop):
|
|
result.append("SerializedByServo")
|
|
if prop.type() == "longhand" and prop.logical:
|
|
result.append("IsLogical")
|
|
return ", ".join('"{}"'.format(flag) for flag in result)
|
|
|
|
def pref(prop):
|
|
if prop.gecko_pref:
|
|
return '"' + prop.gecko_pref + '"'
|
|
return '""'
|
|
|
|
def sub_properties(prop):
|
|
return ", ".join('"{}"'.format(p.ident) for p in prop.sub_properties)
|
|
|
|
def aliases(prop):
|
|
return ", ".join('"{}"'.format(p.ident) for p in prop.aliases)
|
|
%>
|
|
|
|
data = {
|
|
% for prop in data.longhands:
|
|
"${prop.ident}": Longhand("${prop.name}", "${method(prop)}", "${prop.ident}", [${rules(prop)}], [${flags(prop)}], ${pref(prop)}, [${aliases(prop)}]),
|
|
% endfor
|
|
|
|
% for prop in data.shorthands:
|
|
"${prop.ident}": Shorthand("${prop.name}", "${prop.camel_case}", "${prop.ident}", [${rules(prop)}], [${flags(prop)}], ${pref(prop)}, [${sub_properties(prop)}], [${aliases(prop)}]),
|
|
% endfor
|
|
|
|
% for prop in data.all_aliases():
|
|
"${prop.ident}": Alias("${prop.name}", "${prop.camel_case}", "${prop.ident}", "${prop.original.ident}", [${rules(prop)}], [${flags(prop)}], ${pref(prop)}),
|
|
% endfor
|
|
}
|