forked from mirrors/gecko-dev
The current spec says: "If only the X value is given, the Y value defaults to the same value.", so we should update the behavior. Besides, we also update the serialization, so we serialization both specified and computed value by servo. We enable the preference for all the css-transforms, so some of them are passed now. Differential Revision: https://phabricator.services.mozilla.com/D10638 --HG-- extra : moz-landing-system : lando
186 lines
5.3 KiB
Python
186 lines
5.3 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", "flags", "pref"]
|
|
|
|
def __init__(self, *args):
|
|
_assign_slots(self, args)
|
|
|
|
@staticmethod
|
|
def type():
|
|
return "longhand"
|
|
|
|
|
|
class Shorthand(object):
|
|
__slots__ = ["name", "method", "id", "flags", "pref", "subprops"]
|
|
|
|
def __init__(self, *args):
|
|
_assign_slots(self, args)
|
|
|
|
@staticmethod
|
|
def type():
|
|
return "shorthand"
|
|
|
|
|
|
class Alias(object):
|
|
__slots__ = ["name", "method", "alias_id", "prop_id", "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.
|
|
if not prop.gecko_pref and not prop.enabled_in_content():
|
|
return True
|
|
# There are some special cases we may want to remove eventually.
|
|
OTHER_INTERNALS = [
|
|
"-moz-context-properties",
|
|
"-moz-control-character-visibility",
|
|
]
|
|
return prop.name in OTHER_INTERNALS
|
|
|
|
def method(prop):
|
|
if prop.name == "float":
|
|
return "CssFloat"
|
|
if prop.name.startswith("-x-"):
|
|
return prop.camel_case[1:]
|
|
return prop.camel_case
|
|
|
|
# Colors, integers and lengths are easy as well.
|
|
#
|
|
# TODO(emilio): This will go away once the rest of the longhands have been
|
|
# moved or perhaps using a blacklist for the ones with non-layout-dependence
|
|
# but other non-trivial dependence like scrollbar colors.
|
|
SERIALIZED_PREDEFINED_TYPES = [
|
|
"Appearance",
|
|
"BackgroundRepeat",
|
|
"BackgroundSize",
|
|
"BorderImageRepeat",
|
|
"Clear",
|
|
"ClipRectOrAuto",
|
|
"Color",
|
|
"Content",
|
|
"CounterIncrement",
|
|
"CounterReset",
|
|
"FillRule",
|
|
"Float",
|
|
"FontFamily",
|
|
"FontFeatureSettings",
|
|
"FontLanguageOverride",
|
|
"FontSize",
|
|
"FontSizeAdjust",
|
|
"FontStretch",
|
|
"FontStyle",
|
|
"FontSynthesis",
|
|
"FontVariant",
|
|
"FontVariantAlternates",
|
|
"FontVariantEastAsian",
|
|
"FontVariantLigatures",
|
|
"FontVariantNumeric",
|
|
"FontVariationSettings",
|
|
"FontWeight",
|
|
"Integer",
|
|
"ImageLayer",
|
|
"Length",
|
|
"LengthOrPercentage",
|
|
"NonNegativeLength",
|
|
"NonNegativeLengthOrPercentage",
|
|
"ListStyleType",
|
|
"OffsetPath",
|
|
"Opacity",
|
|
"Quotes",
|
|
"Resize",
|
|
"Scale",
|
|
"TextAlign",
|
|
"TimingFunction",
|
|
"TransformStyle",
|
|
"background::BackgroundSize",
|
|
"basic_shape::ClippingShape",
|
|
"basic_shape::FloatAreaShape",
|
|
"position::HorizontalPosition",
|
|
"position::VerticalPosition",
|
|
"url::ImageUrlOrNone",
|
|
]
|
|
|
|
def serialized_by_servo(prop):
|
|
# If the property requires layout information, no such luck.
|
|
if "GETCS_NEEDS_LAYOUT_FLUSH" in prop.flags:
|
|
return False
|
|
# No shorthands yet.
|
|
if prop.type() == "shorthand":
|
|
return False
|
|
# 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
|
|
if prop.predefined_type in SERIALIZED_PREDEFINED_TYPES:
|
|
return True
|
|
# TODO(emilio): Enable the rest of the longhands.
|
|
return False
|
|
|
|
def exposed_on_getcs(prop):
|
|
if prop.type() == "longhand":
|
|
return not is_internal(prop)
|
|
# TODO: bug 137688 / https://github.com/w3c/csswg-drafts/issues/2529
|
|
if prop.type() == "shorthand":
|
|
return "SHORTHAND_IN_GETCS" in prop.flags
|
|
|
|
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")
|
|
if "GETCS_NEEDS_LAYOUT_FLUSH" in prop.flags:
|
|
result.append("GetCSNeedsLayoutFlush")
|
|
if "CAN_ANIMATE_ON_COMPOSITOR" in prop.flags:
|
|
result.append("CanAnimateOnCompositor")
|
|
if exposed_on_getcs(prop):
|
|
result.append("ExposedOnGetCS")
|
|
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)
|
|
%>
|
|
|
|
data = [
|
|
% for prop in data.longhands:
|
|
Longhand("${prop.name}", "${method(prop)}", "${prop.ident}", [${flags(prop)}], ${pref(prop)}),
|
|
% endfor
|
|
|
|
% for prop in data.shorthands:
|
|
Shorthand("${prop.name}", "${prop.camel_case}", "${prop.ident}", [${flags(prop)}], ${pref(prop)},
|
|
[${sub_properties(prop)}]),
|
|
% endfor
|
|
|
|
% for prop in data.all_aliases():
|
|
Alias("${prop.name}", "${prop.camel_case}", "${prop.ident}", "${prop.original.ident}", [], ${pref(prop)}),
|
|
% endfor
|
|
]
|