track playing state: only dispatch playing on first start

Per review: playing event should only fire on first start, not
on every resume from pause. Add _playing field, reset on load().
This commit is contained in:
egrs
2026-02-18 10:22:49 +01:00
parent 1b71d1e46d
commit 830eb74725
2 changed files with 20 additions and 3 deletions

View File

@@ -76,9 +76,21 @@
audio.pause(); audio.pause();
testing.expectEqual('play,playing,pause', events.join(',')); testing.expectEqual('play,playing,pause', events.join(','));
// Load: fires emptied // Third play: resume from pause, fires play only (not playing)
audio.play();
testing.expectEqual('play,playing,pause,play', events.join(','));
// Pause again
audio.pause();
testing.expectEqual('play,playing,pause,play,pause', events.join(','));
// Load: resets state, fires emptied
audio.load(); audio.load();
testing.expectEqual('play,playing,pause,emptied', events.join(',')); testing.expectEqual('play,playing,pause,play,pause,emptied', events.join(','));
// Play after load: fires play + playing again (fresh start)
audio.play();
testing.expectEqual('play,playing,pause,play,pause,emptied,play,playing', events.join(','));
} }
</script> </script>

View File

@@ -61,6 +61,7 @@ _playback_rate: f64 = 1.0,
_ready_state: ReadyState = .HAVE_NOTHING, _ready_state: ReadyState = .HAVE_NOTHING,
_network_state: NetworkState = .NETWORK_EMPTY, _network_state: NetworkState = .NETWORK_EMPTY,
_error: ?*MediaError = null, _error: ?*MediaError = null,
_playing: bool = false,
pub fn asElement(self: *Media) *Element { pub fn asElement(self: *Media) *Element {
return self._proto._proto; return self._proto._proto;
@@ -144,9 +145,12 @@ pub fn play(self: *Media, page: *Page) !void {
self._network_state = .NETWORK_IDLE; self._network_state = .NETWORK_IDLE;
if (was_paused) { if (was_paused) {
try self.dispatchEvent("play", page); try self.dispatchEvent("play", page);
if (!self._playing) {
self._playing = true;
try self.dispatchEvent("playing", page); try self.dispatchEvent("playing", page);
} }
} }
}
pub fn pause(self: *Media, page: *Page) !void { pub fn pause(self: *Media, page: *Page) !void {
if (!self._paused) { if (!self._paused) {
@@ -157,6 +161,7 @@ pub fn pause(self: *Media, page: *Page) !void {
pub fn load(self: *Media, page: *Page) !void { pub fn load(self: *Media, page: *Page) !void {
self._paused = true; self._paused = true;
self._playing = false;
self._current_time = 0; self._current_time = 0;
self._ready_state = .HAVE_NOTHING; self._ready_state = .HAVE_NOTHING;
self._network_state = .NETWORK_LOADING; self._network_state = .NETWORK_LOADING;