[CSSWG] Minutes Tokyo F2F Wed 2017-04-19 Part IV: Box Alignment, display:contents, Containment, Interpreting url()s [css-align][css-contain][css-values][css-masking]

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


Flexbox & Alignment
-------------------

   - Browsers were interested in fixing the partial implementation bugs.

CSS Display
-----------

   - RESOLVED: Make <br> and <wbr> not display with display:contents
   - RESOLVED: Strip <button> and treat as normal content
   - RESOLVED: display:none the <meter> and <progress> elements when
               display:contents is specified
   - RESOLVED: display:none for <canvas> <applet> <embed> and
               <object> when display:contents is specified
   - RESOLVED: SVG elements <g>, <use>, nested <svg>, and <tspan> are
               eliminated and their contents are hoisted under
               display:contents but all other SVG elements are
               display:none'ed
   - TabAtkins and fantasai will propose wording to solve Issue 1118:
       Should anonymous boxes always inherit through the box tree?

CSS Alignment
-------------

   - RESOLVED: Change bottom margin edge to bottom border edge
               wrt floor on last baseline of scrollable boxes.

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

   - RESOLVED: Size replaced elements as if intrinsic size was zero
               and no aspect ratio.
   - RESOLVED: Layout containment makes you a fixed-position
               containing block for abspos children.
   - RESOLVED: Level 2 for single-axis layout containment
   - RESOLVED: WONTFIX issue 1043 this level, explain why
              (Explanation: https://github.com/w3c/csswg-drafts/issues/1043#issuecomment-295276243)
   - RESOLVED: 'display: contents' causes 'contain' values to be
               ignored except style containment
   - RESOLVED: Update WD of css-contain with edits for issues we
               resolved today.

CSS Values / CSS Masking
------------------------

   - Tentative resolution: mask-image distinguishes element reference
     vs image reference via local vs external reference in url();
     final resolution pending dbaron's investigation of Gecko code
     [See Friday's resolution for final resolution.]

CSSOM
-----

   - RESOLVED: USVString for href attributes on stylesheet and
               cssimportrule

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

Agenda: https://wiki.csswg.org/planning/tokyo-2017#topics

Scribe: myles

Flexbox
=======

   topic: Partial implementations of space-evenly in grid but not flexbox
   github topic: https://github.com/w3c/csswg-drafts/issues/1167

   Florian: We need people from blink and WebKit here.
   Florian: The "alignment" properties apply to all layout modes.
   Florian: The spec describes how to do this, but browsers don't
            follow.
   iank: Are there bugs?
   Florian: These browsers support the keywords on flex box but not
            grid.
   Florian: You can't use @supports because the browsers do "support"
            the value.
   Florian: They shouldn't have shipped it.
   myles: We will not un-ship it.
   TabAtkins: It's easy to fix. We will probably fix it.
   myles: We, WebKit, are regretful that we shipped it and want to
          fix this.

   shane: Are there issues?
   Florian: Yes
   Florian: You could also just provide a better fallback if you want.
   shane: We have an old patch which gets us at least partway there.
          We can pick it up.
   shane: People are responsive.

CSS Display
===========

   <TabAtkins> https://drafts.csswg.org/css-display/#unbox-html
   TabAtkins: We all agreed that replaced elements and proper form
              controls are display none when you set display:contents
              on them.
   TabAtkins: There are some more HTML elements where it's not clear
              how we should treat them.
   TabAtkins: ^^^ list.
   TabAtkins: Chrome people have opinions.

<br> and <wbr>
--------------

   TabAtkins: Next up: <br> and <wbr>
   TabAtkins: They are magical today. They should be display:none.
   TabAtkins: Our policy is not to make up things without use cases.
              We are trying to come up with the most reasonable
              outcome.
   <general confusion>
   fantasai: They should do their thing and ignore display:contents
   fantasai: No strong opinion.
   TabAtkins: But display:contents always makes the thing go away.
   fantasai: But text doesn't go away.
   tantek: But this isn't like text content.
   <tantek> +1 on TabAtkins proposal
   fantasai: But from a CSS author's point of view, it is.
   fantasai: Jen Simmons raised the issue that <br> turns into a grid
             item and this is bad.
   fantasai: People don't think of <br> as an element.
   TabAtkins: It's easy to run into trouble if you put raw text into
              a flexbox. So we tell authors to put wrappers around
              their text.
   tantek: Agreed.
   <dbaron> That is, Tab was saying you run into the same problem
            with <b>bold text</b> if you haven't used a wrapper.

   Florian: From an implementation point of view, do <br>s have magic
            which is easy to make go away, or is it difficult to make
            it display:none
   fantasai: It's easy to implement.
   astearns: Any objections to just doing display:none?
   <none>

   RESOLVED: Making <br> and <wbr> not display with display:contents

<button>
--------

   TabAtkins: The <button> element.
   TabAtkins: UAs are usually okay with rendering buttons just like
              spans, so display:contents can do the normal thing here
   TabAtkins: but <button> and <input type="button"> are usually
              interchangeable.
   TabAtkins: But it's probably fine. I don't have a strong opinion.

   tantek: <button> and <input type="button"> are pretty different
           though.
   tantek: We should strip off the tags
   fantasai: But it's confusing to an author!
   fantasai: Authors' decisions about which to use is arbitrary.
   tantek: You should strip the tag because it's actually less
           confusing, not more confusing
   tantek: because there is inner elements.
   fantasai: We don't do that for <object>.
   iank: It's like <canvas>.
   tantek: But <button> has different fallback behavior.
   TabAtkins: We should just strip the <button> wrapper and treat it
              as normal content
   <tantek> +1 treat button as a normal element

   RESOLVED: Strip <button> and treat as normal content

<meter> and <progress>
----------------------

   TabAtkins: <meter> and <progress> elements
   TabAtkins: I think they are replaced.
   TabAtkins: The contents of <meter> and <contents> are not
              fallback. Instead, they are just legacy. So we should
              display:none them.
   TabAtkins: It's the same as <video> because the contents are not
              meant to be displayed.
   TabAtkins: It's irrelevant.
   iank: Internally we represent these as form controls.
   TabAtkins: We should treat like form controls.
   fantasai: I'd prefer to show the contents but i won't object.

   RESOLVED: display:none the <meter> and <progress> elements when
             display:contents is specified

  <applet> <canvas> <embed>
  -------------------------

   TabAtkins: 4! <applet> <canvas> <embed> elements
   TabAtkins: When they are showing, they are definitely replaced, so
              it's well-defined. But! (Especially for <object> and
              <applet>) if the thing you're referencing is invalid,
              it's meant it show the stuff inside it.
   TabAtkins: Is it really replaced? Should we strip the wrapper away?
   Florian: <object> has 2 states: 1) it's replaced, or 2) it shows
            its contents
   Florian: If it's not display:none, it's dangerous to authors.
   iank: Usually for <canvas> you put your fallback inside the tag.
   iank: It should be display:none.

   astearns: The goal of display:contents isn't to hide contents.
   iank: Yeah, it'll take the canvas out of the tree and show the
         contents.
   Florian: But we already resolved on that, maaaaaaan.
   All: <object> is kind of different from the others.
   Florian: When the content loads, we've decided that display:none
            works. But otherwise, ?
   tantek: Yeah the load state shouldn't affect stuff.
   tantek and fantasai: but you should show the contents in both
          cases (whether it loaded or not).
   TabAtkins: We have a blanket policy which we can revisit but it is
              a good policy.
   Florian: Both states should do the same. And they should show
            their contents.
   TabAtkins: Yes, they should do the same thing. And the normal
              state should be display:none and therefore both should
              be.

   astearns: Let's not discuss the blanket policy.
   astearns: I want to go with display:none. Does anyone object?

   RESOLVED: display:none for <canvas> <applet> <embed> and <object>
             when display:contents is specified

