LibWeb: Use a HashTable when querying SessionHistoryTraversalQueue

Instead of asking "do you have an entry not in this Vector", let's ask
"do you have an entry not in this HashTable".
This commit is contained in:
Andreas Kling 2024-08-06 14:35:28 +02:00 committed by Andreas Kling
commit 861d46be3e
Notes: github-actions[bot] 2024-08-06 14:34:06 +00:00
3 changed files with 6 additions and 6 deletions

View file

@ -63,10 +63,10 @@ void SessionHistoryTraversalQueue::append_sync(Function<void()> steps, JS::GCPtr
} }
// https://html.spec.whatwg.org/multipage/browsing-the-web.html#sync-navigations-jump-queue // https://html.spec.whatwg.org/multipage/browsing-the-web.html#sync-navigations-jump-queue
JS::GCPtr<SessionHistoryTraversalQueueEntry> SessionHistoryTraversalQueue::first_synchronous_navigation_steps_with_target_navigable_not_contained_in(Vector<JS::GCPtr<Navigable>> const& list) JS::GCPtr<SessionHistoryTraversalQueueEntry> SessionHistoryTraversalQueue::first_synchronous_navigation_steps_with_target_navigable_not_contained_in(HashTable<JS::NonnullGCPtr<Navigable>> const& set)
{ {
auto index = m_queue.find_first_index_if([&list](auto const& entry) -> bool { auto index = m_queue.find_first_index_if([&set](auto const& entry) -> bool {
return (entry->target_navigable() != nullptr) && !list.contains_slow(entry->target_navigable()); return (entry->target_navigable() != nullptr) && !set.contains(*entry->target_navigable());
}); });
if (index.has_value()) if (index.has_value())
return m_queue.take(*index); return m_queue.take(*index);

View file

@ -53,7 +53,7 @@ public:
void append_sync(Function<void()> steps, JS::GCPtr<Navigable> target_navigable); void append_sync(Function<void()> steps, JS::GCPtr<Navigable> target_navigable);
// https://html.spec.whatwg.org/multipage/browsing-the-web.html#sync-navigations-jump-queue // https://html.spec.whatwg.org/multipage/browsing-the-web.html#sync-navigations-jump-queue
JS::GCPtr<SessionHistoryTraversalQueueEntry> first_synchronous_navigation_steps_with_target_navigable_not_contained_in(Vector<JS::GCPtr<Navigable>> const& list); JS::GCPtr<SessionHistoryTraversalQueueEntry> first_synchronous_navigation_steps_with_target_navigable_not_contained_in(HashTable<JS::NonnullGCPtr<Navigable>> const&);
private: private:
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;

View file

@ -648,7 +648,7 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_
} }
// 13. Let navigablesThatMustWaitBeforeHandlingSyncNavigation be an empty set. // 13. Let navigablesThatMustWaitBeforeHandlingSyncNavigation be an empty set.
Vector<JS::GCPtr<Navigable>> navigables_that_must_wait_before_handling_sync_navigation; HashTable<JS::NonnullGCPtr<Navigable>> navigables_that_must_wait_before_handling_sync_navigation;
// 14. While completedChangeJobs does not equal totalChangeJobs: // 14. While completedChangeJobs does not equal totalChangeJobs:
while (!changing_navigable_continuations.is_empty()) { while (!changing_navigable_continuations.is_empty()) {
@ -701,7 +701,7 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_
auto script_history_index = history_object_length_and_index.script_history_index; auto script_history_index = history_object_length_and_index.script_history_index;
// 8. Append navigable to navigablesThatMustWaitBeforeHandlingSyncNavigation. // 8. Append navigable to navigablesThatMustWaitBeforeHandlingSyncNavigation.
navigables_that_must_wait_before_handling_sync_navigation.append(*navigable); navigables_that_must_wait_before_handling_sync_navigation.set(*navigable);
// 9. Let entriesForNavigationAPI be the result of getting session history entries for the navigation API given navigable and targetStep. // 9. Let entriesForNavigationAPI be the result of getting session history entries for the navigation API given navigable and targetStep.
auto entries_for_navigation_api = get_session_history_entries_for_the_navigation_api(*navigable, target_step); auto entries_for_navigation_api = get_session_history_entries_for_the_navigation_api(*navigable, target_step);