Compare Revisions

Adding a new CSS property

Revision 455525:

Revision 455525 by DBaron on

Revision 455535:

Revision 455535 by DBaron on

Title:
Adding a new style property
Adding a new style property
Slug:
Adding_a_new_style_property
Adding_a_new_style_property
Tags:
"Developing Mozilla","Gecko"
"Developing Mozilla","Gecko"
Content:

Revision 455525
Revision 455535
n23      Then you need to decide which style struct the computed valn23      Then, unless you're implementing a shorthand property, you 
>ue of the proerty should go in.&nbsp; (Again, see <a href="https:>need to decide which style struct the computed value of the proer
>//wiki.mozilla.org/Gecko:Overview#Style_System" title="https://wi>ty should go in.&nbsp; (Again, see <a href="https://wiki.mozilla.
>ki.mozilla.org/Gecko:Overview#Style_System">the Gecko Overview</a>org/Gecko:Overview#Style_System" title="https://wiki.mozilla.org/
>> for more information.)&nbsp; It should generally be grouped wit>Gecko:Overview#Style_System">the Gecko Overview</a> for more info
>h related properties.&nbsp; Remember that each style struct conta>rmation.)&nbsp; It should generally be grouped with related prope
>ins only properties that inherit by default or only properties th>rties.&nbsp; Remember that each style struct contains only proper
>at do not.&nbsp; (Which set the property is in is given in the sp>ties that inherit by default or only properties that do not.&nbsp
>ecification, which says "Inherited: yes" or "Inherited: no" in th>; (Which set the property is in is given in the specification, wh
>e property's definition.)&nbsp; Also note that some of the style >ich says "Inherited: yes" or "Inherited: no" in the property's de
>structs intentionally contain only properties set/reset by a part>finition.)&nbsp; Also note that some of the style structs intenti
>icular common shorthand property; this improves the effectiveness>onally contain only properties set/reset by a particular common s
> of some of the performance and memory optimizations done with th>horthand property; this improves the effectiveness of some of the
>e rule tree, and thus we should avoid adding a property not reset> performance and memory optimizations done with the rule tree, an
> by that shorthand to such a struct.>d thus we should avoid adding a property not reset by that shorth
 >and to such a struct.
n26      Once you know which struct you're going to use, you can addn26      Once you know which struct you're going to use (or that the
> appropriate entry to <a href="http://mxr.mozilla.org/mozilla-cen> property is a shorthand), you can add appropriate entry to <a hr
>tral/source/layout/style/nsCSSPropList.h" title="http://mxr.mozil>ef="http://mxr.mozilla.org/mozilla-central/source/layout/style/ns
>la.org/mozilla-central/source/layout/style/nsCSSPropList.h">nsCSS>CSSPropList.h" title="http://mxr.mozilla.org/mozilla-central/sour
>PropList.h</a>.&nbsp; Again, see the documentation at the top of >ce/layout/style/nsCSSPropList.h">nsCSSPropList.h</a>.&nbsp; Again
>the file and the other entries for examples, and also see the nex>, see the documentation at the top of the file and the other entr
>t section for details about parsing.>ies for examples, and also see the next section for details about
 > parsing.
n32      new keywords if neededn32      To start implementing the parsing, first read the Syntax li
 >ne in the property's specification (whose syntax is in turn defin
 >ed in the <a href="http://dev.w3.org/csswg/css-values/#value-defs
 >" title="http://dev.w3.org/csswg/css-values/#value-defs">CSS Valu
 >es and Units</a> specification) and any prose in the specificatio
 >n that adds additional restrictions to that syntax.
n35      subproperty table for shorthandsn35      Every property in nsCSSPropList.h must have in its flags fi
 >eld exactly one of the four CSS_PROPERTY_PARSE_* flags defined in
 > <a href="http://mxr.mozilla.org/mozilla-central/source/layout/st
 >yle/nsCSSProps.h" title="http://mxr.mozilla.org/mozilla-central/s
 >ource/layout/style/nsCSSProps.h">nsCSSProps.h</a>.&nbsp; Given th
 >e syntax for the property, you can determine which one to use.&nb
 >sp; If the property's values can be expressed as a single value, 
 >or as a space-separated or comma-separated list of values that ca
 >n be described by the VARIANT_* flags (also in nsCSSProps.h), you
 > should use CSS_PROPERTY_PARSE_VALUE or CSS_PROPERTY_PARSE_VALUE_
 >LIST, and set the appropriate VARIANT_* flags in the entry in nsC
 >SSPropList.h (and maybe also CSS_PROPERTY_VALUE_LIST_USES_COMMAS)
 >.&nbsp; Otherwise, set the variant entry in the nsCSSPropList ent
 >ry to 0.&nbsp; If you need custom parsing code, this can be inser
 >ted at one of two different places:&nbsp; you can override the en
 >tire property value parsing by using CSS_PROPERTY_PARSE_FUNCTION,
 > which is generally the right thing to do for shorthand propertie
 >s.&nbsp; Or, preferably, you can still use CSS_PROPERTY_PARSE_VAL
 >UE or ..._VALUE_LIST and just override the value parsing by setti
 >ng CSS_PROPERTY_VALUE_PARSER_FUNCTION.&nbsp; You must take the la
 >tter approach for properties that are part of shorthands if you w
 >ant the shorthand parser to be able to reuse the longhand parser.
 >&nbsp; (Note that when the longhand property CSS_PROPERTY_PARSE_V
 >ALUE_LIST, the shorthand property parser would be assumed to be r
 >eusing the longhand parser once per item, not for a whole list, a
 >s for properties like background-image or transform-timing-functi
 >on.)
n38      parsing (3 ways, and which to choose).&nbsp; Common mistaken38      If the property takes a list of keywords other than inherit
>s: paren matching, UngetToken().>/initial/etc., auto, none, or normal (which can be expressed usin
 >g the VARIANT_* flags), you should use VARIANT_KEYWORD and add a 
 >keyword table to the nsCSSProps class.&nbsp; The name of this key
 >word table needs to go in the nsCSSPropList entry; otherwise that
 > keyword table should be null.&nbsp; If you need a keyword table,
 > you should include auto, normal, or none (if needed) in that tab
 >le rather than combining VARIANT_KEYWORD with VARIANT_AUTO, VARIA
 >NT_NORMAL, or VARIANT_NONE.
tt40    <p>
41      If you add a shorthand property, you'll need to use the CSS
 >_PROP_SHORTHAND macro.&nbsp; You'll need to use CSS_PROPERTY_PARS
 >E_FUNCTION as described above; you can't use the other options fo
 >r shorthands.&nbsp; And for shorthands you also need to include a
 > subproperty table in nsCSSProps, whose name must match the "meth
 >od" argument&nbsp; in the CSS_PROP_SHORTHAND macro.&nbsp; When wr
 >iting the custom parsing code for a shorthand, you'll need to ens
 >ure that any successful parse sets all of the subproperties of th
 >e shorthand (since that's the way shorthands work in CSS).
42    </p>
43    <p>
44      Some common mistakes to watch out for when writing custom p
 >arsing code (which might go away if we redesign the parser along 
 >the lines described in css3-syntax):
45    </p>
46    <ul>
47      <li>make sure to call SkipUntil() to look for the matching 
 >close parentheses, braces, or brackets whenever you hit an error 
 >inside of them.
48      </li>
49      <li>make sure to call UngetToken() if you have called GetTo
 >ken() but the result is unexpected.&nbsp; This is particularly im
 >portant in case the unexpected token is a parenthesis or somethin
 >g else that requires matching the other half of a pair.
50      </li>
51    </ul>

Back to History