Mon, 22 Jul 2013 16:31:47 -0700
updated annotation links to use the new naming
1 <!DOCTYPE html public '-//W3C//DTD HTML 4.01//EN'
2 'http://www.w3.org/TR/html4/strict.dtd'>
3 <html lang="en">
4 <head profile="http://www.w3.org/2006/03/hcard">
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6 <title>CSS Conditional Rules Module Level 3</title>
7 <link rel="stylesheet" type="text/css" href="../default.css">
8 <link href="../csslogo.ico" rel="shortcut icon" type="image/x-icon">
9 <link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-[STATUS].css">
10 <script src="http://test.csswg.org/harness/annotate.js#css-conditional-3_dev"
11 type="text/javascript" defer></script>
12 </head>
13 <body class="h-entry">
15 <div class="head">
16 <!--logo-->
18 <h1 class="p-name">CSS Conditional Rules Module Level 3</h1>
20 <h2 class="no-num no-toc">[LONGSTATUS] <span class="dt-updated"><span class="value-title" title="[CDATE]">[DATE]</span></span></h2>
21 <dl>
22 <dt>This version:
23 <dd><a class="u-url" href="[VERSION]">
24 http://www.w3.org/TR/[YEAR]/ED-css3-conditional-[CDATE]/</a>
26 <dt>Latest version:
27 <dd><a href="http://www.w3.org/TR/[SHORTNAME]/">http://www.w3.org/TR/[SHORTNAME]/</a>
29 <dt>Editor's draft:
30 <dd><a href="http://dev.w3.org/csswg/[SHORTNAME]/">http://dev.w3.org/csswg/[SHORTNAME]/</a>
31 (<a href="https://dvcs.w3.org/hg/csswg/log/tip/css-conditional/Overview.src.html">change log</a>,
32 <a href="https://dvcs.w3.org/hg/csswg/log/tip/css3-conditional/Overview.src.html">older change log</a>)
34 <dt>Previous version:
35 <dd><a rel="previous" href="http://www.w3.org/TR/2013/CR-css3-conditional-20130404/">http://www.w3.org/TR/2013/CR-css3-conditional-20130404/</a></dd>
37 <dt>Editors:
38 <dd class="p-author h-card vcard"><a class="p-name fn u-url url" rel="author" href="http://dbaron.org/">L. David Baron</a>,
39 <a class="p-org org h-org" href="http://www.mozilla.org/">Mozilla</a>
41 <dt>Issues list:
42 <dd>Maintained in document (only editor's draft is current)
44 <dt>Feedback:</dt>
45 <dd><a href="mailto:www-style@w3.org?subject=%5Bcss3-conditional%5D%20feedback"
46 >www-style@w3.org</a>
47 with subject line “<kbd>[css3-conditional]
48 <var>… message topic …</var></kbd>”
49 (<a rel="discussion" href="http://lists.w3.org/Archives/Public/www-style/"
50 >archives</a>)
52 <dt>Test suite:
53 <dd><a href="http://test.csswg.org/suites/css3-conditional/nightly-unstable/">http://test.csswg.org/suites/css3-conditional/nightly-unstable/</a>
55 </dl>
57 <!--copyright-->
59 <hr title="Separator for header">
60 </div>
62 <h2 class="no-num no-toc" id="abstract">Abstract</h2>
64 <p>CSS is a language for describing the rendering of structured documents
65 (such as HTML and XML) on screen, on paper, in speech, etc.
66 <span class="p-summary">
67 This module
68 contains the features of CSS for conditional processing of parts of
69 style sheets, conditioned on capabilities of the processor or the
70 document the style sheet is being applied to.
71 It includes and extends the functionality of CSS level 2 [[!CSS21]],
72 which builds on CSS level 1 [[CSS1]].
73 The main extensions compared to level 2 are
74 allowing nesting of certain at-rules inside '@media',
75 and the addition of the '@supports'
76 rule for conditional processing.
77 </span>
79 <h2 class="no-num no-toc" id="status">Status of this document</h2>
81 <!--status-->
83 <p>See the section <a href="#cr-exit-criteria">“CR Exit Criteria”</a>
84 for details on advancing this specification to W3C Recommendation. The
85 specification will remain Candidate Recommendation at least until 2
86 October 2013. A <a
87 href="http://test.csswg.org/suites/css3-conditional/nightly-unstable/report/"
88 >test suite and implementation report</a> are under development.
90 <p>See the section <a href="#changes">“Changes”</a> for changes since
91 the last Working Draft.
93 <p>The following features are at risk:
94 <ul>
95 <li>The inclusion of '@font-face' rules and
96 '@keyframes' rules as allowed within all of the @-rules in
97 this specification is at risk, though only because of the relative
98 rates of advancement of specifications. If this specification is able
99 to advance faster than one or both of the specifications defining
100 those rules, then the inclusion of those rules will move from this
101 specification to the specification defining those rules.</li>
103 <li>The addition of support for @-rules inside of conditional grouping
104 rules is at risk; if interoperable implementations are not found, it
105 may be removed to advance the other features in this specification to
106 Proposed Recommendation.</li>
108 <li>The '@supports' rule is at risk; if interoperable
109 implementations are not found, it may be removed to advance the other
110 features in this specification to Proposed Recommendation.</li>
111 </ul>
113 <!--
115 Things to go in level 4:
117 * Create some way to put these new conditional things on an @import.
118 * The @document rule (commented out, down below).
120 -->
122 <h2 class="no-num no-toc" id="contents">Table of contents</h2>
124 <!--toc-->
126 <h2 id="introduction">Introduction</h2>
128 <h3 id="context">Background</h3>
130 <p><em>This section is not normative.</em>
132 <p>[[!CSS21]] defines one type of conditional group rule, the
133 '@media' rule, and allows only style rules (not other @-rules)
134 inside of it. The '@media' rule provides the ability to
135 have media-specific style sheets, which is also provided by style
136 sheet linking features such as '@import' and
137 <code class="html"><link></code>. The restrictions on the contents of
138 '@media' rules made them less useful; they have forced authors
139 using CSS features involving @-rules in media-specific style sheets to
140 use separate style sheets for each medium.</p>
142 <p>This specification extends the rules for the contents of
143 conditional group rules to allow other @-rules, which enables authors
144 to combine CSS features involving @-rules with media specific style
145 sheets within a single style sheet.</p>
147 <p>This specification also defines an additional type of conditional
148 group rule, '@supports', to
149 address author and user requirements.</p>
151 <p>The '@supports' rule allows CSS to be conditioned on
152 implementation support for CSS properties and values. This rule makes
153 it much easier for authors to use new CSS features and provide good
154 fallback for implementations that do not support those features. This
155 is particularly important for CSS features that provide new layout
156 mechanisms, and for other cases where a set of related styles needs to
157 be conditioned on property support.</p>
159 <h3 id="placement">Module Interactions</h3>
161 <p>This module replaces and extends the '@media' rule
162 feature defined in [[!CSS21]] section <var>7.2.1</var> and
163 incorporates the modifications previously made non-normatively by
164 [[!MEDIAQ]] section <var>1</var>.</p>
166 <p>Its current definition depends on @-rules defined in [[!CSS3-FONTS]]
167 and [[!CSS3-ANIMATIONS]], but that dependency is only on the
168 assumption that those modules will advance ahead of this one. If this
169 module advances faster, then the dependency will be reversed.</p>
171 <h3 id="conventions">Document Conventions</h3>
173 <p>Conformance requirements are expressed with a combination of
174 descriptive assertions and RFC 2119 terminology. The key words “MUST”,
175 “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
176 “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this
177 document are to be interpreted as described in RFC 2119.
178 However, for readability, these words do not appear in all uppercase
179 letters in this specification.
181 <p>All of the text of this specification is normative except sections
182 explicitly marked as non-normative, examples, and notes. [[!RFC2119]]</p>
184 <p>Examples in this specification are introduced with the words “for example”
185 or are set apart from the normative text with
186 <code class="html">class="example"</code>, like this:
188 <div class="example">
189 <p>This is an example of an informative example.</p>
190 </div>
192 <p>Informative notes begin with the word “Note” and are set apart from the
193 normative text with <code class="html">class="note"</code>, like this:
195 <p class="note">Note, this is an informative note.</p>
197 <h2 id="processing">Processing of conditional group rules</h2>
199 <p>This specification defines some CSS @-rules, called <dfn>conditional
200 group rules</dfn>, that associate a condition with a group of other
201 CSS rules. These different rules allow testing different types of
202 conditions, but share common behavior for how their contents are used
203 when the condition is true and when the condition is false.</p>
205 <div class="example">
206 <p>For example, this rule:</p>
207 <pre>@media print {
208 /* hide navigation controls when printing */
209 #navigation { display: none }
210 }</pre>
211 <p>causes a particular CSS rule (making elements with ID "navigation" be
212 display:none) apply only when the style sheet is used for a print
213 medium.
214 </div>
216 <p>Each conditional group rule has a condition, which at any time
217 evaluates to true or false. When the condition is true, CSS processors
218 <strong>must</strong> apply the rules inside the group rule as though
219 they were at the group rule's location; when the condition is false, CSS
220 processors <strong>must not</strong> apply any of rules inside the group
221 rule. The current state of the condition does not affect the CSS object
222 model, in which the contents of the group rule always remain within the
223 group rule.</p>
225 <p>This means that when multiple conditional group rules are nested,
226 a rule inside of both of them applies only when all of the rules'
227 conditions are true.</p>
229 <div class="example">For example, with this set of nested rules:
230 <pre>@media print { // rule (1)
231 /* hide navigation controls when printing */
232 #navigation { display: none }
233 @media (max-width: 12cm) { // rule (2)
234 /* keep notes in flow when printing to narrow pages */
235 .note { float: none }
236 }
237 }</pre>
238 the condition of the rule marked (1) is true for print media, and the
239 condition of the rule marked (2) is true when the width of the display
240 area (which for print media is the page box) is less than or equal to
241 12cm. Thus the rule ''#navigation { display: none }'' applies
242 whenever this style sheet is applied to print media, and the rule
243 ''.note { float: none }'' is applied only when the style sheet
244 is applied to print media <em>and</em> the width of the page box is less
245 than or equal to 12 centimeters.</div>
247 <p>When the condition for a conditional group rule changes, CSS
248 processors <strong>must</strong> reflect that the rules now apply or no
249 longer apply, except for properties whose definitions define effects of
250 computed values that persist past the lifetime of that value (such as
251 for some properties in [[CSS3-TRANSITIONS]] and
252 [[!CSS3-ANIMATIONS]]).</p>
254 <h2 id="contents-of">Contents of conditional group rules</h2>
256 <p>The syntax of each conditional group rule consists of some syntax
257 specific to the type of rule followed by a <dfn>group rule body</dfn>,
258 which is a block (pair of braces) containing a sequence of rules.</p>
260 <p>A group rule body is allowed to contain style rules and any @-rules that
261 are allowed at the top level of a style sheet before and after a
262 style rule. This means that @-rules that must occur at the beginning of
263 the style sheet (such as '@charset', '@import',
264 and '@namespace' rules) are not allowed inside of conditional group
265 rules. Conditional group rules can be nested.</p>
267 <p>In terms of the grammar, this specification defines the following
268 productions for use in the grammar of conditional group rules:</p>
270 <p class=note>Note: Style rules are defined in grammars
271 by the <code>ruleset</code> production.</p>
273 <pre><dfn>nested_statement</dfn>
274 : ruleset | <i>media</i> | page | font_face_rule | keyframes_rule |
275 <i>supports_rule</i>
276 ;
278 <dfn>group_rule_body</dfn>
279 : '{' S* <i>nested_statement</i>* '}' S*
280 ;</pre>
281 <p>
282 in which all the productions are defined in that grammar with the
283 exception of <code>font_face_rule</code>
284 defined in [[!CSS3-FONTS]], <code>keyframes_rule</code> defined in
285 [[!CSS3-ANIMATIONS]], and <code>media</code> and <code>supports_rule</code>
286 defined in this specification.</p>
288 <p>In general, future CSS specifications that add new @-rules that are
289 not forbidden to occur after some other types of rules should modify
290 this <code>nested_statement</code> production to keep the grammar
291 accurate.</p>
293 <p>Style sheets <strong>must not</strong> use rules other than the allowed ones inside
294 conditional group rules.</p>
296 <p>CSS processors <strong>must</strong> ignore rules that are not
297 allowed within a group rule, and <strong>must</strong> handle invalid
298 rules inside of group rules as described in <a
299 href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors">section
300 4.2 (Rules for handling parsing errors)</a>, <a
301 href="http://www.w3.org/TR/CSS21/syndata.html#at-rules">section 4.1.5
302 (At-rules)</a>, and <a
303 href="http://www.w3.org/TR/CSS21/syndata.html#rule-sets">section 4.1.7
304 (Rule sets, declaration blocks, and selectors)</a> of [[!CSS21]].</p>
306 <h2 id="use">Placement of conditional group rules</h2>
308 <p>Conditional group rules are allowed at the top-level of a style
309 sheet, and inside other conditional group rules. CSS processors
310 <strong>must</strong> process such rules as <a
311 href="#processing">described above</a>.</p>
313 <p>Any rules that are not allowed after a style rule (e.g., ''@charset'',
314 ''@import'', or ''@namespace'' rules) are also not allowed after a
315 conditional group rule. Therefore, style sheets <strong>must
316 not</strong> place such rules after a conditional group rules, and CSS
317 processors <strong>must</strong> ignore such rules.</p>
319 <h2 id="at-media">Media-specific style sheets: the '@media' rule</h2>
321 <p>The <dfn id="atmedia-rule">'@media' rule</dfn> is a conditional group rule whose
322 condition is a media query. It consists of the at-keyword
323 '@media' followed by a (possibly empty) media query list (as
324 defined in [[!MEDIAQ]]), followed by a group rule body. The condition
325 of the rule is the result of the media query.</p>
327 <div class="example">
328 <p>This '@media' rule:</p>
329 <pre>@media screen and (min-width: 35em),
330 print and (min-width: 40em) {
331 #section_navigation { float: left; width: 10em; }
332 }</pre>
333 <p>has the condition
334 ''screen and (min-width: 35em), print and (min-width: 40em)'',
335 which is true for screen displays
336 whose viewport is at least 35 times the initial font size
337 and for print displays
338 whose viewport is at least 40 times the initial font size.
339 When either of these is true,
340 the condition of the rule is true,
341 and the rule
342 ''#section_navigation { float: left; width: 10em; }''
343 is applied.</p>
344 </div>
346 <p>In terms of the grammar, this specification extends the
347 <code>media</code> production in the
348 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
349 ([[!CSS21]], Appendix G) into:
350 <pre><dfn>media</dfn>
351 : MEDIA_SYM S* media_query_list <i>group_rule_body</i>
352 ;</pre>
353 <p>where the <code>group_rule_body</code> production is defined in this
354 specification, the <code>media_query_list</code> production is defined
355 in [[!MEDIAQ]], and the others are defined in the <a
356 href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
357 ([[!CSS21]], Appendix G).
359 <h2 id="at-supports">Feature queries: the '@supports' rule</h2>
361 <p>The <dfn id="atsupports-rule">'@supports' rule</dfn> is a conditional group
362 rule whose condition tests whether the user agent supports CSS
363 property:value pairs. Authors can use it to write style sheets that use
364 new features when available but degrade gracefully when those features
365 are not supported. CSS has existing mechanisms for graceful
366 degradation, such as ignoring unsupported properties or values, but
367 these are not always sufficient when large groups of styles need to be
368 tied to the support for certain features, as is the case for use of new
369 layout system features.</p>
371 <p>The syntax of the condition in the '@supports' rule is
372 slightly more complicated than for the other conditional group rules
373 (though has some similarities to media queries) since:</p>
374 <ul>
375 <li>negation is needed so that the new-feature styles and the fallback
376 styles can be separated (within the forward-compatible grammar's rules
377 for the syntax of @-rules), and not required to override each other</li>
378 <li>conjunction (and) is needed so that multiple required features can
379 be tested</li>
380 <li>disjunction (or) is needed when there are multiple alternative
381 features for a set of styles, particularly when some of those
382 alternatives are vendor-prefixed properties or values</li>
383 </ul>
385 <p>Therefore, the syntax of the '@supports' rule allows
386 testing for property:value pairs, and arbitrary conjunctions (and),
387 disjunctions (or), and negations (not) of them.</p>
389 <p>This extends the lexical scanner in the
390 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
391 ([[!CSS21]], Appendix G) by adding:
392 <pre>
393 @{S}{U}{P}{P}{O}{R}{T}{S} {return <dfn>SUPPORTS_SYM</dfn>;}
394 {O}{R} {return <dfn>OR</dfn>;}
395 </pre>
397 <p>This then extends the grammar in the
398 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>,
399 using the lexical scanner there, with the additions of
400 <code><a href="http://www.w3.org/TR/css3-mediaqueries/#syntax">AND</a></code> and
401 <code><a href="http://www.w3.org/TR/css3-mediaqueries/#syntax">NOT</a></code>
402 tokens defined in the Media Queries specification [[!MEDIAQ]]
403 and the <code>OR</code> and <code>SUPPORTS_SYM</code> tokens defined above,
404 and with
405 <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">declaration</a></code>,
406 <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">any</a></code>,
407 and <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">unused</a></code>
408 productions
409 and the <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">FUNCTION</a></code> token
410 taken from the core syntax of CSS defined in
411 <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">section 4.1.1 (Tokenization)</a> of [[!CSS21]],
412 by adding:</p>
414 <pre><dfn>supports_rule</dfn>
415 : <i>SUPPORTS_SYM</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <i>supports_condition</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <i>group_rule_body</i>
416 ;
418 <dfn>supports_condition</dfn>
419 : <i>supports_negation</i> | <i>supports_conjunction</i> | <i>supports_disjunction</i> |
420 <i>supports_condition_in_parens</i>
421 ;
423 <dfn>supports_condition_in_parens</dfn>
424 : ( '(' <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <i>supports_condition</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* ')' ) | <i>supports_declaration_condition</i> |
425 <i>general_enclosed</i>
426 ;
428 <dfn>supports_negation</dfn>
429 : <a href="http://www.w3.org/TR/css3-mediaqueries/#syntax"><i>NOT</i></a> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>supports_condition_in_parens</i>
430 ;
432 <dfn>supports_conjunction</dfn>
433 : <i>supports_condition_in_parens</i> ( <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <a href="http://www.w3.org/TR/css3-mediaqueries/#syntax"><i>AND</i></a> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>supports_condition_in_parens</i> )+
434 ;
436 <dfn>supports_disjunction</dfn>
437 : <i>supports_condition_in_parens</i> ( <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>OR</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>supports_condition_in_parens</i> )+
438 ;
440 <dfn>supports_declaration_condition</dfn>
441 : '(' <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>declaration</i></a> ')'
442 ;
444 <dfn>general_enclosed</dfn>
445 : ( <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>FUNCTION</i></a> | '(' ) ( <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>any</i></a> | <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>unused</i></a> )* ')'
446 ;
447 </pre>
449 <p>
450 Implementations <strong>must</strong> parse ''@supports'' rules
451 based on the above grammar,
452 and when interpreting the above grammar,
453 <strong>must</strong> match the production before an <code>|</code> operator
454 in preference to the one after it.
455 </p>
457 <p>
458 The above grammar is purposely very loose for forwards-compatibility reasons,
459 since the <code>general_enclosed</code> production
460 allows for substantial future extensibility.
461 Any ''@supports'' rule that does not parse according to the grammar above
462 (that is, a rule that does not match this loose grammar
463 which includes the <code>general_enclosed</code> production)
464 is invalid.
465 Style sheets <strong>must not</strong> use such a rule and
466 processors <strong>must</strong> ignore such a rule (including all of its contents).
468 <p>Each of these grammar terms is associated with a boolean result, as
469 follows:</p>
470 <dl>
471 <dt>supports_condition</dt>
472 <dd>
473 The result is the result of the single child term.
474 </dd>
476 <dt>supports_condition_in_parens</dt>
477 <dd>
478 The result is the result of the single <code>supports_condition</code>
479 or <code>supports_declaration_condition</code> child term.
480 </dd>
482 <dt>supports_negation</dt>
483 <dd>
484 The result is the <em>negation</em> of the result of the
485 <code>supports_condition_in_parens</code> child term.
486 </dd>
488 <dt>supports_conjunction</dt>
489 <dd>
490 The result is true if the result of <em>all</em> of the
491 <code>supports_condition_in_parens</code> child terms is true;
492 otherwise it is false.
493 </dd>
495 <dt>supports_disjunction</dt>
496 <dd>
497 The result is true if the result of <em>any</em> of the
498 <code>supports_condition_in_parens</code> child terms is true;
499 otherwise it is false.
500 </dd>
502 <dt>supports_declaration_condition</dt>
503 <dd>
504 The result is whether the CSS processor <a href="#support-definition">supports</a> the declaration
505 within the parentheses.
506 </dd>
508 <dt>general_enclosed</dt>
509 <dd>
510 The result is always false.
511 Additionally, style sheets <strong>must not</strong>
512 write ''@supports'' rules
513 that match this grammar production.
514 (In other words, this production exists only for future extensibility,
515 and is not part of the description of a valid style sheet
516 in this level of the specification.)
517 <span class="note">Note that future levels may define functions
518 or other parenthesized expressions that can evaluate to true.</span>
519 </dd>
520 </dl>
522 <p>The condition of the '@supports' rule is the result of the
523 <code>supports_condition</code> term that is a child of the
524 <code>supports_rule</code> term.</p>
526 <div class="example">
527 <p>For example, the following rule</p>
528 <pre>@supports ( display: flexbox ) {
529 body, #navigation, #content { display: flexbox; }
530 #navigation { background: blue; color: white; }
531 #article { background: white; color: black; }
532 }</pre>
533 <p>applies the rules inside the '@supports' rule only when
534 ''display: flexbox'' is supported.</p>
535 </div>
537 <div class="example">
538 <p>The following example shows an additional '@supports' rule that can
539 be used to provide an alternative for when ''display: flexbox'' is not
540 supported:</p>
541 <pre>@supports not ( display: flexbox ) {
542 body { width: 100%; height: 100%; background: white; color: black; }
543 #navigation { width: 25%; }
544 #article { width: 75%; }
545 }</pre>
546 <p>Note that the 'width' declarations may be harmful to the
547 flexbox-based layout, so it is important that they be present only in
548 the non-flexbox styles.</p>
549 </div>
551 <div class="example">
552 <p>The following example checks for support for the 'box-shadow'
553 property, including checking for support for vendor-prefixed versions of
554 it. When the support is present, it specifies both 'box-shadow' (with
555 the prefixed versions) and 'border' in a way what would cause the box to
556 become invisible were 'box-shadow' not supported.</p>
557 <pre>.noticebox {
558 border: 1px solid black;
559 padding: 1px;
560 }
561 @supports ( box-shadow: 0 0 2px black inset ) or
562 ( -moz-box-shadow: 0 0 2px black inset ) or
563 ( -webkit-box-shadow: 0 0 2px black inset ) or
564 ( -o-box-shadow: 0 0 2px black inset ) {
565 .noticebox {
566 -moz-box-shadow: 0 0 2px black inset;
567 -webkit-box-shadow: 0 0 2px black inset;
568 -o-box-shadow: 0 0 2px black inset;
569 box-shadow: 0 0 2px black inset; /* unprefixed last */
570 /* override the rule above the @supports rule */
571 border: none;
572 padding: 2px;
573 }
574 }</pre></div>
576 <p>To avoid confusion between ''and'' and ''or'', the syntax requires
577 that both ''and'' and ''or'' be specified explicitly (rather than, say,
578 using commas or spaces for one of them). Likewise, to avoid confusion
579 caused by precedence rules, the syntax does not allow ''and'', ''or'',
580 and ''not'' operators to be mixed without a layer of parentheses.</p>
582 <div class="example">
583 <p>For example, the following rule is not valid:
584 <pre class="illegal">@supports (transition-property: color) or
585 (animation-name: foo) and
586 (transform: rotate(10deg)) {
587 // ...
588 }</pre>
589 <p>Instead, authors must write one of the following:</p>
590 <pre>@supports ((transition-property: color) or
591 (animation-name: foo)) and
592 (transform: rotate(10deg)) {
593 // ...
594 }</pre>
595 <pre>@supports (transition-property: color) or
596 ((animation-name: foo) and
597 (transform: rotate(10deg))) {
598 // ...
599 }</pre>
600 </div>
602 <p>Furthermore, whitespace is required after a ''not'' and on both
603 sides of an ''and'' or ''or''.</p>
605 <p>The declaration being tested must always occur within parentheses,
606 when it is the only thing in the expression.<p>
608 <div class="example">
609 <p>For example, the following rule is not valid:
610 <pre class="illegal">@supports display: flexbox {
611 // ...
612 }</pre>
613 <p>Instead, authors must write:</p>
614 <pre>@supports (display: flexbox) {
615 // ...
616 }</pre>
617 </div>
619 <p>The syntax allows extra parentheses when they are not needed. This
620 flexibility is sometimes useful for authors (for example, when
621 commenting out parts of an expression) and may also be useful for
622 authoring tools.</p>
624 <div class="example">
625 <p>For example, authors may write:</p>
626 <pre>@supports ((display: flexbox)) {
627 // ...
628 }</pre>
629 </div>
631 <p>A trailing ''!important'' on a declaration being tested is allowed,
632 though it won't change the validity of the declaration.
634 <div class="example">
635 <p>For example, the following rule is valid:
636 <pre>@supports (display: flexbox !important) {
637 // ...
638 }</pre>
639 </div>
641 <h3 id="support-definition">Definition of support</h3>
643 <p>For forward-compatibility,
644 <a href="http://www.w3.org/TR/CSS21/syndata.html#declaration">section 4.1.8
645 (Declarations and properties)</a> of [[!CSS21]]
646 defines rules for handling invalid properties and values.
647 CSS processors that
648 do not implement or partially implement a specification
649 <strong>must</strong> treat any part of a value that they
650 do not implement, or
651 do not have a usable level of support for,
652 as invalid according to this rule
653 for handling invalid properties and values,
654 and therefore <strong>must</strong> discard the declaration as a parse error.</p>
656 <p>A CSS processor is considered to <dfn id="dfn-support">support</dfn>
657 a declaration (consisting of a property and value) if it accepts that
658 declaration (rather than discarding it as a parse error).
659 If a processor does not implement, with a usable level of support,
660 the value given,
661 then it <strong>must not</strong>
662 accept the declaration or claim support for it.</p>
664 <p class="note">Note that properties or values
665 whose support is effectively disabled by user preferences
666 are still considered as supported by this definition.
667 For example, if a user has enabled a high-contrast mode
668 that causes colors to be overridden,
669 the CSS processor is still considered to support the 'color' property
670 even though declarations of the 'color' property may have no effect.
671 On the other hand, a developer-facing preference
672 whose purpose is to enable or disable support for an experimental CSS feature
673 does affect this definition of support.</p>
675 <p>These rules (and the equivalence between them) allow
676 authors to use fallback (either in the [[CSS1]] sense of declarations
677 that are overridden by later declarations or with the new capabilities
678 provided by the ''@supports'' rule in this specification) that works
679 correctly for the features implemented. This applies especially to
680 compound values; implementations must implement all parts of the value
681 in order to consider the declaration supported, either inside a style rule
682 or in the declaration condition of an ''@supports'' rule.</p>
684 <!--
685 <h2 id="at-document">Document queries: the '@document' rule</h2>
687 <p>The <dfn>'@document' rule</dfn> is a conditional group
688 rule whose condition depends on the
689 <a href="#url-of-doc">URL of the document being styled</a>.
690 This allows style sheets, particularly user style sheets, to have styles
691 that only apply to a set of pages rather than to all pages using the
692 style sheet.</p>
694 <p class="issue">Given that this @-rule is intended primarily for user
695 style sheets, what should this specification say about its use in author
696 style sheets? Should it be forbidden? Should use instead be
697 discouraged? Or should this specification remain neutral on the
698 topic, since there are valid uses in author style sheets?</p>
700 <p id="url-of-doc">The <dfn>URL of the document being styled</dfn> is
701 the URI at which the document is located, excluding any fragment
702 identifiers. (This means, for example, that HTTP redirects have been
703 followed.) If the styles are being applied inside a complete document
704 embedded into the presentation of another (e.g., [[HTML5]]'s <code
705 class="html">iframe</code>, <code class="html">object</code>, or <code
706 class="html">img</code> elements), the relevant URI is that of the
707 frame, not of its container. However, if content from other documents
708 is mixed in via mechanisms that mix content from one document into
709 another (e.g., [[SVG11]]'s <code>use</code> element), then the
710 address of the container document is used.</p>
712 <p class="note">Note: In [[HTML5]], this is the
713 <a href="http://dev.w3.org/html5/spec/dom.html#documents">document's address</a>
714 of a document in a
715 <a href="http://dev.w3.org/html5/spec/browsers.html#browsing-context">browsing context</a>.</p>
717 <div class="issue">What form of normalization is done on URLs and domains
718 before matching? In particular, this specification needs to describe:
719 <ul>
720 <li>what form is used for the <a href="#url-of-doc">URL of the document
721 being styled</a> (and what has been normalized in that form)</li>
722 <li>what normalization (if any) happens to the argument of each of the match
723 functions before the comparison that they describe and</li>
724 <li>whether the
725 comparison algorithm used is string comparison or some other URL
726 comparison algorithm.</li></ul></div>
728 <p>The '@document' rule's condition is written as a
729 comma-separated list of <dfn>URL matching functions</dfn>, and the
730 condition evaluates to true whenever any one of those functions
731 evaluates to true. The following URL matching functions are
732 permitted:</p>
734 <dl>
735 <dt><dfn id="url-exact" title="url()|URL matching functions::exact"><url></dfn></dt>
737 <dd>
738 <p>The 'url()' function is the <dfn>exact url matching
739 function</dfn>. It evaluates to true whenever the <a
740 href="#url-of-doc">URL of the document being styled</a> is exactly
741 the URL given.</p>
743 <p class="Note">The 'url()' function, since it is a core syntax
744 element in CSS, is allowed (subject to different character
745 limitations and thus escaping requirements) to contain an unquoted
746 value (in addition to the string values that are allowed as
747 arguments for all four functions).</p>
749 <div class="example">
750 <p>For example, this rule:</p>
751 <pre>@document url("http://www.w3.org/Style/CSS/") {
752 #summary { background: yellow; color: black}
753 }</pre>
754 <p>styles the <code class="html">summary</code> element on the page
755 <code>http://www.w3.org/Style/CSS/</code>, but not on any other
756 pages.</p>
757 </div>
758 </dd>
760 <dt><dfn id="url-prefix" title="url-prefix()|URL matching functions::prefix">url-prefix(<string>)</dfn></dt>
762 <dd>
763 <p>The 'url-prefix()' function is the <dfn>url prefix
764 matching function</dfn>. It evaluates to true whenever the
765 <a href="#url-of-doc">URL of the document being styled</a>
766 has the argument to the function as an
767 initial substring (which is true when the two strings are equal).
768 When the argument is the empty string, it evaluates to true for all
769 documents.</p>
770 <div class="example">
771 <p>For example, this rule:</p>
772 <pre>@document url-prefix("http://www.w3.org/Style/CSS/") {
773 #summary { background: yellow; color: black}
774 }</pre>
775 <p>styles the <code class="html">summary</code> element on the page
776 <code>http://www.w3.org/Style/CSS/</code> and on the page
777 <code>http://www.w3.org/Style/CSS/Test</code>, but it does not
778 affect the page <code>http://www.w3.org/</code> or the page
779 <code>http://www.example.com/Style/CSS/</code>.</p>
780 </div>
781 </dd>
783 <dt><dfn id="url-domain" title="domain()|URL matching functions::domain">domain(<string>)</dfn></dt>
785 <dd>
786 <p>The 'domain()' function is the <dfn>domain
787 matching function</dfn>. It evaluates to true whenever
788 the <a href="#url-of-doc">URL of the document being styled</a>
789 has a host subcomponent (as defined in [[!URI]])
790 and that host subcomponent is exactly the argument to the
791 'domain()' function or a final substring of the host
792 component is a period (U+002E) immediately followed by the argument
793 to the 'domain()' function.</p>
794 <div class="example">
795 <p>For example, this rule:</p>
796 <pre>@document domain("w3.org") {
797 body { font-size: 16px ! important }
798 }</pre>
799 <p>changes the font size of the body element for pages such as
800 <code>http://www.w3.org/Style/CSS/</code> and
801 <code>http://w3.org/Style/CSS/</code> and
802 <code>http://lists.w3.org/Archives/Public/www-style/</code>
803 but it does not affect the page
804 <code>http://www.example.com/Style/CSS/</code>.</p>
805 </div>
806 </dd>
808 <dt><dfn id="url-regexp" title="regexp()|URL matching functions::regular expression">regexp(<string>)</dfn></dt>
810 <dd>
811 <p>The contents of the <string> argument <strong>must</strong>
812 match the JavaScript <code>Pattern</code> production
813 ([[!ECMA-262-5.1]], section 15.10.1). However,
814 failing to do so is not a CSS syntax error and does not trigger any
815 error handling for CSS syntax errors.</p>
817 <p>The ''regexp()'' function evaluates to true whenever the string
818 argument compiled as a JavaScript regular expression with the
819 <code>global</code>, <code>ignoreCase</code> and
820 <code>multiline</code> flags <em>disabled</em>
821 (see [[!ECMA-262-5.1]], sections 15.10.7.2 through 15.10.7.4)
822 compiles successfully and the resulting regular expression matches
823 the entirety of the
824 <a href="#url-of-doc">URL of the document being styled</a>.</p>
826 <p class="note">Note that regular expression must match the entire
827 URL, not just a part of it.</p>
829 <p class="note">Note that this definition intentionally matches the
830 behavior of the <a
831 href="http://dev.w3.org/html5/spec/common-input-element-attributes.html#attr-input-pattern"><code class="html">pattern</code>
832 attribute</a> on the <code class="html">input</code> element
833 in [[HTML5]].</p>
835 <div class="example">
836 <p>For example, this rule:</p>
837 <pre>@document regexp("http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/") {
838 body { font-size: 20px ! important }
839 }</pre>
840 <p>changes the font size of the body element for pages such as
841 <code>http://www.w3.org/TR/2011/PR-CSS2-20110412/</code>.</p>
842 <p class="note">Note that the backslashes in the regular
843 expression require CSS escaping as ''\\''.</p>
844 </div>
845 </dd>
847 </dl>
849 <p>Implementations <strong>must</strong> treat any unknown URL matching
850 functions as a syntax error, and thus ignore the '@document' rule.
851 <span class="issue">Should we instead have more complicated error
852 handling rules to make forward-compatibility work differently, or is
853 this rule the best solution for such future expansion anyway?</span></p>
855 <div class="issue">This syntax doesn't offer any ability to do negations,
856 which has been requested in <a
857 href="https://bugzilla.mozilla.org/show_bug.cgi?id=349813">Mozilla bug
858 349813</a>. Use cases that people have wanted negations for
859 include:
860 <ul>
861 <li>User style sheets that want a particular rule in general, but know
862 that that rule does more harm than good on specific sites.</li>
863 <li>Authors who have a rule that they want to apply to most of their
864 pages, but wish to make a few exceptions for.</li>
865 </ul>
866 </div>
868 <p>This extends the lexical scanner in the
869 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
870 ([[!CSS21]], Appendix G) by adding:
871 <pre>@{D}{O}{C}{U}{M}{E}{N}{T} {return DOCUMENT_SYM;}</pre>
872 <p>and the grammar by adding</p>
873 <pre><dfn>document_rule</dfn>
874 : DOCUMENT_SYM S+ <i>url_match_fn</i> ( "," S* <i>url_match_fn</i> )* <i>group_rule_body</i>
875 ;
877 <dfn>url_match_fn</dfn>
878 : (URI | FUNCTION S* STRING S* ')' ) S*
879 ;</pre>
880 -->
883 <h2 id="apis">APIs</h2>
885 <h3 id='extentions-to-cssrule-interface'>
886 Extensions to the <code>CSSRule</code> interface</h3>
888 <p>The <code>CSSRule</code> interface is extended as follows:
890 <pre class='idl'>partial interface CSSRule {
891 const unsigned short SUPPORTS_RULE = 12;
892 <!--
893 const unsigned short DOCUMENT_RULE = 13;
894 -->
895 }</pre>
898 <h3 id='the-cssgroupingrule-interface'>
899 The <code>CSSGroupingRule</code> interface</h3>
901 <p>The <dfn><code>CSSGroupingRule</code></dfn> interface represents an at-rule that contains other rules nested inside itself.
903 <pre class='idl'>interface CSSGroupingRule : CSSRule {
904 readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a> cssRules;
905 unsigned long insertRule (DOMString rule, unsigned long index);
906 void deleteRule (unsigned long index);
907 }</pre>
909 <dl class='idl-attributes'>
910 <dt><code>cssRules</code> of type <code><a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a></code>, readonly
911 <dd>The <code>cssRules</code> attribute must return a <code>CSSRuleList</code>
912 object for the list of CSS rules nested inside the grouping rule.
913 </dl>
915 <dl class='idl-methods'>
916 <dt><code>insertRule(DOMString rule, unsigned long index)</code>, returns
917 <code>unsigned long</code>
918 <dd>
919 The <code>insertRule</code> operation must
920 insert a CSS rule <var>rule</var>
921 into the CSS rule list returned by <code>cssRules</code>,
922 such that the inserted rule will be at position <var>index</var>,
923 and any rules previously at <var>index</var> or higher
924 will increase their index by one.
925 It must throw INDEX_SIZE_ERR
926 if index is greater than <code>cssRules.length</code>.
927 It must throw SYNTAX_ERR
928 if the rule has a syntax error and is unparseable;
929 this does not include syntax errors handled by error handling rules
930 for constructs inside of the rule,
931 but this does include cases where the string given
932 does not parse into a single CSS rule (such as when the string is empty)
933 or where there is anything other than whitespace or comments
934 after that single CSS rule.
935 It must throw HIERARCHY_REQUEST_ERR
936 if the rule cannot be inserted at the location specified,
937 for example, if an ''@import'' rule is inserted inside a group rule.
939 <p>The return value is the <var>index</var> parameter.
941 <dt><code>deleteRule (unsigned long index)</code>, return <code>void</code>
942 <dd>
943 The <code>deleteRule</code> operation must
944 remove a CSS rule from
945 the CSS rule list returned by <code>cssRules</code> at <var>index</var>.
946 It must throw INDEX_SIZE_ERR
947 if index is greater than or equal to <code>cssRules.length</code>.
948 </dl>
951 <h3 id="the-cssconditionrule-interface">
952 The <code>CSSConditionRule</code> interface</h3>
954 <p>The <dfn><code>CSSConditionRule</code></dfn> interface represents all the "conditional" at-rules,
955 which consist of a condition and a statement block.
957 <pre class='idl'>interface CSSConditionRule : CSSGroupingRule {
958 attribute DOMString conditionText;
959 }</pre>
961 <dl class='idl-attributes'>
963 <dt><code>conditionText</code> of type <code>DOMString</code>
964 <dd>
965 <p>The <code>conditionText</code> attribute represents
966 the condition of the rule.
967 Since what this condition does
968 varies between the derived interfaces of <code>CSSConditionRule</code>,
969 those derived interfaces
970 may specify different behavior for this attribute
971 (see, for example, <code>CSSMediaRule</code> below).
972 In the absence of such rule-specific behavior,
973 the following rules apply:</p>
975 <p>The <code>conditionText</code> attribute, on getting, must return
976 the result of serializing the associated condition.
978 <p>On setting the <code>conditionText</code> attribute these steps
979 must be run:
981 <ol>
982 <li>Trim the given value of white space.
983 <li>If the given value matches the grammar of the
984 appropriate condition production for the given rule,
985 replace the associated CSS condition with the given value.
986 <li>Otherwise, do nothing.
987 </ol>
988 </dl>
991 <h3 id="the-cssmediarule-interface">
992 The <code>CSSMediaRule</code> interface</h3>
994 <p>The <dfn><code>CSSMediaRule</code></dfn> interface represents a ''@media'' rule:
996 <pre class='idl'>interface CSSMediaRule : CSSConditionRule {
997 readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a> media;
998 }</pre>
1000 <dl class='idl-attributes'>
1001 <dt><code>media</code> of type <code><a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a></code>, readonly
1002 <dd>The <code>media</code> attribute must return a <code>MediaList</code> object
1003 for the list of media queries specified with the ''@media'' rule.
1005 <dt><code>conditionText</code> of type <code>DOMString</code> (CSSMediaRule-specific definition for attribute on CSSConditionRule)
1006 <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
1007 on getting, must return the value of <code>media.mediaText</code> on the rule.
1009 <p>Setting the <code>conditionText</code> attribute
1010 must set the <code>media.mediaText</code> attribute on the rule.
1011 </dl>
1014 <h3 id="the-csssupportsrule-interface">
1015 The <code>CSSSupportsRule</code> interface</h3>
1017 <p>The <dfn><code>CSSSupportsRule</code></dfn> interface represents a ''@supports'' rule.</p>
1019 <pre class='idl'>interface CSSSupportsRule : CSSConditionRule {
1020 }</pre>
1022 <dl class='idl-attributes'>
1023 <dt><code>conditionText</code> of type <code>DOMString</code> (CSSSupportsRule-specific definition for attribute on CSSConditionRule)
1024 <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
1025 on getting, must return the condition that was specified,
1026 without any logical simplifications,
1027 so that the returned condition will evaluate to the same result
1028 as the specified condition
1029 in any conformant implementation of this specification
1030 (including implementations that implement future extensions
1031 allowed by the <i>general_enclosed</i> exensibility mechanism in this specification).
1032 In other words,
1033 token stream simplifications are allowed
1034 (such as reducing whitespace to a single space
1035 or omitting it in cases where it is known to be optional),
1036 but logical simplifications (such as removal of unneeded parentheses,
1037 or simplification based on evaluating results) are not allowed.
1039 </dl>
1041 <!--
1042 <h3 id="the-cssdocumentrule-interface">
1043 The <code>CSSDocumentRule</code> interface</h3>
1045 <p>The <dfn><code>CSSDocumentRule</code></dfn> interface represents a ''@document'' rule.</p>
1047 <pre class='idl'>interface CSSDocumentRule : CSSConditionRule {
1048 }</pre>
1049 -->
1052 <h3 id='the-css-interface'>
1053 The <code>CSS</code> interface, and the <code title=''>supports()</code> function</h3>
1055 <p>The <dfn id='CSS-interface'><code>CSS</code></dfn> interface holds useful CSS-related functions that do not belong elsewhere.
1057 <pre class='idl'>interface CSS {
1058 static boolean supports(DOMString property, DOMString value);
1059 static boolean supports(DOMString conditionText);
1060 }</pre>
1062 <dl class='idl-methods'>
1063 <dt><code>supports(DOMString property, DOMString value)</code>,
1064 returns <code>boolean</code>
1065 <dt><code>supports(DOMString conditionText)</code>,
1066 returns <code>boolean</code>
1067 <dd>
1068 When the <code title=''>supports()</code> method is invoked with two arguments <var>property</var> and <var>value</var>,
1069 it must return <code>true</code> if <var>property</var> is a literal match for the name of a CSS property that the UA supports,
1070 and <var>value</var> would be successfully parsed as a supported value for that property.
1071 (Literal match means that no CSS escape processing is performed,
1072 and leading and trailing whitespace are not stripped,
1073 so any leading whitespace, trailing whitespace,
1074 or CSS escapes equivalent to the name of a property
1075 would cause the method to return <code>false</code>.)
1076 Otherwise, it must return <code>false</code>.
1078 <p>
1079 When invoked with a single <var>conditionText</var> argument,
1080 it must return <code>true</code> if <var>conditionText</var>,
1081 when parsed and evaluated as a <code>supports_condition</code>,
1082 would return true.
1083 Otherwise, it must return <code>false</code>.
1084 </dl>
1087 <h2 class=no-num id="grammar">Grammar</h2>
1089 <p>In order to allow these new @-rules in CSS style sheets, this
1090 specification modifies the <code>stylesheet</code> production in the <a
1091 href="http://www.w3.org/TR/CSS21/grammar.html">Appendix G</a> grammar of
1092 [[!CSS21]] by replacing the <code>media</code> production defined in
1093 [[!CSS21]] with the <code>media</code> production defined in this one,
1094 and additionally inserting <code>| supports_rule</code>
1095 alongside <code>ruleset | media | page</code>.</p>
1098 <h2 id="conformance">Conformance</h2>
1100 <h3 id="base-modules">Base Modules</h3>
1102 <p>This specification defines conformance in terms of base modules,
1103 which are modules that this specification builds on top of. The base
1104 modules of this module are:</p>
1106 <ul>
1107 <li>[[!CSS21]]</li>
1108 </ul>
1110 <p>All of the conformance requirements of all base modules are
1111 incorporated as conformance requirements of this module, except where
1112 overridden by this module.</p>
1114 <p>Additionally, all conformance requirements related to validity of
1115 syntax in this module and all of its base modules are to be interpreted
1116 as though all syntax in all of those modules is valid.</p>
1118 <div class="example"><p>For example, this means that grammar presented
1119 in modules other than [[!CSS21]] must obey the requirements that
1120 [[!CSS21]] defines for the parsing of properties, and that requirements
1121 for handling invalid syntax in [[!CSS21]] do not treat syntax added by
1122 other modules as invalid.</p></div>
1124 <p>Additionally, the set of valid syntax can be increased by the
1125 conformance of a style sheet or processor to additional modules; use of
1126 such syntax does not make a style sheet nonconformant and failure to
1127 treat such syntax as invalid does not make a processor
1128 nonconformant.</p>
1130 <h3 id="conformance-classes">Conformance Classes</h3>
1132 <p>Conformance to the CSS Conditional Rules Module is defined for three
1133 conformance classes:
1134 <dl>
1135 <dt><dfn title="conformance::style sheet" id="conform-style-sheet">style sheet</dfn>
1136 <dd>A <a href="http://www.w3.org/TR/CSS21/conform.html#style-sheet">CSS
1137 style sheet</a>.</dd>
1138 <dt><dfn title="conformance::processor" id="conform-processor">processor</dfn></dt>
1139 <dd>A tool that reads CSS style sheets: it may be a renderer or
1140 <a
1141 href="http://www.w3.org/TR/CSS21/conform.html#user-agent">user-agent</a>
1142 that interprets the semantics of a style sheet and renders
1143 documents that use style sheets, or it may be a validator that
1144 checks style sheets.</dd>
1145 <dt><dfn title="conformance::authoring tool" id="conform-authoring-tool">authoring tool</dfn></dt>
1146 <dd>A tool that writes a style sheet.</dd>
1147 </dl>
1149 <p>A style sheet is conformant to the CSS Conditional Rules Module
1150 if it meets all of the conformance requirements in the module that are
1151 described as requirements of style sheets.</p>
1153 <p>A processor is conformant to the CSS Conditional Rules Module if it
1154 meets all applicable conformance requirements in the module that are
1155 described as requirements of processors. In general, all requirements
1156 are applicable to renderers. Requirements concerning a part of CSS
1157 not performed by a processor are not applicable, e.g., requirements
1158 related to rendering are not applicable to a validator. The inability
1159 of a processor to correctly render a document due to limitations of
1160 the device does not make it non-conformant. (For example, a renderer
1161 is not required to render color on a monochrome monitor.)</p>
1163 <p>An authoring tool is conformant to the CSS Conditional Rules Module
1164 if it writes style sheets that conform to the module and (if it reads
1165 CSS) it is a conformant processor.</p>
1167 <h3 id="partial">
1168 Partial Implementations</h3>
1170 <p>So that authors can exploit the forward-compatible parsing rules to
1171 assign fallback values, CSS renderers <strong>must</strong>
1172 treat as invalid (and <a href="http://www.w3.org/TR/CSS21/conform.html#ignore">ignore
1173 as appropriate</a>) any at-rules, properties, property values, keywords,
1174 and other syntactic constructs for which they have no usable level of
1175 support. In particular, user agents <strong>must not</strong> selectively
1176 ignore unsupported component values and honor supported values in a single
1177 multi-value property declaration: if any value is considered invalid
1178 (as unsupported values must be), CSS requires that the entire declaration
1179 be ignored.</p>
1181 <h3 id="experimental">Experimental Implementations</h3>
1183 <p>To avoid clashes with future CSS features, the CSS specifications
1184 reserve a <a href="http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords">prefixed
1185 syntax</a> for proprietary property and value extensions to CSS. The CSS
1186 Working Group recommends that experimental implementations of features in
1187 CSS Working Drafts also use vendor-prefixed property or value names. This
1188 avoids any incompatibilities with future changes in the draft. Once a
1189 specification reaches the Candidate Recommendation stage, implementors
1190 should implement the non-prefixed syntax for any feature they consider to
1191 be correctly implemented according to spec.</p>
1193 <h3 id="cr-exit-criteria">CR Exit Criteria</h3>
1195 <p>For this specification to be advanced to Proposed Recommendation,
1196 there must be at least two independent, interoperable implementations
1197 of each feature. Each feature may be implemented by a different set of
1198 products, there is no requirement that all features be implemented by
1199 a single product. For the purposes of this criterion, we define the
1200 following terms:
1202 <dl>
1203 <dt>independent <dd>each implementation must be developed by a
1204 different party and cannot share, reuse, or derive from code
1205 used by another qualifying implementation. Sections of code that
1206 have no bearing on the implementation of this specification are
1207 exempt from this requirement.
1209 <dt>interoperable <dd>passing the respective test case(s) in the
1210 official CSS test suite, or, if the implementation is not a Web
1211 browser, an equivalent test. Every relevant test in the test
1212 suite should have an equivalent test created if such a user
1213 agent (UA) is to be used to claim interoperability. In addition
1214 if such a UA is to be used to claim interoperability, then there
1215 must one or more additional UAs which can also pass those
1216 equivalent tests in the same way for the purpose of
1217 interoperability. The equivalent tests must be made publicly
1218 available for the purposes of peer review.
1220 <dt>implementation <dd>a user agent which:
1222 <ol class=inline>
1223 <li>implements the specification.
1225 <li>is available to the general public. The implementation may
1226 be a shipping product or other publicly available version
1227 (i.e., beta version, preview release, or “nightly build”).
1228 Non-shipping product releases must have implemented the
1229 feature(s) for a period of at least one month in order to
1230 demonstrate stability.
1232 <li>is not experimental (i.e., a version specifically designed
1233 to pass the test suite and is not intended for normal usage
1234 going forward).
1235 </ol>
1236 </dl>
1238 <p>The specification will remain Candidate Recommendation for at least
1239 six months.
1241 <h2 id="changes">
1242 Changes</h2>
1244 <p>The following (non-editorial) changes were made to this specification since the
1245 <a href="http://www.w3.org/TR/2012/WD-css3-conditional-20121213/">13 December 2012 Working Draft</a>:
1247 <ul>
1248 <li>Require whitespace around ''and'' and ''or'' and after ''not''.
1249 <li>Add note explaining that user preferences that effectively disable a property (e.g., high-contrast mode disabling colors) do not effect the definition of support.
1250 <li>Describe requirements for conditionText getter on CSSSupportsRule.
1251 <li>Clarify the definition of "literal match" in CSS.supports().
1252 <li>Specify behavior of CSSGroupingRule.insertRule when given an empty string or more than one syntactically valid rule.
1253 </ul>
1255 <h2 class=no-num id="acknowledgments">Acknowledgments</h2>
1257 <p>
1258 Thanks to the ideas and feedback from
1259 Tab Atkins,
1260 Arthur Barstow,
1261 Ben Callahan,
1262 <span lang="tr">Tantek Çelik</span>,
1263 Alex Danilo,
1264 Elika Etemad,
1265 Pascal Germroth,
1266 <span lang="de">Björn Höhrmann</span>,
1267 Paul Irish,
1268 Brad Kemper,
1269 <span lang="nl">Anne van Kesteren</span>,
1270 Vitor Menezes,
1271 Alex Mogilevsky,
1272 Chris Moschini,
1273 James Nurthen,
1274 Simon Pieters,
1275 <span lang="fr">Florian Rivoal</span>,
1276 <span lang="fr">Simon Sapin</span>,
1277 Nicholas Shanks,
1278 Ben Ward,
1279 Zack Weinberg,
1280 Estelle Weyl,
1281 Boris Zbarsky,
1282 and all the rest of the <a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a> community.
1284 </p>
1286 <h2 class=no-num id="references">References</h2>
1289 <h3 class="no-num" id="normative-references">Normative references</h3>
1290 <!--normative-->
1292 <h3 class="no-num" id="other-references">Other references</h3>
1293 <!--informative-->
1295 <h2 class="no-num" id="index">Index</h2>
1296 <!--index-->
1298 </body>
1299 </html>
1300 <!-- Keep this comment at the end of the file
1301 Local variables:
1302 mode: sgml
1303 sgml-declaration:"~/SGML/HTML4.decl"
1304 sgml-default-doctype-name:"html"
1305 sgml-minimize-attributes:t
1306 sgml-nofill-elements:("pre" "style" "br")
1307 sgml-live-element-indicator:t
1308 sgml-omittag:nil
1309 sgml-shorttag:nil
1310 sgml-namecase-general:t
1311 sgml-general-insert-case:lower
1312 sgml-always-quote-attributes:t
1313 sgml-indent-step:nil
1314 sgml-indent-data:t
1315 sgml-parent-document:nil
1316 sgml-exposed-tags:nil
1317 sgml-local-catalogs:nil
1318 sgml-local-ecat-files:nil
1319 End:
1320 -->