Gecko:Overview: Difference between revisions

Jump to navigation Jump to search
Update for the nsStyleContext -> ComputedStyle rename
(Updating description for ib-splitting)
(Update for the nsStyleContext -> ComputedStyle rename)
Line 237: Line 237:


The computed style data for an element/frame are exposed to the rest of
The computed style data for an element/frame are exposed to the rest of
Gecko through a class
Gecko through the class mozilla::ComputedStyle (previously called
called nsStyleContext.  Rather than having a member variable for each
nsStyleContext).  Rather than having a member variable for each
CSS property, it breaks up the properties into groups of related
CSS property, it breaks up the properties into groups of related
properties called style structs.  These style structs obey the rule that
properties called style structs.  These style structs obey the rule that
Line 245: Line 245:
properties; we call these inherited structs) or all are not inherited by
properties; we call these inherited structs) or all are not inherited by
default (we call these reset structs).  Separating the properties in
default (we call these reset structs).  Separating the properties in
this way improves the ability to share the structs between similar style
this way improves the ability to share the structs between similar
contexts and reduce the amount of memory needed to store the style data.
ComputedStyle objects and reduce the amount of memory needed to store
The nsStyleContext API exposes a method for getting each
the style data. The ComputedStyle API exposes a method for getting each
struct, so you'll see code like
struct, so you'll see code like
<code>sc->GetStyleText()->mTextAlign</code> for getting the value of the
<code>sc->GetStyleText()->mTextAlign</code> for getting the value of the
text-align CSS property.  (Frames (see the Layout section below) also
text-align CSS property.  (Frames (see the Layout section below) also
have the same
have the same
GetStyle* methods, which just forward the call to the frame's style
GetStyle* methods, which just forward the call to the frame's
context.)
ComputedStyle.)


The style contexts form a tree structure, in a shape somewhat like the
The ComputedStyles form a tree structure, in a shape somewhat like the
content tree (except that we coalesce identical sibling style contexts
content tree (except that we coalesce identical sibling ComputedStyles
rather than keeping two of them around; if the parents have been
rather than keeping two of them around; if the parents have been
coalesced then this can apply recursively and coalasce cousins, etc.;
coalesced then this can apply recursively and coalasce cousins, etc.;
we do not coalesce parent/child style contexts).
we do not coalesce parent/child ComputedStyles).
The parent of a style context has the style data that the style context
The parent of a ComputedStyle has the style data that the ComputedStyle
inherits from when CSS inheritance occurs.  This means that the parent
inherits from when CSS inheritance occurs.  This means that the parent
of the style context for a DOM element is generally the style context
of the ComputedStyle for a DOM element is generally the ComputedStyle
for that DOM element's parent, since that's how CSS says inheritance
for that DOM element's parent, since that's how CSS says inheritance
works.
works.
Line 289: Line 289:
pointer to a rule, but since a rule may appear in many sequences, there
pointer to a rule, but since a rule may appear in many sequences, there
are sometimes many rule nodes pointing to the same rule.  Once we have
are sometimes many rule nodes pointing to the same rule.  Once we have
this list we create a style context (or find an appropriate existing
this list we create a ComputedStyle (or find an appropriate existing
sibling) with the correct parent pointer (for inheritance) and rule node
sibling) with the correct parent pointer (for inheritance) and rule node
pointer (for the list of rules), and a few other pieces of information
pointer (for the list of rules), and a few other pieces of information
Line 322: Line 322:
depend on inherited values or on data from other style structs, then we
depend on inherited values or on data from other style structs, then we
can cache it in the rule tree (and then reuse it, without recomputing
can cache it in the rule tree (and then reuse it, without recomputing
it, for any style contexts pointing to that rule node).  Otherwise, we
it, for any ComputedStyles pointing to that rule node).  Otherwise, we
store it on the style context (in which case it may be shared
store it on the ComputedStyle (in which case it may be shared
with the style context's descendant style contexts).
with the ComputedStyle's descendant ComputedStyles).
This is where keeping inherited and
This is where keeping inherited and
non-inherited properties separate is useful:  in the common case of
non-inherited properties separate is useful:  in the common case of
relatively few properties being specified, we can generally cache the
relatively few properties being specified, we can generally cache the
non-inherited structs in the rule tree, and we can generally share the
non-inherited structs in the rule tree, and we can generally share the
inherited structs up and down the style context tree.
inherited structs up and down the ComputedStyle tree.


The ownership models in style sheet structures are a mix of reference
The ownership models in style sheet structures are a mix of reference
counted structures (for things accessible from script) and directly
counted structures (for things accessible from script) and directly
owned structures.  Style contexts are reference counted, and own their
owned structures.  ComputedStyles are reference counted, and own their
parents (from which they inherit), and rule nodes are garbage collected
parents (from which they inherit), and rule nodes are garbage collected
with a simple mark and sweep collector (which often never needs to run).
with a simple mark and sweep collector (which often never needs to run).
Confirmed users, Bureaucrats and Sysops emeriti
969

edits

Navigation menu