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;