Discussion:
[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]
(too old to reply)
fantasai
2017-05-27 00:45:05 UTC
Permalink
Raw Message
=========================================
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

Loading...