Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[css-syntax-3] Should declarations interleaved by an invalid rule be separated? #11271

Open
cdoublev opened this issue Nov 25, 2024 · 1 comment

Comments

@cdoublev
Copy link
Collaborator

cdoublev commented Nov 25, 2024

When a rule is interleaved between declarations and triggers an "invalid rule error", the spec splits the declarations:

  • If an invalid rule error was returned
    If decls is not empty, append decls to rules, and set decls to a fresh empty list of declarations.

An invalid rule error is produced in a nested context from any list of tokens that:

  • is not a valid rule or declaration in the context
  • is not an invalid at-rule in the context (it does not start with an at-keyword)
  • does not start with a dashed identifier followed by :
  • does not include a non nested "stop token": } and ;
  • ends with a {}-block

Examples: {}, . {}, div: hover {}, undeclared-ns|* {}.

If I am not mistaken, this intentionally takes space for future selector syntaxes. #8738 (comment) touches on that.

It might be useful to add a note, since that is not what the current version of Chrome and FF does:

const sheet = new CSSStyleSheet
sheet.insertRule(`
  style {
    color: green;
    . {}
    color: orange;
    undeclared-ns|style {}
    color: red;
  }
`)
sheet.cssRules[0].cssText; // style { color: red; }

There does not seem to be any corresponding test on WPT.

@cdoublev
Copy link
Collaborator Author

cdoublev commented Dec 17, 2024

Browsers also do not split declarations separated by an invalid at-rule:

const sheet = new CSSStyleSheet
sheet.insertRule(`
  style {
    color: green;
    @media;
    color: red;
  }
`)
sheet.cssRules[0].cssText; // style { color: red; }

Whereas this is required by the current text:

<at-keyword-token>

  • If decls is not empty, append it to rules, and set decls to a fresh empty list of declarations.
  • Consume an at-rule from input, with nested set to true. If a rule was returned, append it to rules.

So I guess it should be:

<at-keyword-token>

  • Consume an at-rule from input, with nested set to true. If a rule was returned:
    • If decls is not empty, append it to rules, and set decls to a fresh empty list of declarations.
    • Append the rule to rules.

@cdoublev cdoublev changed the title [css-syntax-3] Clarify why declarations after/before invalid rule error should be separated [css-syntax-3] Should declarations interleaved by an invalid rule be separated? Dec 17, 2024
cdoublev added a commit to cdoublev/css that referenced this issue Dec 19, 2024
Declarations are no longer hoisted or wrapped in a style rule.

Some problem remains...

1. @font-feature-values, @function, @page, can also have declarations
   interleaved with rules, but CSSNestedDeclarations is currently
   associated to style properties. (w3c/csswg-drafts#11272)

2. "}" should be ignored in a "style" attribute value (a declaration
   block) but the algorithm has been replaced with the same algorithm
   than for a block of rules and declarations. (w3c/csswg-drafts#11113)

3. The current text wants declarations interleaved by an invalid at-rule
   or an invalid (qualified) rule error to be separated, but the reason
   is not stated and no browser does this. (w3c/csswg-drafts#11271)

4. The current text clearly has some other minor typos and is not clear
   about whether rules and declaration, or only rules, should be
   returned. (w3c/csswg-drafts#11017)
cdoublev added a commit to cdoublev/css that referenced this issue Dec 19, 2024
Declarations are no longer hoisted or wrapped in a style rule.

Some problem remains...

1. @font-feature-values, @function, @page, can also have declarations
    interleaved with rules, but CSSNestedDeclarations is currently
    associated to style properties. (w3c/csswg-drafts#11272)

2. "}" should be ignored in a "style" attribute value (a declaration
    block) but the algorithm has been replaced with the same algorithm
    than for a block of rules and declarations. (w3c/csswg-drafts#11113)

3. The current text wants declarations interleaved by an invalid at-rule
    or an invalid (qualified) rule error to be separated, but the reason
    is not stated and no browser does this. (w3c/csswg-drafts#11271)

4. The current text clearly has some other minor typos and is not clear
    about whether rules and declaration, or only rules, should be
    returned. (w3c/csswg-drafts#11017)
cdoublev added a commit to cdoublev/css that referenced this issue Dec 19, 2024
Declarations are no longer hoisted or wrapped in a style rule.

Some problem remains...

1. @font-feature-values, @function, @page, can also have declarations
    interleaved with rules, but CSSNestedDeclarations is currently
    associated to style properties. (w3c/csswg-drafts#11272)

2. "}" should be ignored in a "style" attribute value (a declaration
    block) but the algorithm has been replaced with the same algorithm
    than for a block of rules and declarations. (w3c/csswg-drafts#11113)

3. The current text wants declarations interleaved by an invalid at-rule
    or an invalid (qualified) rule error to be separated, but the reason
    is not stated and no browser does this. (w3c/csswg-drafts#11271)

4. The current text clearly has some other minor typos and is not clear
    about whether rules and declaration, or only rules, should be
    returned. (w3c/csswg-drafts#11017)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant