diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
index 84ccc211eda..c42fdfa3b12 100644
--- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
+++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -290,6 +291,16 @@ void BrowsingContext::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_previous_sibling);
}
+// https://html.spec.whatwg.org/multipage/document-sequences.html#bc-traversable
+JS::NonnullGCPtr BrowsingContext::top_level_traversable() const
+{
+ // A browsing context's top-level traversable is its active document's node navigable's top-level traversable.
+ auto traversable = active_document()->navigable()->top_level_traversable();
+ VERIFY(traversable);
+ VERIFY(traversable->is_top_level_traversable());
+ return *traversable;
+}
+
void BrowsingContext::did_edit(Badge)
{
reset_cursor_blink_cycle();
diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.h b/Userland/Libraries/LibWeb/HTML/BrowsingContext.h
index 833039a3000..b65a0e45b18 100644
--- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.h
+++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.h
@@ -42,6 +42,8 @@ public:
virtual ~BrowsingContext() override;
+ JS::NonnullGCPtr top_level_traversable() const;
+
JS::GCPtr parent() const { return m_parent; }
void append_child(JS::NonnullGCPtr);
void remove_child(JS::NonnullGCPtr);