diff --git a/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp b/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp
index c816be4490..9f6db1f22f 100644
--- a/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp
+++ b/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp
@@ -89,6 +89,17 @@ Duration AudioTrack::duration() const
return Duration::from_milliseconds(static_cast(duration * 1000.0));
}
+void AudioTrack::seek(double position, MediaSeekMode seek_mode)
+{
+ // FIXME: Implement seeking mode.
+ (void)seek_mode;
+
+ auto duration = static_cast(this->duration().to_milliseconds()) / 1000.0;
+ position = position / duration * static_cast(m_loader->total_samples());
+
+ m_loader->seek(position).release_value_but_fixme_should_propagate_errors();
+}
+
void AudioTrack::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
diff --git a/Userland/Libraries/LibWeb/HTML/AudioTrack.h b/Userland/Libraries/LibWeb/HTML/AudioTrack.h
index 82efba881a..844b579ad1 100644
--- a/Userland/Libraries/LibWeb/HTML/AudioTrack.h
+++ b/Userland/Libraries/LibWeb/HTML/AudioTrack.h
@@ -26,6 +26,7 @@ public:
Duration position() const;
Duration duration() const;
+ void seek(double, MediaSeekMode);
String const& id() const { return m_id; }
String const& kind() const { return m_kind; }
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp
index 2c4d6e0357..b2bb0ba0a2 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp
@@ -56,4 +56,11 @@ void HTMLAudioElement::on_paused()
});
}
+void HTMLAudioElement::on_seek(double position, MediaSeekMode seek_mode)
+{
+ audio_tracks()->for_each_enabled_track([&](auto& audio_track) {
+ audio_track.seek(position, seek_mode);
+ });
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h
index b383e1a609..08d0c92153 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h
@@ -28,6 +28,7 @@ private:
virtual void on_playing() override;
virtual void on_paused() override;
+ virtual void on_seek(double, MediaSeekMode) override;
};
}