From 830eb7472539eb2b72f47c8b56a59e7398864b3f Mon Sep 17 00:00:00 2001 From: egrs Date: Wed, 18 Feb 2026 10:22:49 +0100 Subject: [PATCH] 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(). --- src/browser/tests/element/html/media.html | 16 ++++++++++++++-- src/browser/webapi/element/html/Media.zig | 7 ++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/browser/tests/element/html/media.html b/src/browser/tests/element/html/media.html index ce62ed86..e6884543 100644 --- a/src/browser/tests/element/html/media.html +++ b/src/browser/tests/element/html/media.html @@ -76,9 +76,21 @@ audio.pause(); 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(); - 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(',')); } diff --git a/src/browser/webapi/element/html/Media.zig b/src/browser/webapi/element/html/Media.zig index ca9f6088..ab5be73f 100644 --- a/src/browser/webapi/element/html/Media.zig +++ b/src/browser/webapi/element/html/Media.zig @@ -61,6 +61,7 @@ _playback_rate: f64 = 1.0, _ready_state: ReadyState = .HAVE_NOTHING, _network_state: NetworkState = .NETWORK_EMPTY, _error: ?*MediaError = null, +_playing: bool = false, pub fn asElement(self: *Media) *Element { return self._proto._proto; @@ -144,7 +145,10 @@ pub fn play(self: *Media, page: *Page) !void { self._network_state = .NETWORK_IDLE; if (was_paused) { try self.dispatchEvent("play", page); - try self.dispatchEvent("playing", page); + if (!self._playing) { + self._playing = true; + try self.dispatchEvent("playing", page); + } } } @@ -157,6 +161,7 @@ pub fn pause(self: *Media, page: *Page) !void { pub fn load(self: *Media, page: *Page) !void { self._paused = true; + self._playing = false; self._current_time = 0; self._ready_state = .HAVE_NOTHING; self._network_state = .NETWORK_LOADING;