display:contents on SVG elements
--------------------------------
   GitHub Topic: https://github.com/w3c/svgwg/issues/305

   TabAtkins: SVG does not have a box model. It's defined in terms of
              something custom.
   TabAtkins: I'd like to describe SVG in terms of a box model.
   TabAtkins: So we have no idea what to do.
   TabAtkins: SVG currently special cases display:none to say "stuff
              doesn't render"
   TabAtkins: Option 1: All SVG treats display:contents as
              display:none
   TabAtkins: but this isn't great because it is valuable here.
   TabAtkins: <g> and <use> and nested <svg> can be stripped
   fantasai: <tspan> too.
   TabAtkins: Everything else should probably be display:none
   TabAtkins: fantasai: This is consistent with how it works.

   ChrisL: Will people try to use this to implement fallback?
   fantasai: What if you display:contents two nested elements, does
             it cascade?
   TabAtkins: It does cascade, so the innermost text wouldn't render.
   TabAtkins: The root SVG should display:none but inner ones not
              necessarily.
   TabAtkins: If nobody objects, I'll do this.
   astearns: Objections?

   RESOLVED: SVG elements <g>, <use>, nested <svg>, and <tspan> are
             eliminated and their contents are hoisted under
             display:contents but all other SVG elements are
             display:none'ed

