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); }