We need to convert all AnimationValue (AnimationValueMap) on an element
to PropertyDeclarationBlock in order to push the value inside the CSS cascade.
Two reasons we did not add the function in AnimationValueMap:
1) All members of PropertyDeclarationBlock are private.
2) Rust does not allow us impl for type alias, so if we do impl the function
in AnimationValueMap we need to make AnimationValueMap as a tuple or struct.
Fixes#15398
The previous commit did most of the work here of updating the algorithm
to skip shorthands if a shorthand value was an empty string. This commit
just updates animations LonghandToSerialize's implementation of
to_css_declared to write an empty string value if the list lengths
differ (and updates the test to match).
possible shorthands matches the linked spec.
Previously substep 5 attempted to serialize the complete shorthand
declaration and substep 6 skipped to the next shorthand only if the
current shorthand was not serialized, but this did not catch empty
serializations. The spec on the other hand specifically says that the
*value* should be evaluated first and if the value is empty substep 6
should skip to the next shorthand - which is what happens now.
To do this required some refactoring which mostly simplifies the code.
Specifically:
- append_declaration_value was refactored so that importance is not
required as a arg (by moving it to the end of append_serialization)
and is_overflow_with_name was removed as an arg also (initially I
refactored it elsewhere, but it turns out it's no longer required at
all - more below). With these changes, append_declaration_value can
be used within the algorithm for to_css to obtain just the value for
substep 5.
- Substeps 7 and 8 of the algorithm become explicit (they were implicit
before) by passing the value, shorthand and importance to
append_serialization.
- serialize_shorthand_to_buffer is no longer required (as the algorithm
serializes the value first instead, as per the spec.
A surprising result of this was that I could also remove a lot of code
handling the special case of the overflow properties serialization. This
is because the overflow's LonghandToCss implementation of
to_css_declared already does the right thing according to the spec - it
writes the single value if both overflow-x and -y are equal, and
writes nothing otherwise - so that the algorithm now skips that shorthand
instead rendering the longhands.
* `LonghandId` and `ShorthandId` are C-like enums
* `Atom` is used for the name of custom properties.
* `PropertyDeclarationId` is the identifier for `PropertyDeclaration`,
after parsing and shorthand expansion. (Longhand or custom property.)
* `PropertyId` represents any CSS property, e.g. in CSSOM.
(Longhand, shorthand, or custom.)
Using these instead of strings avoids some memory allocations and copies.