Hi,
Summary:
* I think we should drop AnimationTimeline.getAnimations()
* I think we should add Document.getAnimations()
I've been working on implementing the Web Animations model in Gecko and
I've made a few observations:
1. document.timeline.getAnimations() is not really useful
If you want to find all the animations running in a document it
doesn't help because animations might be running on a different
timeline.
There's no way of getting all the timelines either so you really
can't answer the question, "is this document at rest?" without
iterating over all the elements in the document and calling
getAnimations() on each of them. (And even then, that doesn't work
for pseudo-elements).
2. Semantically, document.timeline.getAnimations() is weird
Timelines are supposed to be dumb things that simply supply time
values, probably one per frame. That's all. They don't manage
animations. They're just like a ruler. As you move along you read off
numbers.
3. Having document.timeline.getAnimations() makes extending timelines
harder
We've already talked many times about having different types of
timelines that track, e.g. scroll position.
More recently we've been talking about changing the playbackRate on
timelines and how, in order to avoid changing the playbackRate for
*all* animations (including transitions) content should be able to
easily create new timelines and use them as a kind of simple grouping
mechanism.
So I think we're in the situation where we want custom timelines and
soon. What's more, I think we'll want script-generated timelines soon
so we can prototype new types of timelines (e.g. timelines tied to
touch gestures etc.)
That's a lot easier if timelines really are just sources of time
values, not managers of animations. If they're managers of animations
then presumably the browser will have to add magic behind the scenes
so that each script-generated timeline doesn't *also* have to be
responsible for maintaining its list of animations.
I'd like to fix this. At the same time I'd like to try and remove a bit
of magic. I'd like to make this setup a little more explainable so that
we could expose more parts of the animation system in future, if need
be. I'd also like to make sure this setup explains the lifetimes of
animation objects.
Here's how I think, conceptually, the pieces should fit together:
* UAs maintain a map between all running and pending Animation objects
and their timelines. This map is hidden, but could potentially be
exposed later if needed.
* On each frame UAs enumerate the animations in this map to tick them.
* When we come to support script-generated timelines, we add an extra
step where the UA first queries each timeline to get its frame time
and then passes that cached time to the Animations in the subsequent
step.
* With regards to lifetimes, any Animation that is running or pending is
kept alive by this map.
* Furthermore, target elements keep alive any *effects* targeting
them.
* *Effects* keep alive any animation they belong to.
* As a result if you create an animation and let go of it, so long as
it is targetting an element, it will be kept alive until it is
neither "current" nor "in effect".
- until it is finished, it will be kept alive by the timeline,
unless it is paused, in which case the effect will keep it alive
- once it finishes, if it fills forwards, the effect will keep it
alive
* This gives the expected behavior even for animations without an
effect, or without a timeline and it does not expose when GC occurs.
* We could support script-generated Animations in the future by simply
exposing the map.
In API terms I propose we do the following:
a. Drop AnimationTimeline.getAnimations()
b. Add Document.getAnimations()
Considerations: document.timeline.getAnimations() could be good, for
example, for generating a kind of timeline view but I think that's
a much less common case that wanting to see all the animations affecting
the current document.
If that became an important use case, we could simply expose the map
and allow fetching the animations by timeline.
Document.getAnimations() doesn't really have any relationship to the map
described above. It returns all animations *targetting* elements in the
document tree. As a result, there's no way of fetching an Animation
you set running with no target element. For that we'd need to expose
the map.
Any thoughts?
Brian