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;