diff --git a/src/browser/tests/element/html/media.html b/src/browser/tests/element/html/media.html
index 97a4d152..80885c6e 100644
--- a/src/browser/tests/element/html/media.html
+++ b/src/browser/tests/element/html/media.html
@@ -60,14 +60,25 @@
audio.addEventListener('pause', () => events.push('pause'));
audio.addEventListener('emptied', () => events.push('emptied'));
+ // First play: paused -> playing, fires play + playing
audio.play();
testing.expectEqual('play,playing', events.join(','));
- audio.pause();
- testing.expectEqual('play,playing,pause', events.join(','));
+ // Second play: already playing, fires only playing (not play)
+ audio.play();
+ testing.expectEqual('play,playing,playing', events.join(','));
+ // Pause: playing -> paused, fires pause
+ audio.pause();
+ testing.expectEqual('play,playing,playing,pause', events.join(','));
+
+ // Second pause: already paused, no event
+ audio.pause();
+ testing.expectEqual('play,playing,playing,pause', events.join(','));
+
+ // Load: fires emptied
audio.load();
- testing.expectEqual('play,playing,pause,emptied', events.join(','));
+ testing.expectEqual('play,playing,playing,pause,emptied', events.join(','));
}
diff --git a/src/browser/webapi/element/html/Media.zig b/src/browser/webapi/element/html/Media.zig
index cdfec68a..f5437844 100644
--- a/src/browser/webapi/element/html/Media.zig
+++ b/src/browser/webapi/element/html/Media.zig
@@ -138,16 +138,21 @@ fn isMaybeSupported(mime_type: []const u8) bool {
}
pub fn play(self: *Media, page: *Page) !void {
+ const was_paused = self._paused;
self._paused = false;
self._ready_state = .HAVE_ENOUGH_DATA;
self._network_state = .NETWORK_IDLE;
- try self.dispatchEvent("play", page);
+ if (was_paused) {
+ try self.dispatchEvent("play", page);
+ }
try self.dispatchEvent("playing", page);
}
pub fn pause(self: *Media, page: *Page) !void {
- self._paused = true;
- try self.dispatchEvent("pause", page);
+ if (!self._paused) {
+ self._paused = true;
+ try self.dispatchEvent("pause", page);
+ }
}
pub fn load(self: *Media, page: *Page) !void {
@@ -160,7 +165,7 @@ pub fn load(self: *Media, page: *Page) !void {
}
fn dispatchEvent(self: *Media, name: []const u8, page: *Page) !void {
- const event = try Event.init(name, null, page);
+ const event = try Event.init(name, .{ .bubbles = false, .cancelable = false }, page);
defer if (!event._v8_handoff) event.deinit(false);
try page._event_manager.dispatch(self.asElement().asEventTarget(), event);
}