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
parent a1519e67fb
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
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 {
return (entry->target_navigable() != nullptr) && !list.contains_slow(entry->target_navigable());
auto index = m_queue.find_first_index_if([&set](auto const& entry) -> bool {
return (entry->target_navigable() != nullptr) && !set.contains(*entry->target_navigable());
});
if (index.has_value())
return m_queue.take(*index);

View file

@ -53,7 +53,7 @@ public:
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
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:
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.
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:
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;
// 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.
auto entries_for_navigation_api = get_session_history_entries_for_the_navigation_api(*navigable, target_step);