diff --git a/Userland/Libraries/LibWeb/HTML/MessagePort.cpp b/Userland/Libraries/LibWeb/HTML/MessagePort.cpp
index 1fbee5908c..a66850f95b 100644
--- a/Userland/Libraries/LibWeb/HTML/MessagePort.cpp
+++ b/Userland/Libraries/LibWeb/HTML/MessagePort.cpp
@@ -297,8 +297,11 @@ void MessagePort::read_from_socket()
auto serialize_with_transfer_result = MUST(decoder.decode());
- post_message_task_steps(serialize_with_transfer_result);
+ // Make sure to advance our state machine before dispatching the MessageEvent,
+ // as dispatching events can run arbitrary JS (and cause us to receive another message!)
m_socket_state = SocketState::Header;
+
+ post_message_task_steps(serialize_with_transfer_result);
break;
}
case SocketState::Error: