diff --git a/Libraries/LibWeb/HTML/Navigable.cpp b/Libraries/LibWeb/HTML/Navigable.cpp index 5523b7210d5..e6f74529699 100644 --- a/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Libraries/LibWeb/HTML/Navigable.cpp @@ -99,11 +99,6 @@ Vector> Navigable::child_navigables() const return results; } -bool Navigable::is_traversable() const -{ - return is(*this); -} - bool Navigable::is_ancestor_of(GC::Ref other) const { for (auto ancestor = other->parent(); ancestor; ancestor = ancestor->parent()) { diff --git a/Libraries/LibWeb/HTML/Navigable.h b/Libraries/LibWeb/HTML/Navigable.h index 4a3830422fe..5f3e74570a4 100644 --- a/Libraries/LibWeb/HTML/Navigable.h +++ b/Libraries/LibWeb/HTML/Navigable.h @@ -52,7 +52,7 @@ public: Vector> child_navigables() const; - bool is_traversable() const; + virtual bool is_traversable() const { return false; } String const& id() const { return m_id; } GC::Ptr parent() const { return m_parent; } @@ -188,6 +188,9 @@ public: bool has_pending_navigations() const { return !m_pending_navigations.is_empty(); } + template + bool fast_is() const = delete; + protected: explicit Navigable(GC::Ref); diff --git a/Libraries/LibWeb/HTML/TraversableNavigable.h b/Libraries/LibWeb/HTML/TraversableNavigable.h index 542c642c92d..8ccc236a95d 100644 --- a/Libraries/LibWeb/HTML/TraversableNavigable.h +++ b/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -120,6 +120,8 @@ public: private: TraversableNavigable(GC::Ref); + virtual bool is_traversable() const override { return true; } + virtual void visit_edges(Cell::Visitor&) override; // FIXME: Fix spec typo cancelation --> cancellation @@ -175,4 +177,7 @@ struct BrowsingContextAndDocument { WebIDL::ExceptionOr create_a_new_top_level_browsing_context_and_document(GC::Ref page); void finalize_a_same_document_navigation(GC::Ref traversable, GC::Ref target_navigable, GC::Ref target_entry, GC::Ptr entry_to_replace, HistoryHandlingBehavior, UserNavigationInvolvement); +template<> +inline bool Navigable::fast_is() const { return is_traversable(); } + }