[CSSWG] Minutes Telecon 2022-09-07 [css-sizing] [css-contain]

=========================================
   These are the official CSSWG minutes.
   Unless you're correcting the minutes,
  Please respond by starting a new thread
    with an appropriate subject line.
=========================================

CSS Contain
-----------

    - RESOLVED: Add .containerName and .containerQuery
                to container query rule API
                https://github.com/w3c/csswg-drafts/issues/7190

    - RESOLVED: Size contained boxes are monolithing
                in L1 (no change to spec), consider relaxing
                requirement to allow fragmenting content in
                later levels
                https://github.com/w3c/csswg-drafts/issues/5648

CSS Sizing
----------

    - RESOLVED: Accept Oriol's proposal to record last remembered size
                first before ResizeObserver callbacks
                https://github.com/w3c/csswg-drafts/issues/7659
    - RESOLVED: display:inline doesn't record a size
                https://github.com/w3c/csswg-drafts/issues/7606
    - Oriol to investigate summing the heights of fragments
         when recording last remembered size of fragmented boxes
                https://github.com/w3c/csswg-drafts/issues/7598

===== FULL MINUTES BELOW ======

Agenda: https://lists.w3.org/Archives/Public/www-style/2022Sep/0004.html
Chair: Alan Stearns

Present:
   Alan Stearns
   Brad Kemper
   Cameron McCormack
   Daniel Holbert
   Daniel Libby
   David Grogan
   Elika J. Etemad
   Ian Kirkpatrick
   Miriam Suzanne
   Oriol Brufau
   Robert Flack
   Rossen Atanassov
   Tab Atkins

<RRSAgent> logging to https://www.w3.org/2022/09/07-css-irc
<RRSAgent> https://www.w3.org/2022/09/07-css-minutes.html
Scribe: fantasai

Administrivia
=============

   astearns: If you're attending TPAC, in-person or remote, please sign up on 
the wiki
   <fantasai> https://wiki.csswg.org/planning/tpac-2022
   astearns: If dialing in for an issue, letting me know which issues and when 
you're available would be helpful

   dholbert: What's the schedule exactly?
   dholbert: joint meeting, is CSSWG the rest of the day?
   astearns: yes, joint meeting is just as listed
   astearns: and CSSWG the rest of Thu/Fri
   astearns: [describes various timeslots etc]
   astearns: When in session / when on break, is on TPAC events page
   dholbert: you mean the wiki?
   astearns: No, the calendar invite page
   astearns: I'll update wiki with links to all the things
   dholbert: thanks

Scroll Animations
=================

   fantasai: Scroll Animations, most edits are in, looking for FPWD next week
   <fantasai> https://drafts.csswg.org/scroll-animations-1/
   <fantasai> https://github.com/w3c/csswg-drafts/pull/7710


CSS Contain
===========

.conditionText and name vs query
--------------------------------
github: https://github.com/w3c/csswg-drafts/issues/7190

   miriam: Currently we have .conditionText which is a single string
   miriam: but includes 2 parts, a name for name of container and a
           query for the conditions to match against that container
   miriam: so proposal is to keep .conditionText as the entire query
   miriam: but add .containerName and .containerQuery so you can get
           the parts yourself
   astearns: if we have the parts, why do we need the concatenation?
   TabAtkins: to match the other conditional rules
   heycam: it inherits from ConditionalRule, so need to say what that
           property returns

   astearns: Anyone with opinions?
   <TabAtkins> +1
   <fantasai>
   heycam: makes sense to me
   <TabAtkins> (and emilio already implemented it, apparently)

   heycam: just question, the one that returns the expression
   heycam: that doesn't include the parentheses?
   miriam: that would include potentially multiple expressions
   heycam: was asking about outermost parens
   miriam: they're not required
   miriam: no need to include them there
   heycam: ah, so parens are part of the expression, not extra syntax
   miriam: right
   astearns: objections?
   miriam: @andruud already posted a PR, so we could resolve to merge
   * fantasai proposes we resolve and leave the edits to the editors
   astearns: Not seeing anything about parens
   miriam: if they are included, not part of the .containerQuery?
   astearns: need to know whether to expect the parens
   miriam: could merge the PR and add that as well
   fantasai: the syntax is like for MQs
   fantasai: so there are potentially a redundant set of parens around
             the entire expression, but in lots of cases you'll have
             something like: ( expr ) or ( expr ) ...
   fantasai: any parens there should appear there
   fantasai: if we want to simplify, we should do it all the way through
   heycam: I guess I wasn't suggesting simplification
   heycam: wasn't sure if outermost parens were part of @container rule
           syntax
   heycam: but sounds like it's part of the expression
   astearns: so it's just as specified, with whatever parens
   miriam: yes

   astearns: then we can resolve to accept this PR and add these attributes
   RESOLVED: Add .containerName and .containerQuery

