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();