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