[CSS21] zindex.html E.2 issue: ordering contradictions

[Please let me know if there's a preferred convention for subject lines
 when reporting issues in either editors' draft or last call versions of
 the CSS2.1 specification, other than including the string "[CSS21]".]

This is a review comment for the Editors' Draft of CSS2.1
as published Oct 2010 (and is equally applicable to
http://www.w3.org/TR/CSS21/zindex.html as visible at that date).


If I understand correctly, zindex.html as currently written includes some
items (say the background image of element X) more than once: various
places in the list include "all [qualifier] descendents [of E]", which
typically includes descendents of some different E that's also included in
the painting order.

This would constitute an issue because double inclusion in the painting
order entails conflicts of the form "A precedes B, which precedes A".  
(Alternatively, if each item in the painting order were to be interpreted
 as "paint this", then instead of a contradiction, we get double painting.
 Apart from imposing unnecessary performance cost on those implementations
 that adhere to this interpretation, I believe that this will in some cases
 result in different appearance compared to implementations that render
 only once.  (For example, I would expect that it can affect the appearance
 if a background image is in a format such as png that allows partial
 opacity.))

For example, item 5 with respect to the root element consists of
"[a]ll non-positioned floating descendants, in tree order", followed by a
sentence which (by my understanding) explains that inclusion of a floating
descendant should be considered equivalent to expanding this big list with
respect to that floating descendant, but excluding [the expanded painting
order of] "any positioned descendants and descendants which actually create
a new stacking context".

One issue is that it isn't clear that that is what the text means; while
the other is that (under this interpretation) it doesn't exclude inline
blocks or non-positioned floating descendants, so non-positioned floating
descendants of those inline blocks or non-positioned floating descendants
would be included first in item 5 with respect to that inline block or
floating descendant, and then included again in item 5 with respect to the
root element.

(Possibly the intended meaning of "descendants" is such that it doesn't
 include any inline blocks or non-positioned floating "elements", but that
 interpretation would seem to make item 5 equivalent to an empty list.)


Some issues are:

  - It is unclear what inclusion of an element in the painting order means.
    The most obvious guess would be that it means to expand the big list
    with respect to that element, but the specification doesn't actually
    say this, so any contradictions found in that interpretation lead one
    to explore other interpretations.

    Part of the problem is that the list only provides an ordering among
    the descendants of a given element, and there's room for doubt as to
    whether all named descendant painting items of element A must precede
    all named descenant painting items of element B if element A precedes
    element B in the list: "treat elements A & B as if they created a new
    stacking context" isn't enough to say that inclusion of "element A"
    in the list is equivalent to the painting items that are mentioned
    in this ordering; it might be read as merely giving the ordering among
    any painting items that are included as part of "element A".
    And indeed in some sense it's quite deliberate that there's no
    specification of what painting items to include as part of 
    a given element, because the spec is trying to allow UAs to paint
    e.g. outside markers even though they're not listed in the painting
    order of an element.

    To counter this, I suggest slightly tightening the description of the
    list as an "order" (which doesn't necessarily imply that any of the items
    in the ordering are actually part of painting the element, it only
    gives an ordering among whatever of those items are done),
    to introducing the concept of the "painting sequence" for an element,
    and say that the list forms a subsequence of the painting sequence for
    the element, and explicitly mentioning that it's a subsequence because
    it excludes outside list markers and optionally outlines.

    I tentatively suggest wording it in such a way that the full sequence
    can only be formed by inserting outside list markers and outlines (and
    any other CSS2.1 item not in the existing list); i.e. I tentatively
    suggest that it be made non-conformant for a UA to paint other things
    as well.  I believe that something like that is required for the test
    suite to be correct: there's no way to test visibility:hidden if
    conforming UAs are allowed to render things other than what CSS directs
    them to render, such as something looking exactly like the thing that
    should be hidden.

  - "Treat X as if it created a new stacking context" is unclear.
    However, if the above suggestion is adopted, and if the big list
    is just described as a subsequence of the painting sequence of an
    element E without requiring that E establish a stacking context,
    then we can instead word the list in terms of the painting sequence
    of X.

  - Without having tested what implementations do, I suggest that
    the painting sequence of elements that do not establish a stacking
    context should exclude all descendants that are floats, inline blocks
    (including those generated by display:inline-table), and positioned
    elements, and descendants of those.

    One way of doing this is to talk of "the painting sequence for an
    element E", and then within that list say "if E does not establish a
    stacking context" for each time that it includes the painting sequence
    of an element.
  

pjrm.

Received on Friday, 5 November 2010 03:29:28 UTC