diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
index bf74d40f01..0400afb16f 100644
--- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
@@ -511,6 +511,25 @@ void TraversableNavigable::apply_pending_history_changes()
apply_the_history_step(target_step);
}
+// https://html.spec.whatwg.org/multipage/document-sequences.html#close-a-top-level-traversable
+void TraversableNavigable::close_top_level_traversable()
+{
+ VERIFY(is_top_level_traversable());
+
+ // 1. Let toUnload be traversable's active document's inclusive descendant navigables.
+ auto to_unload = active_document()->inclusive_descendant_navigables();
+
+ // FIXME: 2. If the result of checking if unloading is user-canceled for toUnload is true, then return.
+
+ // 3. Unload the active documents of each of toUnload.
+ for (auto navigable : to_unload) {
+ navigable->active_document()->unload();
+ }
+
+ // 4. Destroy traversable.
+ destroy_top_level_traversable();
+}
+
// https://html.spec.whatwg.org/multipage/document-sequences.html#destroy-a-top-level-traversable
void TraversableNavigable::destroy_top_level_traversable()
{
diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h
index 362412ce2f..b28931acc8 100644
--- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h
+++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h
@@ -46,6 +46,7 @@ public:
void clear_the_forward_session_history();
void traverse_the_history_by_delta(int delta);
+ void close_top_level_traversable();
void destroy_top_level_traversable();
void append_session_history_traversal_steps(JS::SafeFunction steps)