diff --git a/Tests/LibWeb/Text/expected/DOM/FormAssociatedElement-selection-type-change.txt b/Tests/LibWeb/Text/expected/DOM/FormAssociatedElement-selection-type-change.txt
new file mode 100644
index 0000000000..9c8ce5a5a8
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/DOM/FormAssociatedElement-selection-type-change.txt
@@ -0,0 +1 @@
+12389 PASS (didn't crash)
diff --git a/Tests/LibWeb/Text/input/DOM/FormAssociatedElement-selection-type-change.html b/Tests/LibWeb/Text/input/DOM/FormAssociatedElement-selection-type-change.html
new file mode 100644
index 0000000000..73a1d8cb31
--- /dev/null
+++ b/Tests/LibWeb/Text/input/DOM/FormAssociatedElement-selection-type-change.html
@@ -0,0 +1,17 @@
+
+
+
diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp
index 6171cf9a23..09dc8933e3 100644
--- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp
+++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp
@@ -1138,7 +1138,9 @@ void EventHandler::update_selection_range_for_input_or_textarea()
auto& root = node.root();
if (!root.is_shadow_root())
return;
- auto& shadow_host = *root.parent_or_shadow_host();
+ auto* shadow_host = root.parent_or_shadow_host();
+ if (!shadow_host)
+ return;
// Invoke "set the selection range" on the form associated element
auto selection_start = range->start_offset();
@@ -1147,10 +1149,10 @@ void EventHandler::update_selection_range_for_input_or_textarea()
auto direction = HTML::SelectionDirection::Forward;
Optional target {};
- if (is(shadow_host))
- target = static_cast(shadow_host);
- else if (is(shadow_host))
- target = static_cast(shadow_host);
+ if (is(*shadow_host))
+ target = static_cast(*shadow_host);
+ else if (is(*shadow_host))
+ target = static_cast(*shadow_host);
if (target.has_value())
target.value().set_the_selection_range(selection_start, selection_end, direction);