CSS Sizing
==========

Define precise timing for setting last remembered size?
-------------------------------------------------------
github: https://github.com/w3c/csswg-drafts/issues/7659

   oriol: Spec says that when element needs to record last remembered
          size, occurs when ?? events occur
   oriol: but may be multiple observers that need to be notified
   oriol: what happens if callbacks are involved?
   oriol: [missed]

   oriol: Implementations for the last remembered size are using an
          internal ResizeObserver
   oriol: it will be sorted somewhere in this list of observers
   oriol: other callback observers can observe whether the last
          remembered size was recorded
   oriol: so webpage can notice that current impl in Blink and Firefox,
          they are creating this internal ResizeObserver the first time
          an element needs to update its size
   oriol: then this internal ResizeObserver is preserved for other
          elements that may need to update their last remembered size
   oriol: even if nothing needs to be updated, the ResizeObserver is
          not removed
   oriol: it continues to exist
   oriol: We are exposing these implementation details to web pages
   oriol: My question is, are we fine with that?

   oriol: This is the simplest way to implement it, but shouldn't be
          hard to say that the last remembered size should be recorded
          before other ResizeObserver callbacks are involved
   oriol: this would be consistent with creating such observers at the
          very beginning of the creation of the document
   oriol: What do people think? Should we keep exposing these? Should
          we define a specific order?
   TabAtkins: I don't think exposing these impl details is good, and
              your suggestion of timing is good
   TabAtkins: would be happy to write that into the spec

   iank: Just to clarify, this would be internal ResizeObserver would be
         effectively inserted as first in the list of ResizeObservers or
         something similar to that?
   oriol: Yes, that would be the proposal
   oriol: Other ResizeObservers can be created and appended, so best to
          say it's first, before other ResizeObservers are involved
   astearns: Only change to authors would be less info about...
   oriol: Effect would be if they create their own ResizeObserver, by
          the time their callback is called the last remembered size
          will have been recorded
   oriol: otherwise it might not be recorded yet, and might fall back
          to fallback of contain-intrinsic-size
   astearns: Any objections to setting this precise timing?

   RESOLVED: Accept Oriol's proposal to record last remembered size
             first before ResizeObserver callbacks

Last remembered size for non-atomic inlines?
--------------------------------------------
github: https://github.com/w3c/csswg-drafts/issues/7606

   oriol: Spec doesn't clarify the details of what size we are recording
          as the last remembered size
   oriol: for non-atomic inline elements, it's hard to determine a size
   oriol: ? has a size of 0x0
   oriol: when recording a size, we have two reasonable ways
   oriol: one is to store 0x0 as usual
   oriol: this is what implementations are currently doing
   oriol: might be a bit surprising since not the real size, just an
          arbitrary decision
   oriol: another possibility would be doing the same that we do for
          display:none or when not generating a box
   oriol: we are not storing the last remembered size
   oriol: and we allow the element to keep a previously-set last
          remembered size
   oriol: I don't have a strong opinion
   oriol: bit of an edge case, since inline elements do not support
          size containment
   oriol: so this will only matter if you are dynamically changing the
          display from 'inline' to other things
   oriol: but would like to clarify expected behavior

   astearns: when you say Chrome and FF are treating inlines as 0x0
   astearns: WebKit result is different? or don't know?
   oriol: I think WK has not implemented this feature
   TabAtkins: I have no attachment to either solution
   TabAtkins: in absence of a reason for a change, would stick with
              existing behavior

   dholbert: Seems weird to have different behaviors for transiently
             display:none vs display:inline
   dholbert: without a good reason for 0x0 it feels arbitrary to
             have those differ
   dholbert: what happens if you 'display: contents' or other value?
   dholbert: would be best to have a consistent answer to
             "no sensible size"
   TabAtkins: that's fair

   astearns: other opinions?
   [silence]
   astearns: Proposed resolution is to not accept current behavior
             in impls, but go with option 2 of not recording the size
   astearns: any objections?
   RESOLVED: display:inline doesn't record a size

