Servo's style system overview
This document provides an overview of Servo's style system. For more extensive details, refer to the style doc comments, or the Styling Overview in the wiki, which includes a conversation between Boris Zbarsky and Patrick Walton about how style sharing works.
Selector Implementation
To ensure compatibility with Stylo (a project integrating Servo's style system into Gecko), selectors must be consistent.
The consistency is implemented in selectors' SelectorImpl, containing the logic related to parsing pseudo-elements and other pseudo-classes apart from tree-structural ones.
Servo extends the selector implementation trait in order to allow a few more things to be shared between Stylo and Servo.
The main Servo implementation (the one that is used in regular builds) is SelectorImpl.
DOM glue
In order to keep DOM, layout and style in different modules, there are a few traits involved.
Style's dom
traits (TDocument
, TElement
, TNode
, TRestyleDamage
) are the main "wall" between layout and style.
Layout's wrapper
module makes sure that layout traits have the required traits implemented.
The Stylist
The stylist
structure holds all the selectors and device characteristics for a given document.
The stylesheets' CSS rules are converted into Rule
s.
They are then introduced in a SelectorMap
depending on the pseudo-element (see PerPseudoElementSelectorMap
), stylesheet origin (see PerOriginSelectorMap
), and priority (see the normal
and important
fields in PerOriginSelectorMap
).
This structure is effectively created once per pipeline, in the corresponding LayoutThread.
The properties
module
The properties module is a mako template.
Its complexity is derived from the code that stores properties, cascade
function and computation logic of the returned value which is exposed in the main function.