MathML
------

   TabAtkins: Everything in MathML should display:none when
              display:contents is specified.
   TabAtkins: We may just .... not care about MathML.

   astearns: Let's take the spec to CR, please!
   fantasai: But we have new issues!!!
   fantasai: So we can't go to CR.
   fantasai: We can fix them up real quick and we'll come back.

Inheritance through 'display: contents'
---------------------------------------
   github topic: https://github.com/w3c/csswg-drafts/issues/1118

   fantasai: This is a fun test case
   fantasai: There are anonymous boxes in the box tree. We defined an
             anonymous box in the box tree has initial values except
             for the ones which are inherited (from its parent box in
             the box tree). But! When we have display:contents, if
             the parent of the anonymous box, then the element's
             parent is really its grandparent!
   TabAtkins: "parent box" is reasonably well-defined now, but with
              display:contents, not so much.
   <TabAtkins> (Specifically, "parent box" is simple enough, in a
               pre-display:contents world, that we don't have to
               worry much about the fact that it's weakly defined.
               With display:contents, tho, the full box tree starts
               being more relevant, and the weak definition is more
               troublesome.)
   fantasai: What I expect is that we look at the parent box in the
             box tree and we look at the element which generated that
             box.
   fantasai: However, implementations don't look at the box tree,
             they look at the parent element and its properties.
   fantasai: Sooooooo this is busted.

   fantasai: So are these bugs? Or should we update the spec?
   TabAtkins: We should do the latter. Inheritance doesn't pay
              attention to the box tree. The fact that this uses the
              box tree was hand-wavey.
   TabAtkins: <gives example>
              <section> <div>Foo</div>
              </section>
              <section> <div><span>Foo</span></div>
              </section>
              section { color: red;
              }
              div { color: green; display: contents;
              }
   TabAtkins: <explains the example>

   dbaron: There are 2 different distinctions to make (but one may
           not be observable).
   dbaron: Gecko recently changed how anonymous boxes inherit (but
           only for nested anonymous boxes). Previously, if you have
           2 nested ones, one would inherit from the other. Now, all
           nested boxes inherit from the closest real element.
   Florian: Is there an observable difference?
   dbaron: Not to regular users.
   xidorn: What about a writing-mode change on an element with
           display:contents and text inside it?

   astearns: We need to change the spec to match the implementations.
   fantasai: If you have an inline element and its the child of a
             block, then it's the child of the root inline of that
             block. If you remove that inline element, then the
             contents of that inline element (the text) becomes a
             child of the block's root inline. There's no intervening
             box belonging specifically to the text. Now, if we make
             that box go away, there's nothing that is holding the
             properties that apply to the text other than the root
             inline. The root inline's properties apply to the text
             because there's nothing between there.
   fantasai: If you put an inline in between the text and the root
             inline, give it a property, then pull it away with
             display:contents, then it's not in the formatting tree.
             How is it contributing a color when it's gone?
   TabAtkins: Inheritance always follow the element tree.
   TabAtkins: Text doesn't have properties, but it does know things
              like color.
   fantasai: We have to invent this idea of a text frame, and say
             that it has properties, and it's an anonymous object
             which you can't get rid of.
   TabAtkins: We kind of had to do that with selectors already.
   TabAtkins: We say that clicking on raw text correctly triggers,
              even when there are intervening shadows & etc.
   fantasai: It is already a thing, but it doesn't have properties.
             Now we are saying that it has its own properties.
   TabAtkins: Yes, to achieve what all implementations do and what
              makes sense.
   TabAtkins: display:contents shouldn't change inheritance.
   fantasai: Background color does go away when you take away the
             box.
   TabAtkins: In the example in the issue, do you think in the first
              bit that text should be red?
   TabAtkins: Where red is assigned to <section> and green is
              assigned to <div>?
   fantasai: <reads really hard>
   fantasai: I expected div of to take the color of the section, and
             div span foo to take the color of the div.
   TabAtkins: I disagree.
   TabAtkins: I agree with the originator and what implementations do
   TabAtkins: We can work through the implementations to make things
              well-defined.

   astearns: This will be difficult to specify.
   fantasai: It requires inventing a new type of box in the inline
             layout model which we don't have yet.
   TabAtkins: Putting the span in there changes how inheritance
              works, which changes what users see, and this is
              unreasonable. The present of an element shouldn't make
              the color jump over the div.
   Florian: The consequences that a non-styled span changes things is
            scary.
   astearns: Let's table this.

   fantasai: If we make a new box, it belongs in the inline layout
             module, not this module.
   TabAtkins: Let's put all the boxes in display:*
   fantasai: But you can't create it with display:*
   fantasai & TabAtkins: <tries to figure out which modules this
       should go in>