Last remembered size when fragmented?
-------------------------------------
github: https://github.com/w3c/csswg-drafts/issues/7598

   oriol: This is about what we do when we are in multicol or printing
   oriol: elements can get fragmented
   oriol: in that case, what the ResizeObserver does
   oriol: is it only provides the size of the first fragment
   oriol: ResizeObserver spec has plans to add sizes of more fragments
   oriol: but for now implementations are only storing the first fragment

   oriol: I think this is reasonable, because we cannot try to keep the
          same number of fragments and size for each
   oriol: because only used when size containment, and it is monolithic
          in that case
   oriol: so using size of first fragment seems reasonable and easiest
          solution
   fantasai: monolithic elements can be split across multiple cols/pages
   fantasai: not convinced using the first fragment makes any sense
   fantasai: probably want to use the total size of the element, not
             just the first piece of it that prints on the first page
   astearns: when a monolithic element gets spiced, does it have
             multiple fragments? or one fragment that's been sliced
             into pieces
   florian: pieces and fragments are the same thing?
   fantasai: it does have multiple pieces
   fantasai: not sure if we clarified we call them fragments or not
   fantasai: two effects of being monolithic:
   fantasai: 1. we try to avoid breaking them across breaks
   fantasai: 2. other is that we don't fragment the content inside them,
             just graphically slice it
   fantasai: still get a bunch of pieces of the element. I'd call them
             fragments
   fantasai: I think you want the total height of all of those pieces,
             and not just the height of the first piece

   oriol: if you have multiple fragments, in strange cases, each
          fragment might have different width/height?
   fantasai: for the height, you add them. for the width, you can just
             take the width of the first one, because for a monolithic
             element you won't have different widths on different pages
   florian: could have different widths, if expressed as a percent?
   fantasai: at that point you're doing something more sophisticated
             than just graphically slicing
   fantasai: so going with the first one is perfectly fine
   <bradk> “Finally, if there are no possible break points below the
            top of the fragmentainer, and not all the content fits,
            the UA may break anywhere in order to avoid losing content
            off the edge of the fragmentainer. In such cases, the UA
            may also *fragment* the contents of monolithic elements
            by slicing the element’s graphical representation.”

   <TabAtkins> Specifically, my "strong agree" is to "do whatever
               ResizeObserver currently does"; I have no opinions on
               what that behavior actually *is* and *strongly* feel
               we shouldn't be litigating that topic here in this issue.
   astearns: might agree with Tab, that we agree ResizeObserver is not
             fragment aware. that current state, taking the first
             fragment might be fine for this edge case
   oriol: doing something different seems tricky for an implementation
   fantasai: It's not ideal, didn't we agree on fixing ResizeObserver
             like 6 years ago?
   astearns: probably, but work isn't done
   fantasai: would've hoped the second implementation would've fixed
             things instead of copying the broken stuff
   florian: especially since I believe we said that dealing with
            fragmentation properly was a precondition for going FPWD
   * fantasai is annoyed that we don't put effort into getting
              fragmentation handled

   astearns: 2 ways forward
   astearns: 1st option is to just have the size of the first fragment
             be recorded, to match everything else
   astearns: and maybe put issue in the spec that when ResizeObserver
             gets fixed, we should do better here
   astearns: Or we can define how we construct a size out of the
             entire height and width of a sliced monolithic element
   astearns: I'm lazily inclined towards the first
   astearns: Oriol, you mentioned that's what Blink does atm
   oriol: Yes, they take the size of the first fragment since that's
          the information that ResizeObserver is providing

   astearns: If we decide to go with the entire height and width of
             monolithic element, is there going to be a mismatch
             between last remembered size and what is available in
             ResizeObserver?
   oriol: At the time we record the size, the element might not be
          monolithic
   oriol: it might be monolithic when using
   oriol: having a mismatch, it's not a big deal
   oriol: the deal is having to compute the size in a new way
   oriol: it could be that only ResizeObserver in the page is the
          internal one
   oriol: we'd have to calculate different sizes for this and for
          ResizeObserver
   oriol: so a bit more work, and maybe trickier
   oriol: but like you said about the mismatch, it's not like the
          other ResizeObservers are getting the last remembered size
   oriol: they can use content-visibility to see it
   oriol: but I don't think they are affected by the added complexity
          in the implementation

   astearns: so, can people live with doing the easy thing for now
             and putting a note in that we should do better later?
   <TabAtkins>  +1
   fantasai: brings up the question of whether we can to do something
             better later?
   fantasai: generally, implementers say we have to decide right now
             and can't change later
   fantasai: what's the point of the note if we've already decided
             not to change anything in the future?
   astearns: Last time we put significant effort into fragmentation
             was when Bloomberg was interested
   astearns: might require a non-browser team to care to improve
   fantasai: if the premise is we can't change behavior, then it
             doesn't matter if Bloomberg decides to fund fixing
             things 2 years from now
   astearns: not sure that's the case for this API. can definitely
             see a path forward to not change current behavior,
             but add a fragment aware portion that gives you the
             same information in a fragment aware form
   fantasai: we agreed to do that when we discussed it, to be fixed
             for FPWD. but that's different for what we do for last
             remembered size

   fantasai: the point of last remembered size is that it's the size
             of the element. if you size the element to that last
             remembered size, it'll give a reasonable result
   fantasai: if you take only the size of the first fragment, it
             won't make any sense
   fantasai: if you set the first fragment’s size as the height,
             you'll get a very different result
   fantasai: a ResizeObserver is trying to do something a bit
             different, we're changing stuff and we want to know
   fantasai: the point of ResizeObserver is to observe that there's
             a change, not to set the size back again to the element
   fantasai: but last remembered size is about setting the size back
             again
   fantasai: but if you chop off some large percentage of the box,
             due to fragmentation, it's not really preserving its
             remembered size
   <bradk> +1
   astearns: that convinces me
   florian: me too
   <TabAtkins> I'm just not happy about this diverging from ResizeObserver
   <TabAtkins> They should do the same thing imo
   <fantasai> They're not trying to solve the same problem

   oriol: I can try to take a look at the best way to implement this,
          see what different approaches there are

   TabAtkins: okay with investigating, not with resolving on something
              problematic
   astearns: [explains]
   astearns: I would like to hear what the problems of mismatching
             what problem will that cause?
   TabAtkins: the use case is just as valid when done manually with
              ResizeObserver
   TabAtkins: if we can do one way, should do it the other way
   florian: I think that means we fix both this and ResizeObserver
   TabAtkins: I'm fine with that, if implementable

   astearns: I suggest we resolve that last remembered size, when
             fragmented, returns the entire size of the unfragmented
             element
   astearns: and get some implementation feedback
   astearns: and come back to this if the implementation feedback
             raises problems

   dholbert: is this specifically for monolithic elements? or anything
             fragmented
   oriol: anything, since last remembered size can be recorded if
          element is not monolithic
   dholbert: I'm concerned that the unfragmented size is not something
             we generally have or would generally be useful
   dholbert: if you have line height extremely tall lands on the
             fragmentation point
   dholbert: might have two pieces that aren't summing to the original
             total
   dholbert: ...
   astearns: that's only the case for non-monolithic elements
   dholbert: Yes, for monolithic sum of parts should equal sum of pieces
   florian: similar problem figuring out the height of a thing with
            getComputedStyle()

   Rossen: What I wanted to ask here, does this discussion apply to
           variable-size fragments or to fragmentainers that are of
           regular fragment size or ???
   astearns: discussed earlier, but didn't come to conclusion on the
             monolithic width
   Rossen: I think answer varies based on that
   astearns: So if ppl have concerns we leave issue open and have Oriol
             investigate what can be implemented in at least one
             implementation
   astearns: and see whether what he comes up with is an acceptable
             path forward
   oriol: that's fine
   astearns: so not resolving today

