diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp
index c6cd1efcff..e1a464592e 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp
@@ -9,6 +9,7 @@
#include
#include
#include
+#include
namespace Web::HTML {
@@ -80,4 +81,18 @@ void Navigable::set_container(JS::GCPtr container)
m_container = container;
}
+// https://html.spec.whatwg.org/multipage/document-sequences.html#nav-traversable
+JS::GCPtr Navigable::traversable_navigable()
+{
+ // 1. Let navigable be inputNavigable.
+ auto navigable = this;
+
+ // 2. While navigable is not a traversable navigable, set navigable to navigable's parent.
+ while (navigable && !is(*navigable))
+ navigable = navigable->parent();
+
+ // 3. Return navigable.
+ return static_cast(navigable);
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.h b/Userland/Libraries/LibWeb/HTML/Navigable.h
index e96fe5db0d..553ae256e0 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigable.h
+++ b/Userland/Libraries/LibWeb/HTML/Navigable.h
@@ -40,6 +40,8 @@ public:
JS::GCPtr container() const;
void set_container(JS::GCPtr);
+ JS::GCPtr traversable_navigable();
+
protected:
Navigable();