diff --git a/Tests/LibWeb/Text/expected/UIEvents/mouse-events.txt b/Tests/LibWeb/Text/expected/UIEvents/mouse-events.txt
new file mode 100644
index 00000000000..7930ea30972
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/UIEvents/mouse-events.txt
@@ -0,0 +1,13 @@
+ > move pointer over #inner
+mouseover target.id=(inner) currentTarget.id=(inner)
+mouseover target.id=(inner) currentTarget.id=(outer)
+mouseenter target.id=(inner) currentTarget.id=(inner)
+mouseenter target.id=(outer) currentTarget.id=(outer)
+> move pointer over #outer
+mouseout target.id=(inner) currentTarget.id=(inner)
+mouseout target.id=(inner) currentTarget.id=(outer)
+mouseleave target.id=(inner) currentTarget.id=(inner)
+mouseover target.id=(outer) currentTarget.id=(outer)
+> click document.body
+mouseout target.id=(outer) currentTarget.id=(outer)
+mouseleave target.id=(outer) currentTarget.id=(outer)
diff --git a/Tests/LibWeb/Text/input/UIEvents/mouse-events.html b/Tests/LibWeb/Text/input/UIEvents/mouse-events.html
new file mode 100644
index 00000000000..ad8c533bc81
--- /dev/null
+++ b/Tests/LibWeb/Text/input/UIEvents/mouse-events.html
@@ -0,0 +1,62 @@
+
+
+
+
+
diff --git a/Userland/Libraries/LibWeb/Internals/Internals.cpp b/Userland/Libraries/LibWeb/Internals/Internals.cpp
index 523d21f743f..9c06cff7f60 100644
--- a/Userland/Libraries/LibWeb/Internals/Internals.cpp
+++ b/Userland/Libraries/LibWeb/Internals/Internals.cpp
@@ -83,6 +83,12 @@ void Internals::click(double x, double y)
page.handle_mouseup({ x, y }, { x, y }, 1, 0, 0);
}
+void Internals::move_pointer_to(double x, double y)
+{
+ auto& page = global_object().browsing_context()->page();
+ page.handle_mousemove({ x, y }, { x, y }, 0, 0);
+}
+
void Internals::wheel(double x, double y, double delta_x, double delta_y)
{
auto& page = global_object().browsing_context()->page();
diff --git a/Userland/Libraries/LibWeb/Internals/Internals.h b/Userland/Libraries/LibWeb/Internals/Internals.h
index 3ebe5d19c9e..e26e6ac6e51 100644
--- a/Userland/Libraries/LibWeb/Internals/Internals.h
+++ b/Userland/Libraries/LibWeb/Internals/Internals.h
@@ -26,6 +26,7 @@ public:
void commit_text();
void click(double x, double y);
+ void move_pointer_to(double x, double y);
void wheel(double x, double y, double delta_x, double delta_y);
WebIDL::ExceptionOr dispatch_user_activated_event(DOM::EventTarget&, DOM::Event& event);
diff --git a/Userland/Libraries/LibWeb/Internals/Internals.idl b/Userland/Libraries/LibWeb/Internals/Internals.idl
index c3d13f3c0f6..9b8fb18b50a 100644
--- a/Userland/Libraries/LibWeb/Internals/Internals.idl
+++ b/Userland/Libraries/LibWeb/Internals/Internals.idl
@@ -11,6 +11,7 @@
undefined commitText();
undefined click(double x, double y);
+ undefined movePointerTo(double x, double y);
undefined wheel(double x, double y, double deltaX, double deltaY);
boolean dispatchUserActivatedEvent(EventTarget target, Event event);