- From: Brian Birtles <bbirtles@mozilla.com>
- Date: Fri, 24 Apr 2015 10:32:43 +0900
- To: Shane Stephens <shans@google.com>, "public-fx@w3.org" <public-fx@w3.org>
Hi,
Thanks for looking into this!
On 2015/04/24 7:13, Shane Stephens wrote:
...
> This is a really good summary of the different states and how to
> transition between them. Could we insert this in the non-normative text
> of the spec?
Thanks. I filed issue #92 for this.[1]
> I thought about this for a while and had some ideas for introducing a
> more primitive run()/resume()/start() operation. Apart from
complicating
> the API I've come to think that play() isn't that bad. We seek to
one of
> the interval endpoints when transitioning from the 'idle' state so it
> doesn't seem so bad to do exactly the same thing when
transitioning from
> the 'finished' state.
>
>
> One difference between transitioning from idle and transitioning from
> finished is that we don't have a currentTime in idle, so we *need* to
> construct one. So these aren't really the same thing.
Yes, they're different. I think they're similar? Do you have any
suggestion for a more primitive operation?
> b. Some people want the async methods play()/pause() to return
Promise
> objects.
...
> Good summary. I think there's still enough uncertainty around this to
> punt on promises as return values in level 1. It's something we can
> easily introduce later, but changing once introduced will be much harder.
Agreed.
> c. The ready promise is reused. If you do pause() and then
interrupt it
> with play() we don't create two separate Promise objects, but
just reuse
> the one created when you called pause(). The idea is that the ready
> promise doesn't resolve until eveything is ready. I'm not sure if
this
> is useful or not. If pause() and play() were to return Promise
objects
> it would probably make more sense that they are separate
'pause-ready'
> and 'play-ready' promises which get cancelled if the operation is
> aborted.
>
>
> This is probably worth thinking about from a use-case perspective. Are
> there situations we can think of where it's important to know that the
> pause() was cancelled?
Yeah, I'm really not sure. It's possible that the two approaches are
compatible. Namely, that you could have pause() and play() return
specific 'pause-pending' and 'play-pending' promises but have the
'ready' attribute continue to behave as currently specced--i.e. a
combined promise.
> d. On a related note, should we expose 'play-pending' and
> 'pause-pending' as separate states? Currently they're both just
reported
> as 'pending'.
I'd be keen to hear thoughts on this.
> f. It's odd that if you're paused and call finish(), you don't
end up in
> the 'finished' state. If 'finished' is a subset of 'running', then I
> think it makes sense for finish() to take you out of the paused
state.
> It could do this by simply resolving the start time appropriately.
>
>
> It does from the perspective of the states, but also it doesn't make
> sense intuitively for finish() to unpause you.
I think the basic issue is that 'finished' and 'paused' overlap and
states shouldn't do that. I suggest we fix this by making 'finished' and
'paused' never overlap--i.e. if you're paused, you're not finished. In
my follow-up mail[2], I added point (h) which suggests that we don't
resolve the finished promise so long as you're paused.
If 'finished' and 'paused' don't overlap then I think having finish()
transition you out of the paused state makes more sense but that's
probably a secondary issue. We should work out how finished and paused
fit together first.
> Maybe we don't need finish()? It's trivial to implement yourself
> (player.currentTime = player.endTime).
Perhaps. I'd somewhat like to keep it since I find it useful and jQuery
programmers are used to it. It's also slightly complicated to do it
yourself:
player.currentTime = player.playbackRate > 0 && player.effect
? player.effect.computedTiming.endTime
: 0
*Plus* special handling when player.effect.computedTiming.endTime ==
Infinity or player.playbackRate == 0.
> g. Should calling pause() while idle transition to the 'paused'
state?
> i.e. resolve the current time to the appropriate end of the
interval? To
> create an initially paused animation you currently need to call
play()
> then pause() (or just set the currentTime). Amongst the three
primitive
> operations introduced above there's no operation that triggers an
> idle->pause transition.
>
>
> That sounds like a good idea.
Great. I'll wait until we settle on the other issues before making that
change.
Thanks,
Brian
[1] https://github.com/w3c/web-animations/issues/92
[2] https://lists.w3.org/Archives/Public/public-fx/2015AprJun/0024.html
Received on Friday, 24 April 2015 01:33:12 UTC