<last baseline alignment discussion part II moved to Minutes Part II>

Selectors
=========
   scribe: TabAtkins

Propagation of the :focus pseudo
--------------------------------
   github topic: https://github.com/w3c/csswg-drafts/issues/1240

   Florian: This was raised by fantasai a while ago.
   Florian: Topical now because Mozilla and Blink are both
            implementing :focus-within, which depends on :focus, so
            we should make sure we get :focus right.
   Florian: We have wording attempting to say that "whatever magic
            HTML says to make :active propagate (to labeled controls,
            etc), it should apply to :focus too".
   Florian: fantasai says this is either useless or contradicting
            HTML.
   Florian: I think you were saying that the way we phrased it
            doesn't make it clear whether we were placing a
            requirement on the HTML authors to fix this, or
            overriding them and defining it propagates differently.
   Florian: Because in HTML :focus and :active do propagate
            differently.
   Florian: So it's unfortunate if we disagree. Do we yield, or shout
            at them?
   Florian: I think we wrote it this way because there was a parallel
            discussion about whether :focus and :active should
            propagate from a form control to its label *and* vice
            versa; we at least agree that they should both act the
            same.
   Florian: And we just filed an issue on HTML to figure out if it
            should be bidirectional or not.
   Florian: It was bidirectional in IE (not Edge).
   Florian: Given that :focus-within is meant to do the same as
            :focus, and there's no compat baggage, we should put a
            stick in the ground and decide.

   [need more time to think about this, we're dropping the topic for now]

css-contain
===========
   Scribe: fantasai

   Florian: Have a FPWD of css-contain that is well overdue, thus
            close to CR.
   Florian: Have some issues, let's close them.

contain:size on replaced elements
---------------------------------
   github topic: https://github.com/w3c/csswg-drafts/issues/382

   Florian: If you 'contain: size' on a replaced element, what should
            that mean?
   dbaron: You get whatever size specified, otherwise zero.

   RESOLVED: Size as if intrinsic size was zero and no aspect ratio.

contain:layout wrt abspos/fixedpos containing blocks
----------------------------------------------------
   github topic: https://github.com/w3c/csswg-drafts/issues/404

   TabAtkins: Need to check with Ojan, inclined to accept proposal.
   Florian: Can we resolve and check later?
   TabAtkins: Proposal is that layout containment makes you a fixed
              position containing block for abspos children

   RESOLVED: Layout containment makes you a fixed position containing
             block for abspos children.

   ACTION TabAtkins ping Ojan about this issue
   <trackbot> Created ACTION-847

single-dimension layout containment
-----------------------------------
github topic: https://github.com/w3c/csswg-drafts/issues/1031

   Florian: Next one from dbaron...
   dbaron: This one is a big issue.
   dbaron: One of the things that a bunch of web devs really want is
           what they call "container queries"
   dbaron: which basically addresses the sub case of teams that
           develop widgets or modules that are part of a bigger page.
   dbaron: They're developing some markup and script and whatever
           that gets included within a bigger page, and it will have
           some size.
   dbaron: The bigger page might use media queries to e.g. switch
           from 3 columns to 2 columns, and widgets gets bigger
           though viewport got smaller.
   dbaron: If you're implementing the widget, you want to respond to
           the size that the widget is, not the size of the viewport.

   dbaron: Bunch of ppl want container queries that actually work,
           rather than do what ppl do right now which is do layout,
           flush, and set styles based on that.
   dbaron: Seems to me it should have some relation to containment-
   dbaron: that is, ability to do container queries should depend on
           some kind of containment so that your insides don't depend
           on your outsides which depend on your insides.
   dbaron: The next point is that sometimes people want to do
           container query on their width, but have an auto height.
   dbaron: So, was thinking we want to have layout containment in
           only one dimension.
   dbaron: Beyond that haven't thought about it, so this is a "please
           design me a feature" issue.
   dbaron: This seems like a relatively high priority feature because
           ppl do this a lot, and do it by doing flush-restyle loops.

   Florian: If they're willing to go that far, using 2D size
            containment is good, set it and then reset your height
            after you do layout.
   dbaron: Get ppl doing it for multiple parts of the page, so cycles
           multiple times.
   fantasai: Why not just have -x -y keywords?
   TabAtkins: Hard to define what that means.
   eae: Maybe sets wrong expectations, that you wouldn't get same
        performance benefits.
   TabAtkins: True, but you do get the benefit that when you're using
              resize observer you get predictable behavior and not
              loops.
   Florian: Seems like level 2, esp. we don't have proposal yet.
   TabAtkins: This plus resize observer plus custom at-rules, I'm
              hoping will allow solving this use case.
   TabAtkins: Been my plan for like 2 years.

   RESOLVED: Level 2

Freezing/unfreezing size containment
------------------------------------
   github topic: https://github.com/w3c/csswg-drafts/issues/1043

   Florian: Probably better in 1D context, but still applies to 2D.
   Florian: Imagine you have long FB page, infinite scroller, 37
            screens down.
   Florian: Because everything is dynamic, ppl will update stories
            above where you are, which will change your size, which
            will make you scroll.
   Florian: Things that are off-screen should have their size frozen,
            and when they enter the screen you should unfreeze them.
   Florian: So want a variant of size containment that only applies
            offscreen.
   Florian: And then when you scroll in it solves.

   plinss: Sounds like a giant hack that should be solved by scroll
           anchoring.
   iank: FB can also use intersection observer to do this.
   Florian: That ends up being just slow enough that they do resizing
            on-screen (rather than just off-screen).
   Florian: My take is that once we get scroll anchoring a large part
            will be solved, combine with fact that you can do manual
            freezing if you want.
   Florian: But I think this is not something to solve with magic
            freezing and unfreezing.
   fantasai: I agree with the last statement.

   flackr: If you were to drag the scrollbar, we will probably put up
           a frame before we run any script in response to the scroll
           position, so you will see un-resized content.
   Florian: Which is why I'd suggest there was some UI indication
            (like graying out) that indicates out-of-date-ness.
   Florian: Not as good as magic, but dunno how to make that happen.

   Florian: So proposed wontfix.
   astearns: Objections?
   iank: We should also say that we'll keep use case in mind for
         future stuff.
   TabAtkins: But right now solution is use JS intersection observer.
   Florian: And various upcoming features will make it better (though
            not perfect) soon.
   astearns: Can someone add a comment summarizing these conclusions?

   RESOLVED: WONTFIX this level, explain why

Publication
-----------

   Florian: That takes us to zero open issues on css-contain.
   Florian: Modulo DoC, go to CR?
   ChrisL: Changes section?
   Florian: No, should I do that first?
   ChrisL: If you can do it in a reasonable time. Just want to avoid
           "CR pending edits" which takes 9 months.
   tantek: Could update a WD now, and the resolve on CR once you have
           DoC.
   Florian: Question about DoC...
   Florian: Not much happened between FPWD and now, do we need a DoC
            covering comments from earlier.
   ChrisL: Assumption in the Process is that FPWD is actually the
           first *public* working draft.
   Florian: Okay, I'll do DoC over old issues.
   tantek: Is that needed?
   Florian: Need to demonstrate wide review.
   ChrisL: We also need to show usual sec/a11y/i18n reviews.
   Florian: Will show non-trivial DoC, not necessarily comprehensive
            to first ED.

   RESOLVED: Update WD of css-contain with edits for issues we
             resolved today.

   [ Note: This section moved over from Thursday ]

   Florian: Issue on combining 'display: contents' and 'contain'.
   Florian: My suggestion is no effect for everything except for
            style containment.
   dbaron: The other way to do it is that containment sometimes
           changes display, e.g. can blockify it.
   dbaron: Could say that contain property wins
   dbaron: and makes your display go away.
   fantasai: Making 'display: contents' “goes away” is problematic,
             what does it then become?
   SimonSapin: What’s the blockification of display:contents?
   dbaron: Block?

   dbaron: I'm okay with what Florian said.
   dbaron: Though I think some ppl might have intuition that
           containment should win.
   Florian: Seems like an error to me. Do the simple thing.

   RESOLVED: 'display: contents' causes 'contain' values to be
             ignored except style containment


Scheduling
==========

   Vlad: TYPO is willing to consider our preferences in terms of
         dates.
   Rossen: Latest is that there is a possibility that next TPAC will
           be ...
   ChrisL: End of October in Lyon is under consideration.
   astearns: Given TPAC is late October, should we aim for early
             April for spring meeting?

Ambiguities in handling url()
=============================
   Github topic: https://github.com/w3c/csswg-drafts/issues/383

   <leaverou> relevant TPAC minutes where this was discussed:
              https://lists.w3.org/Archives/Public/www-style/2016Nov/0070.html
   TabAtkins: Everybody remembers issue from awhile ago -- it's
              ambiguous whether an URL with a fragment ID is referencing
              an element in the SVG or a pant server /mask whatever
   TabAtkins: Everything is bad, and it's been bad since 2012 when
              issue was first raised by roc.
   TabAtkins: Going forward we wanted to rely on element() vs image()
              functions to make it clear
   TabAtkins: But still need to figure out what to do with url()
              legacy.
   TabAtkins: Unclear whether that should be property-specific,
              language-specific, something else.
   TabAtkins: Looking at TPAC minutes.

   TabAtkins: Some proposals:
   TabAtkins: 1. Treat ambiguous cases as url reference into an SVG
                 document, not treat as image and apply :target
   TabAtkins: 2. Treat ambiguous cases as url, if it has a fragID
                 treat as a reference, otherwise treat as an image
   TabAtkins: 3. Treat ambiguous cases, load it twice -- first see if
                 there's an appropriate reference, otherwise go back
                 and reload as an image
   fantasai: 4. Do something different per property

   * fantasai agrees with TabAtkins's summary that this is all bad.
   plinss: #3 follows Web architectural principles better. Shouldn't
           judge URL by its syntax like in #2.
   Florian: #1 and #4 also don't violate principle.
   plinss: Could be a PNG at the end of a URL. You don't know.
   leaverou: Why would an author use a fragID on a PNG?
   plinss: To crop a section of the PNG.
   plinss: We made image() function to make this unambiguous.
   TabAtkins: On the other hand, implementations really don't want to
              load things twice.

   TabAtkins: Chrome and FF seem to decide on reference vs image
              based on whether it's local fragment vs external
              reference.
   TabAtkins: Could probably just switch on that, and then later
              introduce element() vs image() functions.
   TabAtkins: Might need more info from birtles.
   fantasai: I'm okay with distinguishing based on local vs external
             reference.
   TabAtkins: No browser currently allows external SVG references.
   dbaron: Gecko does in some cases, maybe not in CSS.
   leaverou: Should not assume they never allow external SVG
             references.
   TabAtkins: Yeah, just don't need to consider it wrt web-compat.
   jet: We do for clip-path.
   dbaron: Most ambiguous case is mask.
   dbaron: But I thought we did for clip-path, filter, and mask.

   TabAtkins: Mask is the only one that's troublesome atm.
   TabAtkins: Everyone else can define per property.
   TabAtkins: If a property only takes images, or only takes clip
              paths, not ambiguous.
   TabAtkins: Didn't want to do per-property decision for ambiguous
              cases.
   fantasai: Some of these properties that are currently unambiguous,
             maybe become ambiguous in the future.
   fantasai: So in the future, would be per-property disambiguation.
   fantasai: I think fill/stroke has (or will have) ambiguous cases.
   fantasai: Fill currently takes a paint server reference, but we're
             adding image references, so it will become ambiguous.

   TabAtkins: So when you said you handle external mask references,
              is that just for mask property that only accepts
              external references?
   dbaron: We parse the mask property into longhands, so we would do
           it on mask-image, because that's where it lives.
   TabAtkins: How do you split mask-image into the two different
              cases?
   TabAtkins: afaict, you did it based on whether local or not.
   ...
   TabAtkins: Right now element() and image() have other features,
              which is why were kicked out to L4
   leaverou: Element() somewhat impl in Firefox.
   TabAtkins: We could, though, define them as subset of the
              functionality, i.e. same as url() except without
              ambiguity.

   leaverou: Option 3 is off the table?
   TabAtkins: Yeah, because cost-prohibitive
   leaverou: #2 is only a problem cuz web architecture?
   plinss: Blatant violation of web architecture
   fantasai: What about local ref vs external reff?
   plinss: Not so bad.

   astearns: Sounds to me that 1 is only viable option
   Florian: Well, 1 and 4?
   Florian: We will have to define property by property going forward
   Florian: We do #1 on currently-ambiguous cases, but will have to
            define property by property going forward.
   TabAtkins: E.g. fill/stroke previously unambiguous, becoming
              ambiguous with new fill-stroke spec.
   astearns: So in cases where it could be interpreted as either, it
             will be ?

   TabAtkins: Alternately could make it local vs external, like
              mask-image.
   fantasai: For mask-image, what are the possible things we could
             actually do?
   TabAtkins: Depends on what FF is doing and if compat-required.
   TabAtkins: I think local vs external is def how Webkit/Blink does
              it, and it's how Gecko used to work.
   birtles: Still does.
   fantasai: So sounds like we *have* to do mask-image that way.
   fantasai: Should we resolve on local vs non-local?
   leaverou: Makes sense now because external reference aren't
             possible.
   fantasai: But we will have unambiguous syntax for that.
   leaverou: But by adding a fragID, author made their intent clear.
   TabAtkins: No, they didn't, because e.g. might be using svg stacks
              where fragID is triggering :target
   plinss: Can use a media frag to pull a frame out of an MP4.
   leaverou: ok.

   <birtles> fwiw the Firefox code I'm looking at is
             http://searchfox.org/mozilla-central/rev/214345204f1e7d97abb571b7992b6deedb5ff98f/layout/style/nsCSSDataBlock.cpp#64
             which at least indicates we don't trigger an image load
             if it's a local reference
   <dbaron and birtles investigate Gecko code>
   <dbaron> The point where we actually branch between the SVG vs.
            image-tiling case is in the function PaintMaskSurface in
            nsSVGIntegrationUtils.cpp...
   <dbaron> And as far as I can tell that's just a function of
            whether a pointer is null, which is null as a function of
            whether we managed to find an SVG Mask Element...
   <dbaron> the thing that it's testing for null was set up in the
            constructor nsSVGMaskProperty::nsSVGMaskProperty()

   astearns: First proposed resolution is distinguish these cases on
             mask-image via local vs external reference
   astearns: which matches implementations, as far as we can tell.
   astearns: Any objections?
   dbaron: I'm not sure if that's actually happening. Things are
           fancy here.
   dbaron: Not sure if it matters.

   RESOLVED: mask-image distinguishes element reference vs image
             reference via local vs external reference in url()

   TabAtkins: I'm betting we could apply local vs external globally,
              on account of local hash bg images are broken right now
              anyway, unless your HTML is also a PNG.
   leaverou: What about hashes on data URL? If SVG was in a data URL,
             and has a hash?
   TabAtkins: That's still an external URL as far as loading pipeline
              is concerned.
   leaverou: I suspect that's something I've used...

   astearns: For second instance?
   fantasai: Second instance is now, fill-stroke.
   astearns: Maybe wait until we have more info?
   astearns: e.g. dbaron figuring out gecko code.

   xidorn: Person who implemented mask-image says we do check if
           target element is mask element after we load the file.
   fantasai: Question is, after you check it and it fails the check,
             what do you do?
   dbaron: I suspect we do two loads.
   plinss: Don't want to require impls to all do hardest least
           performant thing, but don't want to preclude doing it
           correctly.
   astearns: Seems we have to leave this one for now.

   dbaron: Anyone have a technique for making a file that's both a
           valid SVG and a valid PNG?
   Florian: I don't but I know who would.
   dbaron: Might be able to test SVG as SVG.
   Florian: If you need, try p01 on twitter, he makes crazy demos
   dbaron: I think we just need an SVG that's a circle and a mask
           that's a square.

[comments from after the meeting on this topic]
   <dbaron> Here's a test showing that Gecko's distinction is based
            on whether it can find the mask element:
            https://dbaron.org/css/test/2017/mask-url
   <dbaron> The image is here: https://dbaron.org/css/test/2017/
            mask-url-image
   <dbaron> the test links to a mask element that exists, and a
            fragment that doesn't exist.
   <dbaron> The former users the mask in the mask element and ignores
            the mask-size, mask-repeat, etc.; the latter uses the
            toplevel SVG as a mask and honors mask-repeat and
            mask-size
   <dbaron> so the upper test shows a single circle, and the lower
            four rects

CSSOM
=====

   SimonSapin: We have href attribute on stylesheet and cssimportrule.
   SimonSapin: We should be using USVString, because they are URLs
   SimonSapin: Can we resolve to do that?

   RESOLVED: USVString for href attributes on stylesheet and
             cssimportrule

Received on Saturday, 27 May 2017 00:45:54 UTC