diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp
index 12cb9ee0d3..9503eb0c3f 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp
@@ -190,12 +190,7 @@ String Navigable::target_name() const
JS::GCPtr Navigable::container() const
{
// The container of a navigable navigable is the navigable container whose nested navigable is navigable, or null if there is no such element.
- return m_container;
-}
-
-void Navigable::set_container(JS::GCPtr container)
-{
- m_container = container;
+ return NavigableContainer::navigable_container_with_content_navigable(const_cast(*this));
}
// https://html.spec.whatwg.org/multipage/document-sequences.html#nav-traversable
diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.h b/Userland/Libraries/LibWeb/HTML/Navigable.h
index a1d111081a..112d70f1cd 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigable.h
+++ b/Userland/Libraries/LibWeb/HTML/Navigable.h
@@ -60,7 +60,6 @@ public:
String target_name() const;
JS::GCPtr container() const;
- void set_container(JS::GCPtr);
JS::GCPtr traversable_navigable() const;
JS::GCPtr top_level_traversable();
diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp
index cc02db4365..0248f4404e 100644
--- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp
+++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp
@@ -27,9 +27,13 @@ HashTable& NavigableContainer::all_instances()
NavigableContainer::NavigableContainer(DOM::Document& document, DOM::QualifiedName qualified_name)
: HTMLElement(document, move(qualified_name))
{
+ all_instances().set(this);
}
-NavigableContainer::~NavigableContainer() = default;
+NavigableContainer::~NavigableContainer()
+{
+ all_instances().remove(this);
+}
void NavigableContainer::visit_edges(Cell::Visitor& visitor)
{
@@ -37,6 +41,15 @@ void NavigableContainer::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_nested_browsing_context);
}
+JS::GCPtr NavigableContainer::navigable_container_with_content_navigable(JS::NonnullGCPtr navigable)
+{
+ for (auto* navigable_container : all_instances()) {
+ if (navigable_container->content_navigable() == navigable)
+ return navigable_container;
+ }
+ return nullptr;
+}
+
// https://html.spec.whatwg.org/multipage/browsers.html#creating-a-new-nested-browsing-context
void NavigableContainer::create_new_nested_browsing_context()
{
diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.h b/Userland/Libraries/LibWeb/HTML/NavigableContainer.h
index 5628c629e7..d14faf5cbc 100644
--- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.h
+++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.h
@@ -14,6 +14,8 @@ class NavigableContainer : public HTMLElement {
WEB_PLATFORM_OBJECT(NavigableContainer, HTMLElement);
public:
+ static JS::GCPtr navigable_container_with_content_navigable(JS::NonnullGCPtr navigable);
+
virtual ~NavigableContainer() override;
static HashTable& all_instances();