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)