Minutes Berlin F2F 2018-04-11 Part IV: Web Animations [web-animations]

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


Web Animations
--------------

  - Implementations are in progress for Animations and there were
      several pieces of implementor feedback discussed.
      - The spec naming around timelines are currently all about time,
          but there's interest in having it more about progress.
          However, it may be too late to change due to implementations
          that have shipped.
      - Querying the main thread for state will be similar to how
          threaded scrolling.
      - In Level 2 there is interest in exposing a web animation api
          to be used by javascript objects.
      - The focus of Level 2 will be to offer extension points to the
          core specified in Level 1.
  - UA must implement coalescing for forward filling animations (Issue
      #2054)
  - Most people felt that returning the longhand to getKeyframes()
      would be sufficient, though doing better would be nice.
  - Issue #2359 (Clarification about "make animation’s start time
      unresolved") came from misreading of the spec, but raised a
      different problem that setTiming doesn't do invalidation so a
      separate github will be opened.
  - There's a desire to have a timeline attached to a media source but
      there are several possible solutions that need to be evaluated.

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

Agenda: https://wiki.csswg.org/planning/berlin-2018#schedule
Breakout Agenda:
https://docs.google.com/document/d/1j3oeLpgX6kneG9lEgZQ80kitdyN-vbAYGPiwtYyN3tw/edit#

Scribe: flackr

Schedule Note: During this time block the group split into two
    sessions, one for CSS Text (see Part III of minutes) and this
    session based on CSS Animations

Web Animations
==============

  birtles: We're implementing web animations in gecko, blink and
           webkit at the moment, one goal is to ship getAnimations
           which lets you look at CSS animations and transitions from
           javascript
  birtles: There's a few things we need to address, mapping between
           css animations and web animations.
  birtles: Another is pseudo elements and how to represent them.
  birtles: We were expecting a ?? api on the web platform by now but
           this hasn't happened yet.

AnimationWorklet Implementation Feedback
----------------------------------------

  birtles: Let's start with AnimationWorklet.
  majidvp: AnimationWorklet was previously similar to paintworklet,
           you would input style, and output style values directly.
  majidvp: This was a major objection because it was an animation but
           had a parallel world. The request was to make it fit better
           with the webanimation model.
  majidvp: The new model works very much like a custom animation. It
           allows you to customize what the animation does, where
           animations take the current time and apply a linear
           transformation to set the keyframe time
  majidvp: We allow the authors to replace this with a function which
           inputs time and outputs time.
  majidvp: This allows you to do animations off thread, with state.
  majidvp: You can also have a scrolltimeline and other types of
           timelines, i.e. pointer timeline, gesture timeline, and do
           more interesting things inside the function imperatively.
  majidvp: In the future we'll also use the grouping mechanism from
           animations level 2 to do more interesting things that
           affect multiple elements with custom coordination between
           them
  majidvp: We have a whole set of examples: scroll -inked examples,
           examples with state, pull to refresh--which coordinates
           handoff between timelines
  majidvp: These can all be done without a lot of complexity inside
           AnimationWorklet.
  majidvp: People have been asking for custom animations. One way
           AnimationWorklet is working in this direction is that you
           can do these things off of the main thread while preserving
           the ability to do custom effects.

  Rossen: On Monday you mentioned scroll triggers as well, besides
          time. Everything we've talked about up until now has been
          time based. How does scrolling control time
  majidvp: There's already a proposal to map scroll to become a
           timeline. Animations allow for an abstract time which
           doesn't have to be wall time, allowing you to map a scroll
           position to a time value which can also be fed to normal
           web animations keying off of scroll
  majidvp: This can also feed into custom animations / animation
           worklet, allowing you to use scroll offset.
  majidvp: There's the possibility to have richer timelines such a
           pointer timeline or touch timeline.
  majidvp: I have a separate proposal to generalize the timeline
           proposal, the timeline currently is only a double.
  majidvp: So to map scroll directly you need two timelines, but if we
           allow flexibility in what constitutes a time then you could
           have a multi-pointer timeline
  majidvp: These are all experimental. For scroll we have an easy way
           based on the scrolltimeline proposal

  smfr: There's two ways of thinking about this, time could be
        progress or time could be time.
  graouts: There is a notion of progress in webanimations in the
           computed timing. Progress is what computation of effects is
           based on - but the only properties that you're manipulating
           are time related
  birtles: It says in the introduction that these time values normally
           represent time but maybe we shouldn't call it time.
  graouts: Reality is that right now everything is time.
  birtles: But we really just want progress
  birtles: Progress is really a fraction between 0 and 1 and start
           times are outside of that range
  birtles: We'd have to think about the term a bit
  birtles: Maybe it's worth rethinking but we've already shipped
           interfaces based on the naming
  graouts: Personally I think it's okay keeping something mostly time
           driven to express the API, but in my mind when we're
           thinking of additional inputs we should compartmentalize
           these things as a phase which just uses these inputs to
           produce times
  graouts: Current time would be the local time for an animation
  birtles: I think in level 2 that's exposed

  graouts: Looking at the AnimationWorklet spec. I'm thinking about
           producing these values for a timeline in a more declarative
           way
  graouts: For example, given a region, produce a progress through
           that. We'd like to avoid having to worry about layout
           values or having to resolve layout during scrolling
  graouts: We might want something more abstract
  surma: Is that currently a possibility?
  graouts: No, but I don't mean about animation particularly
  majidvp: I agree, we have been implementing a scrolltimeline and
           have found a lot of issues, like knowing which offsets to
           specify in the scrolltimeline when the container changes
           sizes. Suddenly the duration you specify no longer matches
  majidvp: We should go back and work this out to be more flexible
  majidvp: It's very easy to do the wrong things with this
  majidvp: Normally animations, when you call play, record their start
           offset, but this doesn't make a lot of sense for scroll
           linked animations
  majidvp: This notion of progress helps make things make more sense.
           The progress comes from the time or the scroll timeline

  smfr: Does a scroll-linked animation behave like a scroll-linked
        animation with a rate of 0 and you scrub through it
  majidvp: Yes
  birtles: The playbackRate is still 1, but it doesn't get any updates
           until you scroll
  surma: playbackRate doesn't really make sense
  smfr: If you want to multiply around the scroll rate you would do
        that programmatically?
  birtles: You could use rate
  smfr: Another difference is the model that drives the animation.
        I.e. does a scroll linked animation tick at 60fps?
  majidvp: Yes, we think so, to avoid burning cycles

  surma: Should we spec this or is it just an optimization?
  graouts: The API doesn't expose anything related to an actual tick
  smfr: Is it implicit that there's a 60fps clock?
  surma: I think the intention is that we can do frame perfect effects
  birtles: The current model is through the document timeline, which
           is from the html spec is a step where you update the
           timelines associated with the document
  smfr: When does html spec update document?
  smfr: i.e. doesn't tick regularly
  birtles: It's just spec'd that the browser will update the
           rendering, so we need to spec when the scrolltimeline gets
           updated

  smfr: Feels to me that the cleaner way would be for webanimations
        specs to have some wording about when the animations need to
        update which feeds into the html5 event loop
  birtles: I tried to do it that way but Domenic requested the other
           way around, with a hook to call from webanimations
  smfr: html5 spec already has problems around not specifying how
        requestAnimationFrame works
  birtles: We could add something for scrolling or more generic

  smfr: Do worklets act as a node in a time graph, which then output
        just a new time?
  majidvp: Yes, that's what makes it fit nicely with the model, it
           uses the normal flow of information in the webanimation
           graph
  majidvp: Our implementation is very simple, it's like composited
           animations, we take the current time of composited
           animations, send it to another thread which produces new
           localTime values which are fed into the keyframe to produce
           the output.
  smfr: This off the main thread is an implementation detail
  everyone: agrees

  iank: We have to put one on the main thread as well
  flackr: We want to use the same thread in our implementation,
          calling it from the main thread and block on the result to
          avoid worrying about state or global scopes
  majidvp: You can use different strategies, can have a third thread
           which you call from both like we are planning, or this
           could be separate on the main thread
  smfr: The existing webanimation spec allows users to poke transforms
        off the main thread
  flackr: I don't understand the concern because you can only look at
          your input times so you couldn't trigger an animation from
          that context
  smfr: If the main thread is blocked, but your worklet is running and
        spits out new values will you see transforms change?
  smfr: Does the web animations spec require a main thread step before
        it can change transforms?
  majidvp: It's similar to how we do composited animations right now,
           the compositor thread can be ahead
  majidvp: You can query that state on the main thread, and it gives
           you what it thinks that state is based on its current
           notion of time which may be different from what's being
           shown to the user
  majidvp: We'll have the same model. The AnimationWorklet is working
           producing new values, and the value you have from
           AnimationWorklet is stale from the last sync
  surma: It has a snapshot of the most recent values
  majidvp: Similar to threaded scrolling

  smfr: If there's more than one webanimation running, maybe one is on
        the main thread. Do you still let the accelerated ones
        progress off the main thread
  birtles: There's different heuristics for example if you're
           animating margin and transform with the same start time we
           do both on the main thread
  birtles: Can you run AnimationWorklet both on the main thread and on
           the compositor in parallel?
  flackr: You can actually run it synchronously
  surma: The worklet concept allows that but the spec doesn't
         currently prescribe that
  majidvp: Technically you can run two copies, with different state
  flackr: It doesn't have to be a copy, because the worklet runs on a
          parallel thread you can call it from the main thread and
          synchronously wait for the result
  majidvp: Yes, you can have one thread where this is running and get
           main thread updates, or you could have a separate
           globalscope for use from the main thread to query
  smfr: This gets back to the update model, how often does a worklet
        run?
  majidvp: Yes, and webanimation allows this. Wall clock time is
           always changing but it's up to the implementation how often
           it samples the animations
  majidvp: As birtles pointed out, time animations at the frequency of
           the rendering loop. There's this notion of the animation
           being dirty based on timeline input and how often you want
           to sample which is usually based on a vsync or the
           rendering loop
  majidvp: For scroll timeline your timeline is only dirtied when
           things scroll, but you can sample it when you want
  majidvp: For us, we mark it as dirty, but we only sample the
           animation when there is rendering
  smfr: ok
  birtles: Also some things can change timing properties, typically we
           update the timelines at the beginning of a tick, run raf
           callbacks etc. changing anything about the timing could
           affect the ultimate progress value
  smfr: So lets say you have a worklet which wants to output a step
        function, its input is continuously dirty and the output
        should only be occasionally dirty
  birtles: We record the progress the last time we called, that way if
           we have multiple changes we don't duplicate work
  flackr: It's worth noting the stale values model doesn't have to be
          the case since we could call the worklet and wait for the
          result

  smfr: I'd like to see AnimationWorklet be one particular
        implementation of webanimations. A naive model could be a
        quantizer, etc.
  majidvp: Right now that placeholder is actually the animation. Maybe
           we need more wording around when the state of the animation
           is dirty
  majidvp: It's perhaps not clear when inputs change or outputs change
           when you're required to sample these things
  iank: I think about it that web animations level 1 describes one
        internal animation run for how you receive timelines and how
        inputs change and worklet animations replaces that whole
        timeline
  smfr: That's more significant than I was thinking
  smfr: I was thinking maybe you take the whole animations graph and
        run that graph off thread
  smfr: The model we're talking about now is you modify that timeline
        on the main thread and then run things off the main thread?
  majidvp: Group effects allow you to combine effects, they're not
           group animations, which would simplify things quite a bit
  majidvp: The only place animations actually interact is during
           effect stack resolution. Multiple animations can be
           outputting to the same property and that's where you have
           to resolve that
  majidvp: Right now for example, if we detect that there are two
           animations writing to the same property we don't put it on
           the compositor, because you need to resolve the values at
           the end of it
  majidvp: What we have with the current notion of AnimationWorklet,
           AnimationWorklet using the stale value allows you to
           combine these things

  smfr: Does level 2 allow for hierarchical timelines?
  birtles: No. Initially we tried having a graph with different modes
           but we ran into a lot of problems with that
  birtles: Most animation frameworks restrict play controls to the
           root node, i.e. pausing and rewinding
  smfr: How would an effect hierarchy work?
  birtles: Animation control runs at the root, passes its time down to
           the next node. The groups calculate their time based on
           their children and pass a portion to each children
  smfr: I see, so that's for sequencing, etc
  birtles: Then you can use delays like a negative start delay to
           modify start times
  smfr: So the only way worklets feed into that is by modifying time
        values
  majidvp: Yes, so for example given a group effect, we want to hook
           directly to the time value of children. You could feed the
           time value to the top of the hierarchy or potentially reach
           directly into each child time
  graouts: This would be valuable for transition effects, because you
           don't want to necessarily generate 200 animations ahead of
           time but rather receive a progress and say where children
           are
  smfr: That breaks the concept where a worklet is modifying a single
        time value
  majidvp: Yes, but we imagined it as a more generic abstraction of
           GroupEffect which doesn't have to be parallel or sequence
           which is one way of describing interesting more powerful
           effects
  majidvp: You just provide the grouping without any particular
           scheduling of sub effects, and animation worklet just
           outputs time values which are not necessarily parallel or
           sequential
  graouts: Another way of looking at it, there isn't actually group
           effect in any way, you just delegate the application of the
           timing model to a worklet which implements this behavior

  graouts: I've been meaning to bring this to the group, we'd like to
           allow the web animation api to be used by javascript objects
  graouts: Web animations knows how to write these values, you should
           be able to just take a progress and do something with that
  graouts: There's a similarity here, you want to have one single
           thing act as the needle to feed input to particular
           effects. The trick is how can you do this efficiently which
           is what we're trying to solve with animation worklet
  birtles: We used to have this custom effect, but we simplified it
           down to just a one sample callback, for things like
           updating strings where over time you want to change a
           number - something you can't easily do with just a number
  birtles: This is in level 2, but it's a totally different extension,
           hanging off the effect
  majidvp: Right now AnimationWorklet just allows you to register an
           animator, but you could register an effect
  majidvp: Because it's sandboxed you could run it off of the main
           thread
  majidvp: In the sample callback you could for example make an http
           request, but once it's in this worklet scope ...
  graouts: I agree extension points need to have a detailed scope so
           you can reason about what it can do
  birtles: That's what you want sometimes
  graouts: Sometimes yes, but people who know what they're doing
           should have a clear idea about what work can be done and
           give that as input to the engine to do something smart with
           that
  smfr: Assuming it's pure output, it can just be a callback in
        javascript, that's fine, but we need a sandbox for more
        complex effects
  graouts: Libraries are just abstracting over writing to cssom, if we
           get a sandbox where we know what you can touch this is safe
  iank: You didn't like this because it's not how your style engine
        works. We previously had an applyHook which allows you to take
        computedStyle after style recalc and muck around with it,
        which I think is what you're describing
  graouts: No, in my mind your library has its own model and you're
           just setting values on it. you just want to be told time
           has progressed and you can update your rotation to be 70 *
           360 ...
  graouts: You're the one who's setting the style
  iank: I think this is what AnimationWorklet is giving you
  graouts: You want to be animating a custom value like my property
           which is a number, and as that number is animated it tells
           you
  graouts: It's different than a timeline, but has a lot in common
  majidvp: Right, it's right now that the web animation output is only
           style values but you're suggesting a keyframe effect which
           outputs something other than style
  graouts: And you may be changing a canvas element or a dom object
  iank: I see, instead of an element you've got some back door
  birtles: We used to wrap that up in custom effect with an onSample
           callback
  graouts: There are definitely different ways you could do it but its
           at the end of graph resolution

  majidvp: Another interesting idea is generalizing the notion of a
           time which can feed into a much richer graph of nodes
           rather than just progress values or simple time values
  majidvp: You could feed in x and y coords for example which
           manipulate a 3d model in response to a finger
  birtles: Yeah, the thing that's concerning, we're looking at
           shipping this effect timing stuff and I'm wondering if we
           should move the concept of the time hierarchy to the
           animation end and just deal with fractional progress values
           before we ship this interface
  iank: That's one thing surma that you found playing around with
        AnimationWorklet api difficult, localTime was weird and you
        expected progress, right?
  surma: It took some getting used to. I was mostly concerned about
         the array thing but global time was fine. It's fine to keep
         the time metaphor in the developers head.
  surma: Not sure if it was spec or impl but we were rounding to
         microsecond resolution which meant that when I defined 0 to 1
         turned into 0 to 1 ms which caused rounding errors and
         jittery animations
  surma: So pretending that it was still time caused these issues

  birtles: Bringing up the dev mindset thing, if you've got 3 things
           that happen and they take 3s each, if you've got a time
           it's very natural to think of
  birtles: If we switch to progress then you have to think about
           fractions , i.e. 0.33
  graouts: Thing is, if you're thinking in time, then time based api
           will be much better
  birtles: Which is the more natural way? absolute values (times) vs
           percentage values (proportions)
  birtles: i.e. do you calculate the overall time from the components?
  majidvp: That's a good question
  birtles: I think scroll from a proportioning perspective makes sense
  surma: I think if you're doing more complex things you want to
         choose numbers that are nice even things, for example I just
         chose 0 to 10000 for my scrolltimeline and doing math to
         convert which resulted in awkward numbers
  surma: Having to define the max time is beneficial to keep the
         numbers easy to work with

  ant1: Should we be discussing the agenda, but also value to have the
        open discussion.
  majidvp: I think this is fine, fine if you want to move to more
           concrete
  ant1: Was curious, with what you have in mind with schedules,
        aggressively more forward?
  majidvp: A little aggressive on it, goal to enable this interactive
           effect, animations worklet is first step, then more
           interesting inputs, then interesting outputs
  majidvp: Have impl, on stable, goal for next 6mo. stabilize impl, do
           origin trial, get feedback, bring this feedback back to the
           WG. Trying to make sure the overall arch. makes sense.
  ant1: I think we need to have our own discussion about it to provide
        feedback.
  majidvp: If someone from apple is interested and wants to be
           co-editor, that'd be great.
  majidvp: Could also help drive the webanimations level2 features as
           well.
  majidvp: Being aggressive with it, good not to fall behind level 2.
  flackr: If we had richer timelines, we could do everything that we
          were doing with animation worklet today.
  birtles: I don't think effect is the right level.
  flackr: Scroll would come into as a timeline.
  birtles: I think you are mixing scroll and time it should be
           happening at the root.
  majidvp: You actually want to control the playback of the effect.
           Its the animation that actually knows that.
  flackr: Makes more sense where it is as an animation.
  majidvp: Its a very natural node in the graph to do powerful things.
  majidvp: You do need to have generalized time, to do interesting
           things, but at the moment we can get away with simple time,
           but want more later.

  smfr: I still want to get back to the model where webanimations
        defines lots of specific apis. Animation worklet might have
        many hooks into all the different places.
  majidvp: What do we need to change in the spec for all these hooks.
  birtles: "call me every time the value of this node changes" hook
  birtles: Easing is something we've talked about previously.
  birtles: Potential extension point.
  birtles: Some other way to provide inputs to the graph, i.e. input
           time values, either custom timeline, or animation worklet,
           something that takes a timeline, and ...
  iank: I think it was very powerful that worklet animation takes the
        input, and replaces the model, and drives the output directly.
  majidvp: I thought the spec does provide that hook, the animation
           concept is the thing to replace, maybe I should define the
           input to that animation, and then the output.
  smfr: The goal for webanim2 to define these extension points.
  birtles: <something about reading the actual output of the effect?>
  ant1: One usecase might be tooling.
  majidvp: Lets close this discussion.
  birtles: Another request we've had is to see the contribution that
           an individual keyframe has rather than target output value.

Forward Filling Animations
--------------------------
  github: https://github.com/w3c/csswg-drafts/issues/2054

  birtles: For shipping webanimations there's 3 main issues
  birtles: 1st - what do we do about forwards filling animations? You
           can easily get thousands
  birtles: Technically we need to represent these in some way
  birtles: Naive way would be to keep all of them, so getAnimations
           gets back everything affecting animated style
  birtles: This is obviously not desirable, but is what we do in
           firefox today and there's a demo on the greensock page
           where firefox is much slower because of that
  birtles: You don't have the same issue with css animations because
           you usually cancel the old ones
  graouts: How can you remove them though?
  graouts: They certainly exist in the implementation
  birtles: The bare minimum is their effect still has to remain
  birtles: There should be some way to tell what animation is doing to
           an element due to 500 forwards filling animations you need
           to be able to tell its doing so because of an animation
  birtles: And you should be able to cancel that animation somehow
  birtles: You shouldn't get stuck
  birtles: We've gone through lots of proposals, keep thinking there's
           some simple answer but we keep coming back to this one
           solution
  birtles: You have a fill animation which is mostly read only but
           represents all of the forwards filling animations that we
           could coalesce into one, and you can cancel that and it
           cancels all of the animations
  birtles: That's the basic proposal, then just have a bunch of rules
           about how to make that make sense
  birtles: For example, if you're holding onto an animation, and you
           call getAnimations, what happens if you cancel the one
           you're holding onto?
  birtles: I think there's fairly obvious rules, but it gets
           complicated because of these partially coalesced bits of
           state, especially with composite modes
  birtles: Where some of the effects combine with what's below them
           and some of the things below them may still be running
  birtles: So I've updated the issue this morning with some basic idea
           of what the rules would be.
  birtles: So I wanted to see if this was the right solution or if
           there's something simpler.
  smfr: Is it a fault of the api? Should the api be changed?
  smfr: i.e. maybe there should be replace animations instead of just
        adding?
  birtles: Yeah, some of the apis do make you do very explicit things,
           but it doesn't work very well with compositing
  birtles: Especially the sort of thing where the mouse moving
           triggers a new animation on each mouse move where the start
           is implicit and the endpoint is absolute
  smfr: You just keep accumulating?
  birtles: Yes, downside being you have thousands later on
  smfr: I guess the alternative is to represent fill:forwards in a
        different way
  smfr: Like maybe say that the animation will donate it's fill:
        forwards to ??
  birtles: There was one api where you had to call some explicit thing
           to make it remain
  smfr: It's unfortunate animations don't get gc'd
  birtles: With this proposal they could be
  graouts: Essentially want something that behaves like transition
  graouts: Where you have a transitional behavior but you've already
           committed to that property
  graouts: We could have a version of .animate that does that, which
           doesn't return anything
  graouts: I think it is an extremely common case that people want to
           write
  graouts: I think that's something we solved with webanim but it does
           seem like a common use case to say that this is now the
           truth value
  graouts: Wouldn't that be the first thing sets style in a definite
           manner but it doesn't show up right away
  birtles: But what does it set?
  graouts: I don't have a solution for this problem

  Scribe: iank

  birtles: Doesn't really work for the compositing case
  ant1: Is this a problem.... is it so that a use-case where we run
        into this problem, too many animations, becomes unwieldy, is
        it valuable to an author to reuse animations, e.g. a factory.
  ant1: Then you are welcome to get an existing animation, and re-use
        it.
  ant1: It could behave that way with an additional options in the arg
        dict.
  an1: Lots of stale animations still... that won't solve that problem.
  birtles: It could work... but sometimes wants lots of animations
           stacking.
  ant1: At this stage of the game if you want to ship something this
        year...
  birtles: Hardest part is writing the tests for all the permutations.

  ant1: If we think that this approach is worth while, concern with
        opt-out is that people won't observe the performance problem
  birtles: If we think that this approach is worth while, concern with
           opt-out is that people won't observe the performance problem
  birtles: This proposal getAnimations will return the fill
           animation...
  flackr: Any fill-forward animation that is completely replaced, you
          just cancel it as no ...
  ant1: What if you cancel the animation on top?
  flackr: You'll get the wrong behaviour.
  birtles: Even that is complicated, have to match up prop by prop.
  ant1: Could you have a concept of animations, instead of fill
        behaviour, "forever" anims, "fill-fwd" anims - but will be
        eventually removed,
  ant1: If you knew the 2nd one was at some stage cancellable... then
        could do interesting things.
  iank: <jokes about UnCancellableAnimation>
  flackr: <also jokes around>

  ant1: How likely is this for same property?
  flackr: Yeah pretty common...
  birtles: Has that complexity you need a map of what properties have
           been overridden.
  flackr: If you can cancel you can never throw away that value....
  smfr: If you made it explicit? Provide a callback that if you did
        nothing animation would get removed, but author can keep it
        around...
  iank: <muses about complexity with number of animations you need to
        keep around>

  flackr: birtles original proposal...
  smfr: What was proposal?
  <birtles> https://github.com/w3c/csswg-drafts/issues/2054
  flackr: When you call getAnimations you get a special animations
          type.
  flackr: Coalesce animations that they web dev. doesn't have refs
          to....
  birtles: In that issue outlined my recollection about what we
           discussed, and worked example.
  birtles: Slightly award thing is that everything throws, except
           cancel.
  birtles: Can call getKeyframes, etc. to see what it is setting.
  majidvp: If you have two animations that are fill-fwd on two
           properties.
  majidvp: So this animation-type just has one animation?
  ant1: Transitions, & css non coalesce?
  birtles: Yes.
  <discussion about testing this feature>

  majidvp: You can't say there is at most fill animations, different
           engines coalesce at different times?
  birtles: Internal coalesce of different animations....
  birtles: Even at the time of getAnimations....
  iank: <clarifies behaviour of get animations, web dev. sees always
        coalesced values of animations>
  birtles: <discussion about processing model of running animations>
  smfr: Different class?
  birtles: Different subclass of animations.
  ant1: Are these read only?
  birtles: Could introduce animation read only.
  birtles: Same shape an animation, something that dups it?
  smfr: Don't you need to specify this for remove? Or cancel?
  ant1: CoalesceAnimation subclass...?
  birtles: In CA how does remove work?
  <birtles> https://developer.apple.com/documentation/quartzcore/caanimation/1412458-removedoncompletion
  birtles: I think at some stage it was remove on completion....
  ant1: It just sets a property on it.
  ant1: Definitely remove on completion...

  Scribe: flackr

  smfr: So resolving to do the coalescing thing?
  birtles: We'll give it a try, we can have web platform tests to end
           up with the same behavior
  flackr: I agree, I think we want tests to explicitly test the
          coalescing
  graouts: So a UA must implement coalescing
  birtles: Yes.
  flackr: It's worth noting you need to implement the interface but
          you don't have to internally coalesce right away

Shipping getAnimations() - getKeyframes() for CSS Animations
------------------------------------------------------------

  birtles: Next issue, what is the result of calling getKeyframes on a
           CSS animation effect?
  birtles: There's some tricky bits like shorthands and variables
  birtles: For example, if you were to just set your to keyframe to
           margin-left: 10px margin-top: 20px...
  birtles: If you use shorthands in your keyframes you'd like to get
           shorthands back
  graouts: How would you know order? You'd like to have a diff
           structure
  birtles: If you do shorthand followed by longhand you could
           represent it with a dictionary
  birtles: But if they're in the other way, where longhand gets
           clobbered by shorthand we could drop the longhand
  birtles: With variables for css animations, we could expand
           everything to longhands and resolve it there, but then you
           get a more complex representation than what you specified

  graouts: We haven't considered that a problem
  graouts: When you use the api and you specify things yourself it
           makes sense that you want the same thing back, but to me,
           when you're querying css animations and transitions you're
           getting a representation of something provided through an
           incompatible system
  graouts: getKeyframes is talking to a translation of CSS
  graouts: So while it's nice to make best effort, it's not a
           requirement to do something nice
  graouts: The spec could just say longhands for everything
  graouts: What you've passed from css is gone
  graouts: Don't think this is a problem worth solving in a smarter way
  graouts: It's fine if we have a better way, we could
  birtles: There are other issues for getKeyframes
  birtles: In css animations you can animate from underlying value to
           absolute value using an easing function
  birtles: How do we represent an implicit value with an easing
           function?
  birtles: Normally you can have implicit keyframes, but there's no
           way to specify a keyframe level easing
  birtles: flackr and I were talking about this, and one idea is to
           expose a null value to represent the underlying value
  birtles: The example is in the issue, e.g. {marginLeft: null,
           steps: 5}

  smfr: Is this handling the case where a property may be missing, and
        combines with timing functions inside of the keyframes
  birtles: Yes, the webanimations model closely matches this, the
           weird problem is just applying a timing function to an
           implicit keyframe
  birtles: I thought we could use additive animation, but that doesn't
           help for discretely animated properties, like auto sizing,
           what do you say for your underlying value
  birtles: In firefox we use null internally but at the point where
           you call getKeyframes we substitute in the underlying value
  birtles: But it's not actually correct
  flackr: Just not correct in that if you were to reapply that it
          wouldn't have the same effect
  birtles: Yeah.
  smfr: Sort of feels like you're reinventing cssom.
  smfr: Maybe see if TabAtkins has opinions.

Shipping getAnimations() - PseudoElement progress?
--------------------------------------------------

  birtles: We need something to pass in.
  birtles: There are two specs to specify a pseudo element
  <birtles> https://drafts.csswg.org/css-pseudo-4/#csspseudo element
  birtles: Maybe we need to talk to astearns or fantasai about whether
           this is going to happen, but if not maybe we need to put
           the pseudo name alongside the target
  graouts: Which we'd be stuck with
  birtles: The other one is in cssom but it seems to be gone
  birtles: I'll talk to astearns and fantasai and see if they think it
           will exist or not. We implement it in firefox, not shipped
           but just a skeleton interface

  flackr: Would it be crazy to target the element?
  birtles: Yeah, dev tools would be wrong
  graouts: When we support pseudo elements we stop filling that string?
  birtles: We'll have that problem in a lot of other places, like the
           css transition event which has target and pseudo as
           separate attributes
  flackr: Maybe it's not so bad if we have to break it in the future
  graouts: If you do the right thing, you should always look at target
           and pseudo id, so you would still have a target
  graouts: What can you not do on a pseudo element that you can do on
           an element
  birtles: Can't append it to another part of the tree
  graouts: Can't set attributes..

  birtles: The other thing we wanted to do was call animate on the
           pseudo element
  flackr: We could also not have a target?
  flackr: Just for that element from getAnimations
  birtles: We'll still need it for dev tools but we could expose it as
           a chrome only thing
  flackr: I guess it depends what it needs it for
  flackr: Or we have another interface, AnimationTarget
  graouts: That's not a stupid idea, we could in general have the idea
           that animations not just target elements

  birtles: We had this interface, AnimationTarget, with element and
           pseudo element in it but we didn't have the concept of
           mixins at that point
  birtles: Now that we have mixins we could do this again
  graouts: I can check into whether we have this
  graouts: Thinking about it more, it might be better to not use
           element as the target and get something explicit out of it
  graouts: The naive thing for devs to do might be to assume it is an
           element and try to do something that fails
  graouts: It might be safer to have an intermediate object
  graouts: I assume the interface just as element and pseudo on it
  flackr: Yes, that's what I was proposing

  krit: As a js developer can you get back to the element?
  birtles: On this wrapper, you also have animate
  graouts,flackr: yes
  flackr: It just simplifies the simple things you might want to do
          relating to that animation
  birtles: And then the constructors take an element, pseudo or this
           wrapper?
  graouts: Sure, so we need to pass it in
  birtles: It's a little bit of extra API surface but it seems alright
  graouts: We can always keep this under consideration and discuss
           further
  graouts: Unless smcgruer thinks its terrible
  flackr: I don't think it adds significant complexity
  birtles: When you know that you're targeting an element you have to
           add one extra link in the chain
  graouts: In the long run it may be better that we can target things
           other than elements

  birtles: Can do this with a mixin too
  majidvp: What's wrong with a mixin?
  birtles: It's possible to author content assuming its an element,
           and fail
  flackr: But you couldn't do a mixin until pseudo is defined right?
  birtles: Might be able to do something ....
  majidvp: Event interface has a target which returns an EventTarget
           mixin
  majidvp: Which is Window, Element, etc
  graouts: But you can't get events on it?
  flackr: Yes, through the bubble
  majidvp: Pseudo elements implement EventTarget
  majidvp: So I think we should follow

  majidvp: AnimationTarget is an interface implemented by Element or
           PseudoElement
  birtles: I think we can change back to Animateable interface
  birtles: Firefox doesn't implement the rest of the CSS pseudo
           element interface, the rest is empty
  graouts: We just have a testing internal method to check if
           something is a pseudo element being animated
  graouts: The only thing we expose is through a string like on
           transition events
  majidvp: So we can ship webanimations without returning animations
           on pseudo
  birtles: No, don't want to do that
  majidvp: You could have an intermediate opaque handle which
           implements animationtarget which can be passed back into
           animation methods
  majidvp: But you can't do anything else with it, so not blocked by
           pseudo element shipping
  majidvp: I think it's more ergonomic than having a wrapper

  flackr: What if we just return an interface for pseudo?
  birtles: I think just call the interface PseudoElement with a type
  flackr: Seems fine
  birtles: parentElement is not in the spec
  majidvp: Think you shouldn't make concessions for pseudo
  flackr: I think we're in agreement to do something like this
  graouts, birtles: yes

Clarification about "make animation’s start time unresolved"
------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/2359

  graouts: I think I just misread the spec
  graouts: There is actually a procedure to set the start time, maybe
           we want to clarify this but maybe it's fine
  birtles: It's got this requirement that it should be implementable
           in non scripted interfaces that came from dimi?
  graouts: Another issue is that setTiming doesn't do invalidation and
           so you can end up with an animation held for eternity
  birtles: Yeah, we should make it explicit that you update the state
  graouts: I'll raise an issue about this

timeline's attached to a media source
-------------------------------------

  graouts: One more thing we wanted was using a timeline attached to a
           media source
  graouts: It's tricky right now because you don't have a timeline
           with a writable time, so you have to go through all the
           animations and set them

  krit: What about media source controls for background animations,
        etc?
  graouts: Sure, we hadn't thought about this because we're mostly
           syncing with media
  graouts: For example subtitles could be decsribed with this or
           graphical improvements
  graouts: There are specs around this concept
  graouts: timetext
  krit: ttml
  majidvp: A scrolltimeline is essentially this, inherits from
           animationTimeline making it a kind of timeline with
           currentTime linked to scroll offset
  graouts: Sure, I was just bringing this forward as something we'd
           like to do sooner or later

  birtles: All of this feels like you want media to take the place of
           animation. For example, what if you have media playing and
           an animation attached to that timeline, what do you expect
           to happen?
  graouts: Maybe then the animations get a slightly different behavior
  flackr: Or maybe it starts playing the video?
  graouts: There are definitely things to think about
  birtles: Or AnimationWorklet could serve as this adapter
  graouts: Yeah but ideally you want something declarative to be able
           to do things at a lower level
  majidvp: How destructive will it be to have different types of
           animations with different playback animations
  birtles: Yeah, it sort of doesn't make sense to pause animations
           tied to other timelines
  birtles: Maybe there's some sort of mode switch where you're slaved
           to your timeline
  graouts: There's a big difference because a documenttimeline never
           ends
  birtles: For scroll timelines you have the same sort of issue if you
           pause animations while scrolling down the page

Received on Thursday, 17 May 2018 07:33:57 UTC