contain:size shouldn't fragment as monolithic
---------------------------------------------
github: https://github.com/w3c/csswg-drafts/issues/5648

   florian: CSS Contain has several types of containment
   florian: all these are establishing changes to how CSS normally
            behaves, to reason about inside/outside the element,
            breaking dependencies
   florian: what's going on inside an element doesn't affect the outside
   florian: we have size containment, the goal being when the inside
            changes, the size of the element doesn't
   florian: and in particular within that, we want to deal with size
            changes in the case the element is fragmenting
   florian: for that we have a double goal. First, regardless of how
            the element fragments, its total size shouldn't change.
            But more than that, the size of the fragments shouldn't
            change either

   florian: the spec says applying size containment causes the element
            to be monolithic
   florian: fantasai opened an issue to say it doesn't need to be
   florian: she correctly points out size containment causes the
            element to be fixed size
   florian: so the total size of the element won't vary, regardless of
            the breaking point
   florian: but making it fixed size does not guarantee the fragment
            sizes won't change
   florian: so I think we need something more than merely making the
            element fixed size
   florian: I agree making the element monolithic is slightly overkill,
            in the sense that it will guarantee that not only the total
            size of the box and all fragments won't change, but it also
            means the content of the element will not be fragmented and
            will be sliced
   florian: which isn't actually necessary in this case
   florian: as long as we guarantee fragment sizes to not change, we can
            still allow fragmentation of its contents
   florian: fixed size fragments but content fragmenting is not a thing
            we have currently

   florian: preference is to stick with the existing spec requirement
            that all size contained elements become monolithic, because
            it fulfills the requirement and is what is implemented
   florian: in some later level possibly relax this to not be monolithic
            as long as you fulfil these specific constraints
   florian: could do that without trouble, any implementation compliant
            today would be compliant in the future
   florian: but this is the last open issue on css-contain-1
   florian: not sure it's so interesting to change the spec to allow
            behavior nobody has at this point

   <florian> http://software.hixie.ch/utilities/js/live-dom-viewer/?saved=10671
   fantasai: that seems very weird to me, don't think it's supposed to
             do that
   florian: it's interoperable
   fantasai: it should be drawing the box all the way to the bottom of
            the page, and not leaving a gap when it fragments
   florian: the total size does stay fixed, but the size of the
            fragments doesn't
   fantasai: drawing the box sides all the way down to the end of the
             page or column, rather than ending at the fragmentation
             point, then the size of the fragments would not change
             based on the fragmentation position
   iank: all of the fragmentation engines for most cases, when you
        fragment, you'll typically consume the remaining fragmentainer space
   fantasai: that's what I was expecting to happen
   florian: Safari, Chrome, and Firefox all do this
   florian: three line element fragment, just tall enough to contain
            the three lines, but the fragmentainer containing the
            element is 2.5 lines high. So the first fragment will be
            2 lines, the third fragment will be 1 line.
            So there's a 0.5 line gap at the end of the first one
   florian: whether that's the case or not depends on the content of
            the element
   florian: maybe this is an interoperable spec violation, but I'm not
            convinced it's a spec violation
   <astearns> The fragment heights stay the same in blink, but adjust
              in gecko
   fantasai: that's super weird. I wonder what's causing this to happen
   <bradk> Wouldn’t box-decoration-break: clone cause the fragments to grow?
   fantasai: I could understand if engines were like "oh for web compat
             reasons we can't consume the extra space when fragmenting
             fixed-size boxes", but even when it's auto, it's not
             consuming down to the break
   florian: because here we're not in a monolithic case, it doesn't want
            to have one full line of content [...]
   fantasai: the fact it's not working for auto is disturbing
   florian: that's the current behavior, and doesn't work for contain:size

   florian: I propose sticking with monolithic for level 1, then maybe
            relaxing in a later level
   fantasai: rather defer the issue
   florian: would you object to the monolithic beahvior being allowed?
   fantasai: no, I think it's fine to allow that
   florian: all implementations behave this way, and you're agreeing it
            should be allowed. is it worth blocking the spec to make a
            change that's not testable and not invalidate any
            implementation?
   fantasai: I said I don't mind deferring!
   RESOLVED: Not make any changes to css-contain-1, possibly relax the
             monolithic requirement in later levels

Received on Sunday, 2 October 2022 02:52:42 UTC