- From: Dael Jackson <daelcss@gmail.com>
- Date: Sun, 21 Feb 2016 14:49:11 -0500
- To: public-houdini@w3.org
- Cc: www-style@w3.org
=======================================================
These are the official Houdini Task Force minutes.
Unless you're correcting the minutes,
please respond by starting a new thread
with an appropriate subject line.
=======================================================
Worklets
--------
- There needs to be a declarative way to load code into worklets,
but that method is currently undecided.
- Both <link> and <script> were suggested, but there wasn't a
final decision since it wasn't needed for FPWD.
- Worklets will be separated by purpose and the general
renderWorklet will be removed.
- RESOLVED: Reject scripts on error (Issue 51).
- There's currently an open issue in regards to the
non-determinism of worklet scopes. The group will revisit the
topic in six months to see if there have been further
developments to help reach a conclusion.
CSS Paint
---------
- unregisterPaint() and all other unregister functions were moved
to v2 due to complexity.
- RESOLVED: Remove canvas text drawing styles and canvas text.
- RESOLVED: Defer OverflowCallback to v2
- RESOLVED: punt sideloading images and other data.
- RESOLVED: Keep 'Geometry' name in Paint method callback.
- RESOLVED: Keep existing Paint name; registerPaint()
- RESOLVED: Option 1, ignore Paint callbacks for cursors
- RESOLVED: Do both input properties and input arguments
- RESOLVED: Things should happen on the same frame (in reference
to when callbacks run).
- The text for addressing intrinsic sizes should closely mirror
CSS Images.
===== FULL MINUTES BELOW ======
Agenda: https://github.com/w3c/css-houdini-drafts/wiki/Sydney-F2F-January-2016
Scribe: jet
Worklets
========
Rossen: Next up, worklets.
iank: We need things off main thread
iank: We need to apply changes that can do off main thread (eg.
paint)
iank: We need a sane scripting environment,
iank: eg. workers.
iank: Though workers allow too many things eg. timeouts,
iank: there's a need async API for authors,
iank: hence worklets.
iank: API is empty global scope.
iank: API to main script can import a JS module like this. On main
window, can import scripts,
iank: that can do layout or paint hooks.
iank: Worklets are the main thread interface.
iank: We want to be able to share worklet scope.
iank: Worklets aren't constructed by authors.
Loading code into worklets
--------------------------
iank: There needs to be a declarative way to load code into
worklets, maybe link tag?
zcorpan: Module scripts?
iank: Yes.
iank: That sits on top of new module script infrastructure.
iank: It's nice for composition of libraries.
zcorpan: For modules, why do we need import when ecmascript
doesn't?
iank: Like script type=module syntax,
iank: but still need declarative way to do it.
iank: <link> makes better sense than <script> for this.
zcorpan: But <link> has "safe" semantics unlike <script>.
iank: I'm not sure what's the best way.
iank: esprehn: We need a way to instantiate script in another
context,
tantek: there was a proposal to have that be <link>.
iank: It's not needed for FPWD
<tantek> link rel=script in particular in XHTML days. never got
uptake
Number of worklets
------------------
[https://github.com/w3c/css-houdini-drafts/issues/98]
iank: How many worklets do we want?
iank: The spec now says one generic rendering worklet.
iank: The other idea is to have multiple worklet scopes and hand
these out among threads.
rbyers: Why on main thread, why differentiate worklet count?
iank: Audio may need different worklet types/count.
iank: We may need to handle worklet lifetime differently.
rbyers: If we can't reason about instances, why does it matter?
esprehn: We should be able to reason about worklet scope (eg.
paint, layout).
iank: Do we want to have both paint and layout to go to one type?
Rossen: Why not?
Rossen: We don't require that layout happens before/after paint.
surma: If there's only one generic worklet, can we invoke multiple
worklets?
iank: You can inject multiple scripts. UA determines how many to
spin up.
iank: There's memory cost with discrete worklet types.
Rossen: We shouldn't spec that and instead allow UA to set types.
iank: UA can choose to merge them.
Rossen: That's an implementation detail.
rbyers: Paint/layout as separate is up to UA?
rbyers: Author may need to know which worklet to send scripts to.
esprehn: It's not OK to not know which is which.
Rossen: paint/layout/DOM in parallel on one worklet seems
unworkable.
rbyers: workletcount != thread count. Multiple scopes should allow
this.
iank: You can rip out single renderWorklet and separate out
worklets.
iank: You get one empty global scope, no generic execution callback.
<zcorpan> (<link rel="import"> violates the "link is safe"
assumption)
smfr: Can you postMessage?
iank: No.
smfr: Layout worklets can detect side effects?
iank: Yes, in layout but not paint.
Should scripts throw upon import?
---------------------------------
<Rossen> https://github.com/w3c/css-houdini-drafts/issues/51
iank: When you import a module, should scripts throw? I think not.
iank: Let the main thread handle such errors.
ojan: There's no use cases for avoiding exposing side effects.
ojan: Is there a use case for throwing in worklet scripts?
iank: Reject promise on failure?
esprehn: Yes, should expose failures here.
RESOLVED: Reject scripts on error (Issue 51).
Security Concerns
-----------------
iank: There's security implications.
iank: Should use credentials?
iank: Do same as workers, in worklets?
ojan: It's good to minimize differences with workers.
iank: Should we spec to randomly assign callbacks between worklets?
iank: The spec says UA decides how many worklet global scopes
there are.
iank: So UA internals aren't exposed.
iank: Spec it so that UA must have at least 2?
Rossen: How do you verify?
ojan: If you only have one scope, all scripts assume one for all
UA's.
ojan: One way to solve that is to require > 1.
ojan: It's forward-compatible with multi-threaded implementations
ojan: It prevents authors using globals and expecting state
preserved.
Rossen: Can we expect that state is dropped between calls?
iank: Read-only for global objects?
esprehn: That's really hard--so much mutable state.
rbyers: ServiceWorkers intentionally shut down to avoid similar
problem.
ojan: We can kill things in background tabs.
iank: 2 is probably the best option.
ojan: The trouble with two is that you require 2x memory etc. by
default.
rbyers: Let's not spec 2, so we have flexibility.
zcorpan: Can't we kill worklets more aggressively in devtools, etc?
ojan: You could have 2nd worklet scope be lower priority.
shane: Is it true that worklet scopes can't die in the middle of a
render?
iank: No.
rbyers: We can't do the naive thing and just do one scope.
iank: We will spec that way.
esprehn: As a developer, if we rarely share scope in production vs.
development, hard to debug against.
rbyers: We need some amount of non-determinism here.
esprehn: How about there's only ever one, but you can opt into
parallel behavior?
plinss: But multithreaded browsers have to emulate single threaded.
iank: We decided to split out paint/layout as separate worklets.
shane: 90% use case is parallelizable.
Rossen: I'd prefer read-only marking of scope data from other
worklets.
iank: I've made an open issue: non-determinism of worklet scopes
iank: Let's revisit in 6 months
zcorpan: We prevent global scope via cross-origin documents now,
can we reuse that mechanism for worklet scopes?
esprehn: We need more implementer experience, let's revisit.
iank: I'll ask for FPWD for worklets this afternoon.
CSS Paint
=========
unregisterPaint()
-----------------
iank: There's been a couple changes since Sapporo.
iank: unregisterPaint() removed.
iank: It got weird.
iank: unregisterPaint() function in the middle of a paint callback
gets crazy.
iank: Callbacks don't get removed from scope now.
esprehn: 2 use cases: writing tests & hot reloading of scripts.
esprehn: We've been punting all unregister functions to v2 to give
time for definitions.
smfr: Can you register 2 of the same name?
iank: No.
smfr: It seems unregister should happen on main thread so
callbacks can finish.
iank: We could spec it that way.
xidorn: Probably could unload a module from a worklet to get that.
xidorn: You could record all loaded modules, then just remove one
and reload.
iank: That sounds like v2.
smfr: It seems weird to not have unregister when you have register.
shane: There's no way to tear things down.
ojan: We can build Paint without it.
iank: unregisterPaint() behavior is hard to spec, if not needed.
ojan: e.g., undo rasterized effects?
smfr: It prevents libraries from overlay behavior by replacing
existing registered items.
shane: That's still possible but trickier.
<shane> actually my comment only applies for libraries that know
about each other. If you want a library to progressively
overlay without coordination then yeah you do need
unregister
PaintRenderingContext2D
-----------------------
iank: Next change: HTML spec ripped out into tiny pieces
iank: See PaintRenderingContext2D in spec
<Rossen> https://drafts.css-houdini.org/css-paint-api/#2d-rendering-context
iank: The note derived from Canvas2D API in HTML.
iank: Is there any reason to disallow text?
smfr: How about resolved fonts?
iank: Only resolved fonts are allowed in the worklet.
iank: The font attribute is a bit magic (just the shorthand).
iank: Only resolved TypedOM font object allowed for text API.
Rossen: What about font fallback?
iank: Let's remove canvas text drawing styles and canvas text.
RESOLVED: Remove canvas text drawing styles and canvas text.
DrawImage
---------
iank: DrawImage
iank: Allow drawing TypedOM images.
iank: We need to add TypedOM CanvasImageSource equivalent.
astearns: How do we add stuff back in future versions, eg. text?
iank: if(context.drawText) is one way.
OverflowCallback
----------------
iank: There's an open issue: do we jettison OverflowCallback?
iank: OverflowCallback lets you read computed style and add
additional paint area for box shadows etc.
iank: The difficult part is that it's a CSS Image, and need to
spec what happens to a CSS Image when it grows like that.
iank: It seems too hard to do that now.
iank: I'm not sure it belongs in this spec.
iank: It probably needs to be somewhere other than CSS Image in
the future
SteveZ: What's blending/compositing before/after behavior?
<dbaron> You can do overflow without this with
border-image-source: paint(foo); border-image-slice: 0%
fill; border-image-outset: <overflow dimensions go here>
surma: Does it allow clipping masks?
ojan: dbaron's CSS seems sufficient now.
<dbaron> Yeah, what iank is saying about a paint API v2 (that lets
you take over the whole element, or maybe layers, and
deal with masking, etc.) sounds like a neat v2.
smfr: The author shouldn't have to specify overflow for that case.
ojan: You'd need to call paint callbacks to get that geometry.
heycam: I agree that CSS Images is insufficient here.
heycam: e.g., sparkly image button effects,
iank: or chat bubbles.
iank: We'll punt OverflowCallback to v2
RESOLVED: Defer OverflowCallback to v2
Calling registerPaint with the same name more than once should throw
--------------------------------------------------------------------
iank: Issue 7: Do we care about sideloading images and other data
into worklets?
iank: Basically need to use TypedOM instead.
shane: I don't like sideloading images.
Rossen: Agreed.
iank: We'll punt sideloading images and other data.
dbaron: Can we still load images into Paint callbacks?
iank: es, using TypedOM.
RESOLVED: punt sideloading images and other data
Geometry interface bikeshedding
-------------------------------
iank: "Geometry" interface for width, height. We need a better name.
Rossen: How about Shape to paint into?
Rossen: Any polygon.
gregwhitworth: I like "Geometry"
RESOLVED: Keep 'Geometry' name in Paint method callback.
heycam: Use a dictionary instead?
RegisterPaint() or RegisterPaintImage()
---------------------------------------
iank: open issue: registerPaint() or registerPaintImage()?
iank: We should probably call it PaintImage for future-proofing.
smfr: It would be nice to match usage in CSS.
ojan: Let's stick with what we have here.
RESOLVED: Keep existing Paint name; registerPaint()
Callbacks for Cursors
---------------------
iank: Issue: what to do about cursor?
iank: CSS Images are allowed in cursors.
iank: Do we let Paint callbacks happen for cursors?
iank: option 1: Ignore it.
iank: option 2: Call it once and cache image for cursor.
iank: option 3: Crazy option; to always call back for animations.
dbaron: It could be just like an image cursor that you have to
invalidate yourself.
gregwhitworth: Let's punt for now.
RESOLVED: Option 1, ignore Paint callbacks for cursors
iank: Spec text will state that "invalid image"
<heycam> If you use paint() in the cursor property, then it's
always treated as an invalid image, and so fallback to
the next cursor type after the image.
<tantek> verified that caret only takes color for now
<tantek> https://drafts.csswg.org/css-ui/#propdef-caret-color
<shane> SVG carets: https://commons.wikimedia.org/wiki/File:Carrot.svg
<br length=20>
Use Input Arguments?
--------------------
iank: Next issue: currently, Paint uses a list of input properties
and explicitly invalidate on.
iank: Do we use input arguments instead?
iank: The downside is that you can't, for example, offset just
color property.
iank: Basically, Paint can accept a bunch of input props when you
register.
iank: The problem is you can't reuse the same function elsewhere.
iank: The solution is to use arguments instead.
iank: e.g., for linear gradients, you can reuse with different
arguments.
iank: The problem is that you can't use var(color), need var(--bar)
to preserve token stream.
iank: See issue 100
<dbaron> https://github.com/w3c/css-houdini-drafts/issues/100
esprehn: You'd want both input list and input arguments.
iank: option A. use input props as-is
iank: option B. input arguments
iank: option C. use both
<dbaron> Could also pass renamings rather than positioning
arguments, e.g., --foo=--quux
dbaron: I'm not crazy about positional arguments.
dbaron: I'd rather have named arguments.
iank: Input properties are slightly easier to use.
iank: Properties are spec'd for performance reasons.
iank: You can limit mutable properties.
surma: How about using input properties list and also allow custom
variables to be remapped?
surma: How about using only defined named parameters to avoid
having 2 ways of passing arguments?
shane: Properties have implicit dependencies on other properties.
shane: It's bad to have to specify which arguments you accept each
time. I think we need both.
iank: How about input properties for now?
shane: How about both for now?
heycam: Input arguments creates CSS functions that aren't like
other CSS syntaxes e.g., gradients has more ergonomic
syntax.
shane: typedOM can allow better ergonomics in the future.
ojan: No objections to both?
RESOLVED: Do both input properties and input arguments
When do callbacks run?
----------------------
iank: Next issue: When do these callbacks run?
iank: e.g., callback before a frame paints,
iank: or, allow long running callbacks to smear across frames.
smfr: There should be synchronization between changing style from
script and scripts that cause paint callbacks to run.
dbaron: Agreed
Rossen: We should be able to handle both.
RESOLVED: Things should happen on the same frame (in reference to
when callbacks run).
iank: next issue: no way to prerender in constructor for reuse in
multiple frames
<dbaron> smfr: seems like a special case of getting arbitrary
images into paint callbacks
<jet> https://github.com/w3c/css-houdini-drafts/issues/101
Declaring intrinsic sizes
-------------------------
<astearns> https://github.com/w3c/css-houdini-drafts/issues/31
iank: Open issue: how to declare intrinsic sizes?
esprehn: We need intrinsic size to do tiling.
smfr: Why not use background size?
esprehn: We can't do that for border image.
dbaron: You can't tile for border image anyway.
esprehn: For border image, what intrinsic size do you get?
ojan: There's 9 pieces to border image.
esprehn: Also list marker image.
dbaron: The default is 1em x 1em or something like that.
<dbaron> https://drafts.csswg.org/css-images/#object-sizing-examples
esprehn: In v1 do we punt on intrinsic size?
ojan: Does SVG have interoperability for that case? (no intrinsic
size?)
dbaron: Gecko has bugs there, especially border image + SVG
shane: Can we use border-image width?
dbaron: Read CSS Images carefully to get spec text.
dbaron: If CSS Paint needs to define the image it produces as
having no intrinsic dimensions.
<dbaron> https://drafts.csswg.org/css-images/#intrinsic-dimensions
<zcorpan> http://software.hixie.ch/utilities/js/live-dom-viewer/saved/3848
list-style-image with intrinsic-sizeless svg
shane: We need a reasonable thing for border image.
shane: There's lots of requests for new border effects.
Received on Sunday, 21 February 2016 19:50:10 UTC