css3-conditional/Overview.src.html

Wed, 06 Feb 2013 13:40:30 -0700

author
L. David Baron <dbaron@dbaron.org>
date
Wed, 06 Feb 2013 13:40:30 -0700
changeset 7374
34b185ae3bac
parent 7373
ab8be4484fdb
child 7381
06244e910e27
permissions
-rw-r--r--

[css3-conditional] Require whitespace around 'and' and 'or' and after 'not'.

Resolves last call issue 2.

As resolved in http://lists.w3.org/Archives/Public/www-style/2012Dec/0330.html

     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 <!--
    11   <script src="http://test.csswg.org/harness/annotate.js#CSS3-CONDITIONAL_DEV" 
    12         type="text/javascript" defer></script
    13 -->
    14 </head>
    16 <div class="head">
    17 <!--logo-->
    19 <h1>CSS Conditional Rules Module Level 3</h1>
    21 <h2 class="no-num no-toc">[LONGSTATUS] [DATE]</h2>
    22 <dl>
    23   <dt>This version:
    24     <dd><a href="[VERSION]">
    25     http://www.w3.org/TR/[YEAR]/ED-css3-conditional-[CDATE]/</a>
    27   <dt>Latest version:
    28     <dd><a href="http://www.w3.org/TR/[SHORTNAME]/">http://www.w3.org/TR/[SHORTNAME]/</a>
    30   <dt>Editor's draft:
    31     <dd><a href="http://dev.w3.org/csswg/[SHORTNAME]/">http://dev.w3.org/csswg/[SHORTNAME]/</a>
    33   <dt>Previous version:
    34     <dd><a href="http://www.w3.org/TR/2012/WD-css3-conditional-20120911/">http://www.w3.org/TR/2012/WD-css3-conditional-20120911/</a></dd>
    36   <dt>Editors:
    37     <dd class=vcard><a class=fn href="http://dbaron.org/">L. David Baron</a>,
    38       <a class=org href="http://www.mozilla.org/">Mozilla</a>
    40   <dt>Issues list:
    41     <dd>Maintained in document (only editor's draft is current)
    43     <dt>Feedback:
    45     <dd><a
    46      href="http://lists.w3.org/Archives/Public/www-style/">www-style@w3.org</a>
    47      with subject line “<kbd>&#x5b;[SHORTNAME]&#x5d; <var>… message topic
    48      …</var></kbd>”
    50   <dt>Test suite:
    51     <dd><a href="https://test.csswg.org/shepherd/search/spec/css3-conditional/">submitted tests</a>; no built test suite yet
    53 </dl>
    55 <!--copyright-->
    57 <hr title="Separator for header">
    58 </div>
    60 <h2 class="no-num no-toc" id="abstract">Abstract</h2>
    62   <p>CSS is a language for describing the rendering of structured documents
    63   (such as HTML and XML) on screen, on paper,  in speech, etc. This module
    64   contains the features of CSS for conditional processing of parts of
    65   style sheets, conditioned on capabilities of the processor or the
    66   document the style sheet is being applied to.
    67   It includes and extends the functionality of CSS level&nbsp;2 [[!CSS21]],
    68   which builds on CSS level&nbsp;1 [[CSS1]].
    69   The main extensions compared to level&nbsp;2 are
    70   allowing nesting of certain at-rules inside '@media',
    71   and the addition of the '@supports'
    72   rule for conditional processing.
    74 <h2 class="no-num no-toc" id="status">Status of this document</h2>
    76 <!--status-->
    78 <p>The following features are at risk:
    79 <ul>
    80   <li>The inclusion of '@font-face' rules and
    81   '@keyframes' rules as allowed within all of the @-rules in
    82   this specification is at risk, though only because of the relative
    83   rates of advancement of specifications.  If this specification is able
    84   to advance faster than one or both of the specifications defining
    85   those rules, then the inclusion of those rules will move from this
    86   specification to the specification defining those rules.</li>
    88   <li>The addition of support for @-rules inside of conditional grouping
    89   rules is at risk; if interoperable implementations are not found, it
    90   may be removed to advance the other features in this specification to
    91   Proposed Recommendation.</li>
    93   <li>The '@supports' rule is at risk; if interoperable
    94   implementations are not found, it may be removed to advance the other
    95   features in this specification to Proposed Recommendation.</li>
    96 </ul>
    98 <p>This is a <strong>Last Call Working Draft</strong>.
    99 The deadline for comments is <strong>10 January 2013</strong>.
   101 <!--
   103   Things to go in level 4:
   105   * Create some way to put these new conditional things on an @import.
   106   * The @document rule (commented out, down below).
   108 -->
   110 <h2 class="no-num no-toc" id="contents">Table of contents</h2>
   112 <!--toc-->
   114 <h2 id="introduction">Introduction</h2>
   116 <h3 id="context">Background</h3>
   118   <p><em>This section is not normative.</em>
   120   <p>[[!CSS21]] defines one type of conditional group rule, the
   121   '@media' rule, and allows only rulesets (not other @-rules)
   122   inside of it.  The '@media' rule provides the ability to
   123   have media-specific style sheets, which is also provided by style
   124   sheet linking features such as '@import' and
   125   <code class="html">&lt;link&gt;</code>.  The restrictions on the contents of
   126   '@media' rules made them less useful; they have forced authors
   127   using CSS features involving @-rules in media-specific style sheets to
   128   use separate style sheets for each medium.</p>
   130   <p>This specification extends the rules for the contents of
   131   conditional group rules to allow other @-rules, which enables authors
   132   to combine CSS features involving @-rules with media specific style
   133   sheets within a single style sheet.</p>
   135   <p>This specification also defines an additional type of conditional
   136   group rule, '@supports', to
   137   address author and user requirements.</p>
   139   <p>The '@supports' rule allows CSS to be conditioned on
   140   implementation support for CSS properties and values.  This rule makes
   141   it much easier for authors to use new CSS features and provide good
   142   fallback for implementations that do not support those features.  This
   143   is particularly important for CSS features that provide new layout
   144   mechanisms, and for other cases where a set of related styles needs to
   145   be conditioned on property support.</p>
   147 <h3 id="placement">Module Interactions</h3>
   149   <p>This module replaces and extends the '@media' rule
   150   feature defined in [[!CSS21]] section <var>7.2.1</var> and
   151   incorporates the modifications previously made non-normatively by
   152   [[!MEDIAQ]] section <var>1</var>.</p>
   154   <p>Its current definition depends on @-rules defined in [[!CSS3-FONTS]]
   155   and [[!CSS3-ANIMATIONS]], but that dependency is only on the
   156   assumption that those modules will advance ahead of this one.  If this
   157   module advances faster, then the dependency will be reversed.</p>
   159 <h3 id="conventions">Document Conventions</h3>
   161   <p>Conformance requirements are expressed with a combination of
   162   descriptive assertions and RFC 2119 terminology. The key words “MUST”,
   163   “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
   164   “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this
   165   document are to be interpreted as described in RFC 2119.
   166   However, for readability, these words do not appear in all uppercase
   167   letters in this specification.
   169   <p>All of the text of this specification is normative except sections
   170   explicitly marked as non-normative, examples, and notes. [[!RFC2119]]</p>
   172   <p>Examples in this specification are introduced with the words “for example”
   173   or are set apart from the normative text with
   174   <code class="html">class="example"</code>, like this:
   176   <div class="example">
   177     <p>This is an example of an informative example.</p>
   178   </div>
   180   <p>Informative notes begin with the word “Note” and are set apart from the
   181   normative text with <code class="html">class="note"</code>, like this:
   183   <p class="note">Note, this is an informative note.</p>
   185 <h2 id="processing">Processing of conditional group rules</h2>
   187 <p>This specification defines some CSS @-rules, called <dfn>conditional
   188 group rules</dfn>, that associate a condition with a group of other
   189 CSS rules.  These different rules allow testing different types of
   190 conditions, but share common behavior for how their contents are used
   191 when the condition is true and when the condition is false.</p>
   193 <div class="example">
   194 <p>For example, this rule:</p>
   195 <pre>@media print {
   196   #navigation { display: none }
   197 }</pre>
   198 <p>causes a particular CSS rule (making elements with ID "navigation" be
   199 display:none) apply only when the style sheet is used for a print
   200 medium.
   201 </div>
   203 <p>Each conditional group rule has a condition, which at any time
   204 evaluates to true or false.  When the condition is true, CSS processors
   205 <strong>must</strong> apply the rules inside the group rule as though
   206 they were at the group rule's location; when the condition is false, CSS
   207 processors <strong>must not</strong> apply any of rules inside the group
   208 rule.  The current state of the condition does not affect the CSS object
   209 model, in which the contents of the group rule always remain within the
   210 group rule.</p>
   212 <p>This means that when multiple conditional group rules are nested,
   213 a rule inside of both of them applies only when all of the rules'
   214 conditions are true.</p>
   216 <div class="example">For example, with this set of nested rules:
   217 <pre>@media print { // rule (1)
   218   #navigation { display: none }
   219   @media (max-width: 12cm) { // rule (2)
   220     .note { float: none }
   221   }
   222 }</pre>
   223 the condition of the rule marked (1) is true for print media, and the
   224 condition of the rule marked (2) is true when the width of the display
   225 area (which for print media is the page box) is less than or equal to
   226 12cm.  Thus the rule ''#navigation { display: none }'' applies
   227 whenever this style sheet is applied to print media, and the rule
   228 ''.note { float: none }'' is applied only when the style sheet
   229 is applied to print media <em>and</em> the width of the page box is less
   230 than or equal to 12 centimeters.</div>
   232 <p>When the condition for a conditional group rule changes, CSS
   233 processors <strong>must</strong> reflect that the rules now apply or no
   234 longer apply, except for properties whose definitions define effects of
   235 computed values that persist past the lifetime of that value (such as
   236 for some properties in [[CSS3-TRANSITIONS]] and
   237 [[!CSS3-ANIMATIONS]]).</p>
   239 <h2 id="contents-of">Contents of conditional group rules</h2>
   241 <p>The syntax of each conditional group rule consists of some syntax
   242 specific to the type of rule followed by a <dfn>group rule body</dfn>,
   243 which is a block (pair of braces) containing a sequence of rules.</p>
   245 <p>A group rule body is allowed to contain rulesets and any @-rules that
   246 are allowed at the top level of a style sheet before and after a
   247 ruleset.  This means that @-rules that must occur at the beginning of
   248 the style sheet (such as '@charset', '@import',
   249 and '@namespace' rules) are not allowed inside of conditional group
   250 rules.  Conditional group rules can be nested.</p>
   252 <p>In terms of the grammar, this specification defines the following
   253 productions for use in the grammar of conditional group rules:</p>
   255 <pre><dfn>nested_statement</dfn>
   256   : ruleset | <i>media</i> | page | font_face_rule | keyframes_rule |
   257     <i>supports_rule</i>
   258   ;
   260 <dfn>group_rule_body</dfn>
   261   : '{' S* <i>nested_statement</i>* '}' S*
   262   ;</pre>
   263 <p>
   264 in which all the productions are defined in that grammar with the
   265 exception of <code>font_face_rule</code> 
   266 defined in [[!CSS3-FONTS]], <code>keyframes_rule</code> defined in
   267 [[!CSS3-ANIMATIONS]], and <code>media</code> and <code>supports_rule</code>
   268 defined in this specification.</p>
   270 <p>In general, future CSS specifications that add new @-rules that are
   271 not forbidden to occur after some other types of rules should modify
   272 this <code>nested_statement</code> production to keep the grammar
   273 accurate.</p>
   275 <p>Style sheets <strong>must not</strong> use rules other than the allowed ones inside
   276 conditional group rules.</p>
   278 <p>CSS processors <strong>must</strong> ignore rules that are not
   279 allowed within a group rule, and <strong>must</strong> handle invalid
   280 rules inside of group rules as described in <a
   281 href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors">section
   282 4.2 (Rules for handling parsing errors)</a>, <a
   283 href="http://www.w3.org/TR/CSS21/syndata.html#at-rules">section 4.1.5
   284 (At-rules)</a>, and <a
   285 href="http://www.w3.org/TR/CSS21/syndata.html#rule-sets">section 4.1.7
   286 (Rule sets, declaration blocks, and selectors)</a> of [[!CSS21]].</p>
   288 <h2 id="use">Placement of conditional group rules</h2>
   290 <p>Conditional group rules are allowed at the top-level of a style
   291 sheet, and inside other conditional group rules.  CSS processors
   292 <strong>must</strong> process such rules as <a
   293 href="#processing">described above</a>.</p>
   295 <p>Any rules that are not allowed after a ruleset (e.g., ''@charset'',
   296 ''@import'', or ''@namespace'' rules) are also not allowed after a
   297 conditional group rule.  Therefore, style sheets <strong>must
   298 not</strong> place such rules after a conditional group rules, and CSS
   299 processors <strong>must</strong> ignore such rules.</p>
   301 <h2 id="at-media">Media-specific style sheets:  the '@media' rule</h2>
   303 <p>The <dfn>'@media' rule</dfn> is a conditional group rule whose
   304 condition is a media query.  It consists of the at-keyword
   305 '@media' followed by a (possibly empty) media query list (as
   306 defined in [[!MEDIAQ]]), followed by a group rule body.  The condition
   307 of the rule is the result of the media query.</p>
   309 <div class="example">
   310 <p>This '@media' rule:</p>
   311 <pre>@media print, (max-width: 600px) {
   312   #extra_navigation { display: none }
   313 }</pre>
   314 <p>has the condition ''print, (max-width: 600px)'', which is
   315 true for print media and for devices whose width is at most 600px.  When
   316 either of these is true, the condition of the rule is true, and the rule
   317 ''#extra_navigation { display: none }'' is applied.
   318 </div>
   320 <p>In terms of the grammar, this specification extends the
   321 <code>media</code> production in the
   322 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
   323 ([[!CSS21]], Appendix G) into:
   324 <pre><dfn>media</dfn>
   325   : MEDIA_SYM S* media_query_list <i>group_rule_body</i>
   326   ;</pre>
   327 <p>where the <code>group_rule_body</code> production is defined in this
   328 specification, the <code>media_query_list</code> production is defined
   329 in [[!MEDIAQ]], and the others are defined in the <a
   330 href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
   331 ([[!CSS21]], Appendix G).
   333 <h2 id="at-supports">Feature queries: the '@supports' rule</h2>
   335 <p>The <dfn>'@supports' rule</dfn> is a conditional group
   336 rule whose condition tests whether the user agent supports CSS
   337 property:value pairs.  Authors can use it to write style sheets that use
   338 new features when available but degrade gracefully when those features
   339 are not supported.  CSS has existing mechanisms for graceful
   340 degradation, such as ignoring unsupported properties or values, but
   341 these are not always sufficient when large groups of styles need to be
   342 tied to the support for certain features, as is the case for use of new
   343 layout system features.</p>
   345 <p>The syntax of the condition in the '@supports' rule is
   346 slightly more complicated than for the other conditional group rules
   347 (though has some similarities to media queries) since:</p>
   348 <ul>
   349   <li>negation is needed so that the new-feature styles and the fallback
   350   styles can be separated (within the forward-compatible grammar's rules
   351   for the syntax of @-rules), and not required to override each other</li>
   352   <li>conjunction (and) is needed so that multiple required features can
   353   be tested</li>
   354   <li>disjunction (or) is needed when there are multiple alternative
   355   features for a set of styles, particularly when some of those
   356   alternatives are vendor-prefixed properties or values</li>
   357 </ul>
   359 <p>Therefore, the syntax of the '@supports' rule allows
   360 testing for property:value pairs, and arbitrary conjunctions (and),
   361 disjunctions (or), and negations (not) of them.</p>
   363 <p>This extends the lexical scanner in the
   364 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
   365 ([[!CSS21]], Appendix G) by adding:
   366 <pre>
   367 @{S}{U}{P}{P}{O}{R}{T}{S} {return SUPPORTS_SYM;}
   368 {O}{R}                    {return OR;}
   369 </pre>
   371 <p>and the grammar by adding</p>
   373 <pre><dfn>supports_rule</dfn>
   374   : SUPPORTS_SYM S* <i>supports_condition</i> S* <i>group_rule_body</i>
   375   ;
   377 <dfn>supports_condition</dfn>
   378   : <i>supports_negation</i> | <i>supports_conjunction</i> | <i>supports_disjunction</i> |
   379     <i>supports_condition_in_parens</i>
   380   ;
   382 <dfn>supports_condition_in_parens</dfn>
   383   : ( '(' S* <i>supports_condition</i> S* ')' ) | <i>supports_declaration_condition</i> |
   384     <i>general_enclosed</i>
   385   ;
   387 <dfn>supports_negation</dfn>
   388   : NOT S+ <i>supports_condition_in_parens</i>
   389   ;
   391 <dfn>supports_conjunction</dfn>
   392   : <i>supports_condition_in_parens</i> ( S+ AND S+ <i>supports_condition_in_parens</i> )+
   393   ;
   395 <dfn>supports_disjunction</dfn>
   396   : <i>supports_condition_in_parens</i> ( S+ OR S+ <i>supports_condition_in_parens</i> )+
   397   ;
   399 <dfn>supports_declaration_condition</dfn>
   400   : '(' S* declaration ')'
   401   ;
   403 <dfn>general_enclosed</dfn>
   404   : ( FUNCTION | '(' ) ( any | unused )* ')'
   405   ;
   406 </pre>
   408 <p>in which <code>declaration</code>, <code>any</code>, and
   409 <code>unused</code> are the productions in the core syntax of CSS
   410 defined in <a
   411 href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">section
   412 4.1.1 (Tokenization)</a> of [[!CSS21]],
   413 and the <code>AND</code> and <code>NOT</code> tokens are defined in
   414 the Media Queries specification [[!MEDIAQ]].</p>
   416 <p>
   417   Implementations <strong>must</strong> parse ''@supports'' rules
   418   based on the above grammar,
   419   and when interpreting the above grammar,
   420   <strong>must</strong> match the production before an <code>|</code> operator
   421   in preference to the one after it.
   422 </p>
   424 <p>
   425   The above grammar is purposely very loose for forwards-compatibility reasons,
   426   since the <code>general_enclosed</code> production
   427   allows for substantial future extensibility.
   428   Any ''@supports'' rule that does not parse according to the grammar above
   429   (that is, a rule that does not match this loose grammar
   430   which includes the general_enclosed production)
   431   is invalid.
   432   Style sheets <strong>must not</strong> use such a rule and
   433   processors <strong>must</strong> ignore such a rule (including all of its contents).
   435 <p>Each of these grammar terms is associated with a boolean result, as
   436 follows:</p>
   437 <dl>
   438 <dt>supports_condition</dt>
   439 <dd>
   440   The result is the result of the single child term.
   441 </dd>
   443 <dt>supports_condition_in_parens</dt>
   444 <dd>
   445   The result is the result of the single <code>supports_condition</code>
   446   or <code>supports_declaration_condition</code> child term.
   447 </dd>
   449 <dt>supports_negation</dt>
   450 <dd>
   451   The result is the <em>negation</em> of the result of the
   452   <code>supports_condition_in_parens</code> child term.
   453 </dd>
   455 <dt>supports_conjunction</dt>
   456 <dd>
   457   The result is true if the result of <em>all</em> of the
   458   <code>supports_condition_in_parens</code> child terms is true;
   459   otherwise it is false.
   460 </dd>
   462 <dt>supports_disjunction</dt>
   463 <dd>
   464   The result is true if the result of <em>any</em> of the
   465   <code>supports_condition_in_parens</code> child terms is true;
   466   otherwise it is false.
   467 </dd>
   469 <dt>supports_declaration_condition</dt>
   470 <dd>
   471   The result is whether the CSS processor <a href="#support-definition">supports</a> the declaration
   472   within the parentheses.
   473 </dd>
   475 <dt>general_enclosed</dt>
   476 <dd>
   477   The result is always false.
   478   Additionally, style sheets <strong>must not</strong>
   479   write ''@supports'' rules
   480   that match this grammar production.
   481   (In other words, this production exists only for future extensibility,
   482   and is not part of the description of a valid style sheet
   483   in this level of the specification.)
   484   <span class="note">Note that future levels may define functions
   485   or other parenthesized expressions that can evaluate to true.</span>
   486 </dd>
   487 </dl>
   489 <p>The condition of the '@supports' rule is the result of the
   490 <code>supports_condition</code> term that is a child of the
   491 <code>supports_rule</code> term.</p>
   493 <div class="example">
   494 <p>For example, the following rule</p>
   495 <pre>@supports ( display: flexbox ) {
   496   body, #navigation, #content { display: flexbox; }
   497   #navigation { background: blue; color: white; }
   498   #article { background: white; color: black; }
   499 }</pre>
   500 <p>applies the rules inside the '@supports' rule only when
   501 ''display: flexbox'' is supported.</p>
   502 </div>
   504 <div class="example">
   505 <p>The following example shows an additional '@supports' rule that can
   506 be used to provide an alternative for when ''display: flexbox'' is not
   507 supported:</p>
   508 <pre>@supports not ( display: flexbox ) {
   509   body { width: 100%; height: 100%; background: white; color: black; }
   510   #navigation { width: 25%; }
   511   #article { width: 75%; }
   512 }</pre>
   513 <p>Note that the 'width' declarations may be harmful to the
   514 flexbox-based layout, so it is important that they be present only in
   515 the non-flexbox styles.</p>
   516 </div>
   518 <div class="example">
   519 <p>The following example checks for support for the 'box-shadow'
   520 property, including checking for support for vendor-prefixed versions of
   521 it.  When the support is present, it specifies both 'box-shadow' (with
   522 the prefixed versions) and 'color' in a way what would cause the text to
   523 become invisible were 'box-shadow' not supported.</p>
   524 <pre>@supports ( box-shadow: 2px 2px 2px black ) or
   525           ( -moz-box-shadow: 2px 2px 2px black ) or
   526           ( -webkit-box-shadow: 2px 2px 2px black ) or
   527           ( -o-box-shadow: 2px 2px 2px black ) {
   528   .outline {
   529     color: white;
   530     -moz-box-shadow: 2px 2px 2px black;
   531     -webkit-box-shadow: 2px 2px 2px black;
   532     -o-box-shadow: 2px 2px 2px black;
   533     box-shadow: 2px 2px 2px black; /* unprefixed last */
   534   }
   535 }</pre></div>
   537 <p>To avoid confusion between ''and'' and ''or'', the syntax requires
   538 that both ''and'' and ''or'' be specified explicitly (rather than, say,
   539 using commas or spaces for one of them).  Likewise, to avoid confusion
   540 caused by precedence rules, the syntax does not allow ''and'', ''or'',
   541 and ''not'' operators to be mixed without a layer of parentheses.</p>
   543 <div class="example">
   544 <p>For example, the following rule is not valid:
   545 <pre class="illegal">@supports (transition-property: color) or
   546           (animation-name: foo) and
   547           (transform: rotate(10deg)) {
   548   // ...
   549 }</pre>
   550 <p>Instead, authors must write one of the following:</p>
   551 <pre>@supports ((transition-property: color) or
   552            (animation-name: foo)) and
   553           (transform: rotate(10deg)) {
   554   // ...
   555 }</pre>
   556 <pre>@supports (transition-property: color) or
   557           ((animation-name: foo) and
   558            (transform: rotate(10deg))) {
   559   // ...
   560 }</pre>
   561 </div>
   563 <p>Furthermore, whitespace is required after a ''not'' and on both
   564 sides of an ''and'' or ''or''.</p>
   566 <p>The declaration being tested must always occur within parentheses,
   567 when it is the only thing in the expression.<p>
   569 <div class="example">
   570 <p>For example, the following rule is not valid:
   571 <pre class="illegal">@supports display: flexbox {
   572   // ...
   573 }</pre>
   574 <p>Instead, authors must write:</p>
   575 <pre>@supports (display: flexbox) {
   576   // ...
   577 }</pre>
   578 </div>
   580 <p>The syntax allows extra parentheses when they are not needed.  This
   581 flexibility is sometimes useful for authors (for example, when
   582 commenting out parts of an expression) and may also be useful for
   583 authoring tools.</p>
   585 <div class="example">
   586 <p>For example, authors may write:</p>
   587 <pre>@supports ((display: flexbox)) {
   588   // ...
   589 }</pre>
   590 </div>
   592 <p>A trailing ''!important'' on a declaration being tested is allowed,
   593 though it won't change the validity of the declaration.
   595 <div class="example">
   596 <p>For example, the following rule is valid:
   597 <pre>@supports (display: flexbox !important) {
   598   // ...
   599 }</pre>
   600 </div>
   602 <h3 id="support-definition">Definition of support</h3>
   604 <p>For forward-compatibility,
   605 <a href="http://www.w3.org/TR/CSS21/syndata.html#declaration">section 4.1.8
   606 (Declarations and properties)</a> of [[!CSS21]]
   607 defines rules for handling invalid properties and values.
   608 CSS processors that
   609 do not implement or partially implement a specification
   610 <strong>must</strong> treat any part of a value that they
   611 do not implement, or
   612 do not have a usable level of support for,
   613 as invalid according to this rule
   614 for handling invalid properties and values,
   615 and therefore <strong>must</strong> discard the declaration as a parse error.</p>
   617 <p>A CSS processor is considered to <dfn id="dfn-support">support</dfn>
   618 a declaration (consisting of a property and value) if it accepts that
   619 declaration (rather than discarding it as a parse error).
   620 If a processor does not implement, with a usable level of support,
   621 the value given,
   622 then it <strong>must not</strong>
   623 accept the declaration or claim support for it.</p>
   625 <p>These rules (and the equivalence between them) allow
   626 authors to use fallback (either in the [[CSS1]] sense of declarations
   627 that are overridden by later declarations or with the new capabilities
   628 provided by the ''@supports'' rule in this specification) that works
   629 correctly for the features implemented.  This applies especially to
   630 compound values; implementations must implement all parts of the value
   631 in order to consider the declaration supported, either inside a ruleset
   632 or in the declaration condition of an ''@supports'' rule.</p>
   634 <!--
   635 <h2 id="at-document">Document queries: the '@document' rule</h2>
   637 <p>The <dfn>'@document' rule</dfn> is a conditional group
   638 rule whose condition depends on the
   639 <a href="#url-of-doc">URL of the document being styled</a>.
   640 This allows style sheets, particularly user style sheets, to have styles
   641 that only apply to a set of pages rather than to all pages using the
   642 style sheet.</p>
   644 <p class="issue">Given that this @-rule is intended primarily for user
   645 style sheets, what should this specification say about its use in author
   646 style sheets?  Should it be forbidden?  Should use instead be
   647 discouraged?  Or should this specification remain neutral on the
   648 topic, since there are valid uses in author style sheets?</p>
   650 <p id="url-of-doc">The <dfn>URL of the document being styled</dfn> is
   651 the URI at which the document is located, excluding any fragment
   652 identifiers.  (This means, for example, that HTTP redirects have been
   653 followed.)  If the styles are being applied inside a complete document
   654 embedded into the presentation of another (e.g., [[HTML5]]&#39;s <code
   655 class="html">iframe</code>, <code class="html">object</code>, or <code
   656 class="html">img</code> elements), the relevant URI is that of the
   657 frame, not of its container.  However, if content from other documents
   658 is mixed in via mechanisms that mix content from one document into
   659 another (e.g., [[SVG11]]&#39;s <code>use</code> element), then the
   660 address of the container document is used.</p>
   662 <p class="note">Note:  In [[HTML5]], this is the
   663 <a href="http://dev.w3.org/html5/spec/dom.html#documents">document's address</a>
   664 of a document in a
   665 <a href="http://dev.w3.org/html5/spec/browsers.html#browsing-context">browsing context</a>.</p>
   667 <div class="issue">What form of normalization is done on URLs and domains
   668 before matching?  In particular, this specification needs to describe:
   669 <ul>
   670 <li>what form is used for the <a href="#url-of-doc">URL of the document
   671 being styled</a> (and what has been normalized in that form)</li>
   672 <li>what normalization (if any) happens to the argument of each of the match
   673 functions before the comparison that they describe and</li>
   674 <li>whether the
   675 comparison algorithm used is string comparison or some other URL
   676 comparison algorithm.</li></ul></div>
   678 <p>The '@document' rule's condition is written as a
   679 comma-separated list of <dfn>URL matching functions</dfn>, and the
   680 condition evaluates to true whenever any one of those functions
   681 evaluates to true.  The following URL matching functions are
   682 permitted:</p>
   684 <dl>
   685   <dt><dfn id="url-exact" title="url()|URL matching functions::exact">&lt;url&gt;</dfn></dt>
   687   <dd>
   688     <p>The 'url()' function is the <dfn>exact url matching
   689     function</dfn>.  It evaluates to true whenever the <a
   690     href="#url-of-doc">URL of the document being styled</a> is exactly
   691     the URL given.</p>
   693     <p class="Note">The 'url()' function, since it is a core syntax
   694     element in CSS, is allowed (subject to different character
   695     limitations and thus escaping requirements) to contain an unquoted
   696     value (in addition to the string values that are allowed as
   697     arguments for all four functions).</p>
   699     <div class="example">
   700       <p>For example, this rule:</p>
   701 <pre>@document url("http://www.w3.org/Style/CSS/") {
   702   #summary { background: yellow; color: black}
   703 }</pre>
   704       <p>styles the <code class="html">summary</code> element on the page
   705       <code>http://www.w3.org/Style/CSS/</code>, but not on any other
   706       pages.</p>
   707     </div>
   708   </dd>
   710   <dt><dfn id="url-prefix" title="url-prefix()|URL matching functions::prefix">url-prefix(&lt;string&gt;)</dfn></dt>
   712   <dd>
   713     <p>The 'url-prefix()' function is the <dfn>url prefix
   714     matching function</dfn>.  It evaluates to true whenever the
   715     <a href="#url-of-doc">URL of the document being styled</a>
   716     has the argument to the function as an
   717     initial substring (which is true when the two strings are equal).
   718     When the argument is the empty string, it evaluates to true for all
   719     documents.</p>
   720     <div class="example">
   721       <p>For example, this rule:</p>
   722 <pre>@document url-prefix("http://www.w3.org/Style/CSS/") {
   723   #summary { background: yellow; color: black}
   724 }</pre>
   725       <p>styles the <code class="html">summary</code> element on the page
   726       <code>http://www.w3.org/Style/CSS/</code> and on the page
   727       <code>http://www.w3.org/Style/CSS/Test</code>, but it does not
   728       affect the page <code>http://www.w3.org/</code> or the page
   729       <code>http://www.example.com/Style/CSS/</code>.</p>
   730     </div>
   731   </dd>
   733   <dt><dfn id="url-domain" title="domain()|URL matching functions::domain">domain(&lt;string&gt;)</dfn></dt>
   735   <dd>
   736     <p>The 'domain()' function is the <dfn>domain
   737     matching function</dfn>.  It evaluates to true whenever
   738     the <a href="#url-of-doc">URL of the document being styled</a>
   739     has a host subcomponent (as defined in [[!URI]])
   740     and that host subcomponent is exactly the argument to the
   741     'domain()' function or a final substring of the host
   742     component is a period (U+002E) immediately followed by the argument
   743     to the 'domain()' function.</p>
   744     <div class="example">
   745       <p>For example, this rule:</p>
   746 <pre>@document domain("w3.org") {
   747   body { font-size: 16px ! important }
   748 }</pre>
   749       <p>changes the font size of the body element for pages such as
   750       <code>http://www.w3.org/Style/CSS/</code> and
   751       <code>http://w3.org/Style/CSS/</code> and
   752       <code>http://lists.w3.org/Archives/Public/www-style/</code>
   753       but it does not affect the page
   754       <code>http://www.example.com/Style/CSS/</code>.</p>
   755     </div>
   756   </dd>
   758   <dt><dfn id="url-regexp" title="regexp()|URL matching functions::regular expression">regexp(&lt;string&gt;)</dfn></dt>
   760   <dd>
   761     <p>The contents of the &lt;string&gt; argument <strong>must</strong>
   762     match the JavaScript <code>Pattern</code> production
   763     ([[!ECMA-262-5.1]], section 15.10.1).  However,
   764     failing to do so is not a CSS syntax error and does not trigger any
   765     error handling for CSS syntax errors.</p>
   767     <p>The ''regexp()'' function evaluates to true whenever the string
   768     argument compiled as a JavaScript regular expression with the
   769     <code>global</code>, <code>ignoreCase</code> and
   770     <code>multiline</code> flags <em>disabled</em>
   771     (see [[!ECMA-262-5.1]], sections 15.10.7.2 through 15.10.7.4)
   772     compiles successfully and the resulting regular expression matches
   773     the entirety of the
   774     <a href="#url-of-doc">URL of the document being styled</a>.</p>
   776     <p class="note">Note that regular expression must match the entire
   777     URL, not just a part of it.</p>
   779     <p class="note">Note that this definition intentionally matches the
   780     behavior of the <a
   781     href="http://dev.w3.org/html5/spec/common-input-element-attributes.html#attr-input-pattern"><code class="html">pattern</code>
   782     attribute</a> on the <code class="html">input</code> element
   783     in [[HTML5]].</p>
   785     <div class="example">
   786       <p>For example, this rule:</p>
   787 <pre>@document regexp("http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/") {
   788   body { font-size: 20px ! important }
   789 }</pre>
   790       <p>changes the font size of the body element for pages such as
   791       <code>http://www.w3.org/TR/2011/PR-CSS2-20110412/</code>.</p>
   792       <p class="note">Note that the backslashes in the regular
   793       expression require CSS escaping as ''\\''.</p>
   794     </div>
   795   </dd>
   797 </dl>
   799 <p>Implementations <strong>must</strong> treat any unknown URL matching
   800 functions as a syntax error, and thus ignore the '@document' rule.
   801 <span class="issue">Should we instead have more complicated error
   802 handling rules to make forward-compatibility work differently, or is
   803 this rule the best solution for such future expansion anyway?</span></p>
   805 <div class="issue">This syntax doesn't offer any ability to do negations,
   806 which has been requested in <a
   807 href="https://bugzilla.mozilla.org/show_bug.cgi?id=349813">Mozilla bug
   808 349813</a>.  Use cases that people have wanted negations for
   809 include:
   810 <ul>
   811   <li>User style sheets that want a particular rule in general, but know
   812   that that rule does more harm than good on specific sites.</li>
   813   <li>Authors who have a rule that they want to apply to most of their
   814   pages, but wish to make a few exceptions for.</li>
   815 </ul>
   816 </div>
   818 <p>This extends the lexical scanner in the
   819 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
   820 ([[!CSS21]], Appendix G) by adding:
   821 <pre>@{D}{O}{C}{U}{M}{E}{N}{T}	{return DOCUMENT_SYM;}</pre>
   822 <p>and the grammar by adding</p>
   823 <pre><dfn>document_rule</dfn>
   824   : DOCUMENT_SYM S+ <i>url_match_fn</i> ( "," S* <i>url_match_fn</i> )* <i>group_rule_body</i>
   825   ;
   827 <dfn>url_match_fn</dfn>
   828   : (URI | FUNCTION S* STRING S* ')' ) S*
   829   ;</pre>
   830 -->
   833 <h2 id="apis">APIs</h2>
   835 <h3 id='extentions-to-cssrule-interface'>
   836 Extensions to the <code>CSSRule</code> interface</h3>
   838 <p>The <code>CSSRule</code> interface is extended as follows:
   840 <pre class='idl'>partial interface CSSRule {
   841     const unsigned short SUPPORTS_RULE = 12;
   842     <!--
   843     const unsigned short DOCUMENT_RULE = 13;
   844     -->
   845 }</pre>
   848 <h3 id='the-cssgroupingrule-interface'>
   849 The <code>CSSGroupingRule</code> interface</h3>
   851 <p>The <dfn><code>CSSGroupingRule</code></dfn> interface represents an at-rule that contains other rules nested inside itself.
   853 <pre class='idl'>interface CSSGroupingRule : CSSRule {
   854     readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a> cssRules;
   855     unsigned long insertRule (DOMString rule, unsigned long index);
   856     void deleteRule (unsigned long index);
   857 }</pre>
   859 <dl class='idl-attributes'>
   860   <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
   861   <dd>The <code>cssRules</code> attribute must return a <code>CSSRuleList</code>
   862     object for the list of CSS rules nested inside the grouping rule.
   863 </dl>
   865 <dl class='idl-methods'>
   866   <dt><code>insertRule(DOMString rule, unsigned long index)</code>, returns
   867     <code>unsigned long</code>
   868   <dd>
   869     The <code>insertRule</code> operation must
   870     insert a CSS rule <var>rule</var>
   871     into the CSS rule list returned by <code>cssRules</code>,
   872     such that the inserted rule will be at position <var>index</var>,
   873     and any rules previously at <var>index</var> or higher
   874     will increase their index by one.
   875     It must throw INDEX_SIZE_ERR
   876     if index is greater than <code>cssRules.length</code>.
   877     It must throw SYNTAX_ERR
   878     if the rule has a syntax error and is unparseable;
   879     this does not include syntax errors handled by error handling rules
   880     for constructs inside of the rule.
   881     It must throw HIERARCHY_REQUEST_ERR
   882     if the rule cannot be inserted at the location specified,
   883     for example, if an ''@import'' rule is inserted inside a group rule.
   885     <span class="issue">This needs to specify what to do
   886     if <code>rule</code> is the empty string,
   887     if it contains more than one CSS rule,
   888     or if it contains garbage after a valid rule.</span>
   890   <dt><code>deleteRule (unsigned long index)</code>, return <code>void</code>
   891   <dd>
   892     The <code>deleteRule</code> operation must
   893     remove a CSS rule from
   894     the CSS rule list returned by <code>cssRules</code> at <var>index</var>.
   895     It must throw INDEX_SIZE_ERR
   896     if index is greater than or equal to <code>cssRules.length</code>.
   897 </dl>
   900 <h3 id="the-cssconditionrule-interface">
   901 The <code>CSSConditionRule</code> interface</h3>
   903 <p>The <dfn><code>CSSConditionRule</code></dfn> interface represents all the "conditional" at-rules,
   904   which consist of a condition and a statement block.
   906 <pre class='idl'>interface CSSConditionRule : CSSGroupingRule {
   907     attribute DOMString conditionText;
   908 }</pre>
   910 <dl class='idl-attributes'>
   912   <dt><code>conditionText</code> of type <code>DOMString</code>
   913   <dd>
   914     <p>The <code>conditionText</code> attribute represents
   915     the condition of the rule.
   916     Since what this condition does
   917     varies between the derived interfaces of <code>CSSConditionRule</code>,
   918     those derived interfaces
   919     may specify different behavior for this attribute
   920     (see, for example, <code>CSSMediaRule</code> below).
   921     In the absence of such rule-specific behavior,
   922     the following rules apply:</p>
   924     <p>The <code>conditionText</code> attribute, on getting, must return
   925     the result of serializing the associated condition.
   927     <p>On setting the <code>conditionText</code> attribute these steps
   928       must be run:
   930     <ol>
   931       <li>Trim the given value of white space.
   932       <li>If the given value matches the grammar of the 
   933         appropriate condition production for the given rule, 
   934         replace the associated CSS condition with the given value.
   935       <li>Otherwise, do nothing.
   936     </ol>
   937 </dl>
   940 <h3 id="the-cssmediarule-interface">
   941 The <code>CSSMediaRule</code> interface</h3>
   943 <p>The <dfn><code>CSSMediaRule</code></dfn> interface represents a ''@media'' rule:
   945 <pre class='idl'>interface CSSMediaRule : CSSConditionRule {
   946     readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a> media;
   947 }</pre>
   949 <dl class='idl-attributes'>
   950   <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
   951   <dd>The <code>media</code> attribute must return a <code>MediaList</code> object
   952     for the list of media queries specified with the ''@media'' rule.
   954   <dt><code>conditionText</code> of type <code>DOMString</code>
   955   <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
   956     on getting, must return the value of <code>media.mediaText</code> on the rule.
   958     <p>Setting the <code>conditionText</code> attribute
   959       must set the <code>media.mediaText</code> attribute on the rule.
   960 </dl>
   963 <h3 id="the-csssupportsrule-interface">
   964 The <code>CSSSupportsRule</code> interface</h3>
   966 <p>The <dfn><code>CSSSupportsRule</code></dfn> interface represents a ''@supports'' rule.</p>
   968 <pre class='idl'>interface CSSSupportsRule : CSSConditionRule {
   969 }</pre>
   971 <!--
   972 <h3 id="the-cssdocumentrule-interface">
   973 The <code>CSSDocumentRule</code> interface</h3>
   975 <p>The <dfn><code>CSSDocumentRule</code></dfn> interface represents a ''@document'' rule.</p>
   977 <pre class='idl'>interface CSSDocumentRule : CSSConditionRule {
   978 }</pre>
   979 -->
   982 <h3 id='the-css-interface'>
   983 The <code>CSS</code> interface, and the <code title=''>supports()</code> function</h3>
   985 <p>The <dfn id='CSS-interface'><code>CSS</code></dfn> interface holds useful CSS-related functions that do not belong elsewhere.
   987 <pre class='idl'>interface CSS {
   988   static boolean supports(DOMString property, DOMString value);
   989   static boolean supports(DOMString conditionText);
   990 }</pre>
   992 <dl class='idl-methods'>
   993   <dt><code>supports(DOMString property, DOMString value)</code>,
   994     returns <code>boolean</code>
   995   <dt><code>supports(DOMString conditionText)</code>,
   996     returns <code>boolean</code>
   997   <dd>
   998     When the <code title=''>supports()</code> method is invoked with two arguments <var>property</var> and <var>value</var>,
   999     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,
  1000     and <var>value</var> would be successfully parsed as a supported value for that property.
  1001     Otherwise, it must return <code>false</code>.
  1003     <p>
  1004       When invoked with a single <var>conditionText</var> argument,
  1005       it must return <code>true</code> if <var>conditionText</var>,
  1006       when parsed and evaluated as a <code>supports_condition</code>,
  1007       would return true.
  1008       Otherwise, it must return <code>false</code>.
  1009   </dl>
  1012 <h2 class=no-num id="grammar">Grammar</h2>
  1014 <p>In order to allow these new @-rules in CSS style sheets, this
  1015 specification modifies the <code>stylesheet</code> production in the <a
  1016 href="http://www.w3.org/TR/CSS21/grammar.html">Appendix G</a> grammar of
  1017 [[!CSS21]] by replacing the <code>media</code> production defined in
  1018 [[!CSS21]] with the <code>media</code> production defined in this one,
  1019 and additionally inserting <code>| supports_rule</code>
  1020 alongside <code>ruleset | media | page</code>.</p>
  1023 <h2 id="conformance">Conformance</h2>
  1025 <h3 id="base-modules">Base Modules</h3>
  1027 <p>This specification defines conformance in terms of base modules,
  1028 which are modules that this specification builds on top of.  The base
  1029 modules of this module are:</p>
  1031 <ul>
  1032 <li>[[!CSS21]]</li>
  1033 </ul>
  1035 <p>All of the conformance requirements of all base modules are
  1036 incorporated as conformance requirements of this module, except where
  1037 overridden by this module.</p>
  1039 <p>Additionally, all conformance requirements related to validity of
  1040 syntax in this module and all of its base modules are to be interpreted
  1041 as though all syntax in all of those modules is valid.</p>
  1043 <div class="example"><p>For example, this means that grammar presented
  1044 in modules other than [[!CSS21]] must obey the requirements that
  1045 [[!CSS21]] defines for the parsing of properties, and that requirements
  1046 for handling invalid syntax in [[!CSS21]] do not treat syntax added by
  1047 other modules as invalid.</p></div>
  1049 <p>Additionally, the set of valid syntax can be increased by the
  1050 conformance of a style sheet or processor to additional modules; use of
  1051 such syntax does not make a style sheet nonconformant and failure to
  1052 treat such syntax as invalid does not make a processor
  1053 nonconformant.</p>
  1055 <h3 id="conformance-classes">Conformance Classes</h3>
  1057   <p>Conformance to the CSS Conditional Rules Module is defined for three
  1058   conformance classes:
  1059   <dl>
  1060     <dt><dfn title="conformance::style sheet" id="conform-style-sheet">style sheet</dfn>
  1061       <dd>A <a href="http://www.w3.org/TR/CSS21/conform.html#style-sheet">CSS
  1062       style sheet</a>.</dd>
  1063     <dt><dfn title="conformance::processor" id="conform-processor">processor</dfn></dt>
  1064       <dd>A tool that reads CSS style sheets:  it may be a renderer or
  1065       <a
  1066       href="http://www.w3.org/TR/CSS21/conform.html#user-agent">user-agent</a>
  1067       that interprets the semantics of a style sheet and renders
  1068       documents that use style sheets, or it may be a validator that
  1069       checks style sheets.</dd>
  1070     <dt><dfn title="conformance::authoring tool" id="conform-authoring-tool">authoring tool</dfn></dt>
  1071       <dd>A tool that writes a style sheet.</dd>
  1072   </dl>
  1074   <p>A style sheet is conformant to the CSS Conditional Rules Module
  1075   if it meets all of the conformance requirements in the module that are
  1076   described as requirements of style sheets.</p>
  1078   <p>A processor is conformant to the CSS Conditional Rules Module if it
  1079   meets all applicable conformance requirements in the module that are
  1080   described as requirements of processors.  In general, all requirements
  1081   are applicable to renderers.  Requirements concerning a part of CSS
  1082   not performed by a processor are not applicable, e.g., requirements
  1083   related to rendering are not applicable to a validator.  The inability
  1084   of a processor to correctly render a document due to limitations of
  1085   the device does not make it non-conformant. (For example, a renderer
  1086   is not required to render color on a monochrome monitor.)</p>
  1088   <p>An authoring tool is conformant to the CSS Conditional Rules Module
  1089   if it writes style sheets that conform to the module and (if it reads
  1090   CSS) it is a conformant processor.</p>
  1092 <h3 id="partial">
  1093 Partial Implementations</h3>
  1095   <p>So that authors can exploit the forward-compatible parsing rules to
  1096   assign fallback values, CSS renderers <strong>must</strong>
  1097   treat as invalid (and <a href="http://www.w3.org/TR/CSS21/conform.html#ignore">ignore
  1098   as appropriate</a>) any at-rules, properties, property values, keywords,
  1099   and other syntactic constructs for which they have no usable level of
  1100   support. In particular, user agents <strong>must not</strong> selectively
  1101   ignore unsupported component values and honor supported values in a single
  1102   multi-value property declaration: if any value is considered invalid
  1103   (as unsupported values must be), CSS requires that the entire declaration
  1104   be ignored.</p>
  1106 <h3 id="experimental">Experimental Implementations</h3>
  1108   <p>To avoid clashes with future CSS features, the CSS specifications
  1109   reserve a <a href="http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords">prefixed
  1110   syntax</a> for proprietary property and value extensions to CSS. The CSS
  1111   Working Group recommends that experimental implementations of features in
  1112   CSS Working Drafts also use vendor-prefixed property or value names. This
  1113   avoids any incompatibilities with future changes in the draft. Once a
  1114   specification reaches the Candidate Recommendation stage, implementors
  1115   should implement the non-prefixed syntax for any feature they consider to
  1116   be correctly implemented according to spec.</p>
  1118 <h3 id="cr-exit-criteria">CR Exit Criteria</h3>
  1120   <p>For this specification to be advanced to Proposed Recommendation,
  1121   there must be at least two independent, interoperable implementations
  1122   of each feature. Each feature may be implemented by a different set of
  1123   products, there is no requirement that all features be implemented by
  1124   a single product. For the purposes of this criterion, we define the
  1125   following terms:
  1127   <dl>
  1128     <dt>independent <dd>each implementation must be developed by a
  1129     different party and cannot share, reuse, or derive from code
  1130     used by another qualifying implementation. Sections of code that
  1131     have no bearing on the implementation of this specification are
  1132     exempt from this requirement.
  1134     <dt>interoperable <dd>passing the respective test case(s) in the
  1135     official CSS test suite, or, if the implementation is not a Web
  1136     browser, an equivalent test. Every relevant test in the test
  1137     suite should have an equivalent test created if such a user
  1138     agent (UA) is to be used to claim interoperability. In addition
  1139     if such a UA is to be used to claim interoperability, then there
  1140     must one or more additional UAs which can also pass those
  1141     equivalent tests in the same way for the purpose of
  1142     interoperability. The equivalent tests must be made publicly
  1143     available for the purposes of peer review.
  1145     <dt>implementation <dd>a user agent which:
  1147     <ol class=inline>
  1148       <li>implements the specification.
  1150       <li>is available to the general public. The implementation may
  1151       be a shipping product or other publicly available version
  1152       (i.e., beta version, preview release, or “nightly build”). 
  1153       Non-shipping product releases must have implemented the
  1154       feature(s) for a period of at least one month in order to
  1155       demonstrate stability.
  1157       <li>is not experimental (i.e., a version specifically designed
  1158       to pass the test suite and is not intended for normal usage
  1159       going forward).
  1160     </ol>
  1161   </dl>
  1163   <p>The specification will remain Candidate Recommendation for at least
  1164   six months.
  1166 <h2 id="changes">
  1167 Changes</h2>
  1169 <p>The following (non-editorial) changes were made to this specification since the
  1170 <a href="http://www.w3.org/TR/2012/WD-css3-conditional-20120911/">11 September 2012 Working Draft</a>:
  1172 <ul>
  1173   <li>Removed ''@document'' rule; it has been deferred to Level 4.
  1174   <li>Allow functional notation in ''@supports'' queries to be valid (to allow for future extensions),
  1175       but treat such notations as always being false.
  1176   <li>Corrected the grammar as follows:
  1177 <pre>
  1178 -  : SUPPORTS_SYM S+ supports_condition group_rule_body
  1179 +  : SUPPORTS_SYM S* supports_condition group_rule_body
  1180 </pre>
  1181 <pre>
  1182 -  : (URI | FUNCTION) S*
  1183 +  : (URI | FUNCTION S* STRING S* ')' ) S*
  1184 </pre>
  1185   <li>Switched "and", "or", and "not" keywords to use appropriate productions rather than literals.
  1186   <li>Clarified definition of support used for interpreting ''@support'' rules
  1187   and its relationship to CSS forwards-compatible parsing rules.
  1188 </ul>
  1190 <h2 class=no-num id="acknowledgments">Acknowledgments</h2>
  1192 <p>
  1193 Thanks to the ideas and feedback from
  1194 Tab Atkins,
  1195 <span lang="tr">Tantek Çelik</span>,
  1196 Alex Danilo,
  1197 Elika Etemad,
  1198 Pascal Germroth,
  1199 <span lang="de">Björn Höhrmann</span>,
  1200 Paul Irish,
  1201 <span lang="nl">Anne van Kesteren</span>,
  1202 Vitor Menezes,
  1203 Alex Mogilevsky,
  1204 Chris Moschini,
  1205 Simon Sapin,
  1206 Ben Ward,
  1207 Zack Weinberg,
  1208 Estelle Weyl,
  1209 Boris Zbarsky,
  1210 and all the rest of the <a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a> community.
  1212 </p>
  1214 <h2 class=no-num id="references">References</h2>
  1217 <h3 class="no-num" id="normative-references">Normative references</h3>
  1218 <!--normative-->
  1220 <h3 class="no-num" id="other-references">Other references</h3>
  1221 <!--informative-->
  1223 <h2 class="no-num" id="index">Index</h2>
  1224 <!--index-->
  1226 </body>
  1227 </html>
  1228 <!-- Keep this comment at the end of the file
  1229 Local variables:
  1230 mode: sgml
  1231 sgml-declaration:"~/SGML/HTML4.decl"
  1232 sgml-default-doctype-name:"html"
  1233 sgml-minimize-attributes:t
  1234 sgml-nofill-elements:("pre" "style" "br")
  1235 sgml-live-element-indicator:t
  1236 sgml-omittag:nil
  1237 sgml-shorttag:nil
  1238 sgml-namecase-general:t
  1239 sgml-general-insert-case:lower
  1240 sgml-always-quote-attributes:t
  1241 sgml-indent-step:nil
  1242 sgml-indent-data:t
  1243 sgml-parent-document:nil
  1244 sgml-exposed-tags:nil
  1245 sgml-local-catalogs:nil
  1246 sgml-local-ecat-files:nil
  1247 End:
  1248 -->

mercurial