From fc83653f3c7a650229d2be3eef0f1738a9395db9 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 18 Aug 2024 17:45:56 +1200 Subject: [PATCH] LibWeb: Use HeapFunction directly in SessionHistoryTraversalQueue This allows us to use HeapFunction all of the way down, allowing us to remove the Handle usage in after_session_callback for create_new_child_navigable. --- Userland/Libraries/LibWeb/HTML/Navigable.cpp | 20 +++++++++---------- .../LibWeb/HTML/NavigableContainer.cpp | 10 +++++----- .../LibWeb/HTML/NavigableContainer.h | 2 +- Userland/Libraries/LibWeb/HTML/Navigation.cpp | 4 ++-- .../HTML/SessionHistoryTraversalQueue.cpp | 12 +++++------ .../HTML/SessionHistoryTraversalQueue.h | 6 +++--- .../LibWeb/HTML/TraversableNavigable.cpp | 4 ++-- .../LibWeb/HTML/TraversableNavigable.h | 8 ++++---- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp index 7879113b409..eaa1b2c75bf 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp @@ -1435,7 +1435,7 @@ WebIDL::ExceptionOr Navigable::navigate(NavigateParams params) // set to true and completionSteps set to the following step: populate_session_history_entry_document(history_entry, source_snapshot_params, target_snapshot_params, navigation_id, navigation_params, csp_navigation_type, true, JS::create_heap_function(heap(), [this, history_entry, history_handling, navigation_id] { // 1. Append session history traversal steps to navigable's traversable to finalize a cross-document navigation given navigable, historyHandling, and historyEntry. - traversable_navigable()->append_session_history_traversal_steps([this, history_entry, history_handling, navigation_id] { + traversable_navigable()->append_session_history_traversal_steps(JS::create_heap_function(heap(), [this, history_entry, history_handling, navigation_id] { if (this->has_been_destroyed()) { // NOTE: This check is not in the spec but we should not continue navigation if navigable has been destroyed. set_delaying_load_events(false); @@ -1447,7 +1447,7 @@ WebIDL::ExceptionOr Navigable::navigate(NavigateParams params) return; } finalize_a_cross_document_navigation(*this, to_history_handling_behavior(history_handling), history_entry); - }); + })); })).release_value_but_fixme_should_propagate_errors(); }); @@ -1529,14 +1529,14 @@ WebIDL::ExceptionOr Navigable::navigate_to_a_fragment(URL::URL const& url, auto traversable = traversable_navigable(); // 17. Append the following session history synchronous navigation steps involving navigable to traversable: - traversable->append_session_history_synchronous_navigation_steps(*this, [this, traversable, history_entry, entry_to_replace, navigation_id, history_handling] { + traversable->append_session_history_synchronous_navigation_steps(*this, JS::create_heap_function(heap(), [this, traversable, history_entry, entry_to_replace, navigation_id, history_handling] { // 1. Finalize a same-document navigation given traversable, navigable, historyEntry, and entryToReplace. finalize_a_same_document_navigation(*traversable, *this, history_entry, entry_to_replace, history_handling); // FIXME: 2. Invoke WebDriver BiDi fragment navigated with navigable's active browsing context and a new WebDriver BiDi // navigation status whose id is navigationId, url is url, and status is "complete". (void)navigation_id; - }); + })); return {}; } @@ -1710,9 +1710,9 @@ WebIDL::ExceptionOr Navigable::navigate_to_a_javascript_url(URL::URL const history_entry->set_document_state(document_state); // 13. Append session history traversal steps to targetNavigable's traversable to finalize a cross-document navigation with targetNavigable, historyHandling, and historyEntry. - traversable_navigable()->append_session_history_traversal_steps([this, history_entry, history_handling, navigation_id] { + traversable_navigable()->append_session_history_traversal_steps(JS::create_heap_function(heap(), [this, history_entry, history_handling, navigation_id] { finalize_a_cross_document_navigation(*this, history_handling, history_entry); - }); + })); return {}; } @@ -1727,10 +1727,10 @@ void Navigable::reload() auto traversable = traversable_navigable(); // 3. Append the following session history traversal steps to traversable: - traversable->append_session_history_traversal_steps([traversable] { + traversable->append_session_history_traversal_steps(JS::create_heap_function(heap(), [traversable] { // 1. Apply the reload history step to traversable. traversable->apply_the_reload_history_step(); - }); + })); } // https://html.spec.whatwg.org/multipage/browsing-the-web.html#the-navigation-must-be-a-replace @@ -1942,10 +1942,10 @@ void perform_url_and_history_update_steps(DOM::Document& document, URL::URL new_ auto traversable = navigable->traversable_navigable(); // 13. Append the following session history synchronous navigation steps involving navigable to traversable: - traversable->append_session_history_synchronous_navigation_steps(*navigable, [traversable, navigable, new_entry, entry_to_replace, history_handling] { + traversable->append_session_history_synchronous_navigation_steps(*navigable, JS::create_heap_function(document.realm().heap(), [traversable, navigable, new_entry, entry_to_replace, history_handling] { // 1. Finalize a same-document navigation given traversable, navigable, newEntry, and entryToReplace. finalize_a_same_document_navigation(*traversable, *navigable, new_entry, entry_to_replace, history_handling); - }); + })); } void Navigable::scroll_offset_did_change() diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp index efe4b3bcf93..71ff294aabf 100644 --- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp +++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp @@ -59,7 +59,7 @@ JS::GCPtr NavigableContainer::navigable_container_with_conte } // https://html.spec.whatwg.org/multipage/document-sequences.html#create-a-new-child-navigable -WebIDL::ExceptionOr NavigableContainer::create_new_child_navigable(JS::Handle> after_session_history_update) +WebIDL::ExceptionOr NavigableContainer::create_new_child_navigable(JS::GCPtr> after_session_history_update) { // 1. Let parentNavigable be element's node navigable. auto parent_navigable = navigable(); @@ -110,7 +110,7 @@ WebIDL::ExceptionOr NavigableContainer::create_new_child_navigable(JS::Han auto traversable = parent_navigable->traversable_navigable(); // 12. Append the following session history traversal steps to traversable: - traversable->append_session_history_traversal_steps([traversable, navigable, parent_navigable, history_entry, after_session_history_update = move(after_session_history_update)] { + traversable->append_session_history_traversal_steps(JS::create_heap_function(heap(), [traversable, navigable, parent_navigable, history_entry, after_session_history_update] { // 1. Let parentDocState be parentNavigable's active session history entry's document state. auto parent_doc_state = parent_navigable->active_session_history_entry()->document_state(); @@ -140,7 +140,7 @@ WebIDL::ExceptionOr NavigableContainer::create_new_child_navigable(JS::Han if (after_session_history_update) { after_session_history_update->function()(); } - }); + })); return {}; } @@ -294,10 +294,10 @@ void NavigableContainer::destroy_the_child_navigable() auto traversable = this->navigable()->traversable_navigable(); // 9. Append the following session history traversal steps to traversable: - traversable->append_session_history_traversal_steps([traversable] { + traversable->append_session_history_traversal_steps(JS::create_heap_function(heap(), [traversable] { // 1. Update for navigable creation/destruction given traversable. traversable->update_for_navigable_creation_or_destruction(); - }); + })); })); } diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.h b/Userland/Libraries/LibWeb/HTML/NavigableContainer.h index e0cbbeb2b92..5deaf0ef9f5 100644 --- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.h +++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.h @@ -64,7 +64,7 @@ protected: // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#navigate-an-iframe-or-frame void navigate_an_iframe_or_frame(URL::URL url, ReferrerPolicy::ReferrerPolicy referrer_policy, Optional srcdoc_string = {}); - WebIDL::ExceptionOr create_new_child_navigable(JS::Handle> after_session_history_update = {}); + WebIDL::ExceptionOr create_new_child_navigable(JS::GCPtr> after_session_history_update = {}); // https://html.spec.whatwg.org/multipage/document-sequences.html#content-navigable JS::GCPtr m_content_navigable { nullptr }; diff --git a/Userland/Libraries/LibWeb/HTML/Navigation.cpp b/Userland/Libraries/LibWeb/HTML/Navigation.cpp index 7c1fdeb82ca..9b7aa862cb9 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigation.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigation.cpp @@ -665,7 +665,7 @@ WebIDL::ExceptionOr Navigation::perform_a_navigation_api_trave auto source_snapshot_params = document.snapshot_source_snapshot_params(); // 12. Append the following session history traversal steps to traversable: - traversable->append_session_history_traversal_steps([key, api_method_tracker, navigable, source_snapshot_params, traversable, this] { + traversable->append_session_history_traversal_steps(JS::create_heap_function(heap(), [key, api_method_tracker, navigable, source_snapshot_params, traversable, this] { // 1. Let navigableSHEs be the result of getting session history entries given navigable. auto navigable_shes = navigable->get_session_history_entries(); @@ -727,7 +727,7 @@ WebIDL::ExceptionOr Navigation::perform_a_navigation_api_trave reject_the_finished_promise(api_method_tracker, WebIDL::SecurityError::create(realm, "Navigation disallowed from this origin"_fly_string)); })); } - }); + })); // 13. Return a navigation API method tracker-derived result for apiMethodTracker. return navigation_api_method_tracker_derived_result(api_method_tracker); diff --git a/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.cpp b/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.cpp index 0d28f64dfe3..8db99552a5a 100644 --- a/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.cpp +++ b/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.cpp @@ -12,9 +12,9 @@ namespace Web::HTML { JS_DEFINE_ALLOCATOR(SessionHistoryTraversalQueue); JS_DEFINE_ALLOCATOR(SessionHistoryTraversalQueueEntry); -JS::NonnullGCPtr SessionHistoryTraversalQueueEntry::create(JS::VM& vm, Function steps, JS::GCPtr target_navigable) +JS::NonnullGCPtr SessionHistoryTraversalQueueEntry::create(JS::VM& vm, JS::NonnullGCPtr> steps, JS::GCPtr target_navigable) { - return vm.heap().allocate_without_realm(JS::create_heap_function(vm.heap(), move(steps)), target_navigable); + return vm.heap().allocate_without_realm(steps, target_navigable); } void SessionHistoryTraversalQueueEntry::visit_edges(JS::Cell::Visitor& visitor) @@ -46,17 +46,17 @@ void SessionHistoryTraversalQueue::visit_edges(JS::Cell::Visitor& visitor) visitor.visit(m_queue); } -void SessionHistoryTraversalQueue::append(Function steps) +void SessionHistoryTraversalQueue::append(JS::NonnullGCPtr> steps) { - m_queue.append(SessionHistoryTraversalQueueEntry::create(vm(), move(steps), nullptr)); + m_queue.append(SessionHistoryTraversalQueueEntry::create(vm(), steps, nullptr)); if (!m_timer->is_active()) { m_timer->start(); } } -void SessionHistoryTraversalQueue::append_sync(Function steps, JS::GCPtr target_navigable) +void SessionHistoryTraversalQueue::append_sync(JS::NonnullGCPtr> steps, JS::GCPtr target_navigable) { - m_queue.append(SessionHistoryTraversalQueueEntry::create(vm(), move(steps), target_navigable)); + m_queue.append(SessionHistoryTraversalQueueEntry::create(vm(), steps, target_navigable)); if (!m_timer->is_active()) { m_timer->start(); } diff --git a/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h b/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h index 02b597f4ebe..d73593fe3d4 100644 --- a/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h +++ b/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h @@ -23,7 +23,7 @@ struct SessionHistoryTraversalQueueEntry : public JS::Cell { JS_DECLARE_ALLOCATOR(SessionHistoryTraversalQueueEntry); public: - static JS::NonnullGCPtr create(JS::VM& vm, Function steps, JS::GCPtr target_navigable); + static JS::NonnullGCPtr create(JS::VM& vm, JS::NonnullGCPtr> steps, JS::GCPtr target_navigable); JS::GCPtr target_navigable() const { return m_target_navigable; } void execute_steps() const { m_steps->function()(); } @@ -49,8 +49,8 @@ class SessionHistoryTraversalQueue : public JS::Cell { public: SessionHistoryTraversalQueue(); - void append(Function steps); - void append_sync(Function steps, JS::GCPtr target_navigable); + void append(JS::NonnullGCPtr> steps); + void append_sync(JS::NonnullGCPtr> steps, JS::GCPtr target_navigable); // https://html.spec.whatwg.org/multipage/browsing-the-web.html#sync-navigations-jump-queue JS::GCPtr first_synchronous_navigation_steps_with_target_navigable_not_contained_in(HashTable> const&); diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index 9c55ab0ed51..596e08547ea 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -971,7 +971,7 @@ void TraversableNavigable::traverse_the_history_by_delta(int delta, Optional steps) + void append_session_history_traversal_steps(JS::NonnullGCPtr> steps) { - m_session_history_traversal_queue->append(move(steps)); + m_session_history_traversal_queue->append(steps); } - void append_session_history_synchronous_navigation_steps(JS::NonnullGCPtr target_navigable, ESCAPING Function steps) + void append_session_history_synchronous_navigation_steps(JS::NonnullGCPtr target_navigable, JS::NonnullGCPtr> steps) { - m_session_history_traversal_queue->append_sync(move(steps), target_navigable); + m_session_history_traversal_queue->append_sync(steps, target_navigable); } String window_handle() const { return m_window_handle; }