/* * Copyright (c) 2023, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace Web::HTML { using SessionHistoryTraversalSteps = GC::Function>)>; struct SessionHistoryTraversalQueueEntry : public JS::Cell { GC_CELL(SessionHistoryTraversalQueueEntry, JS::Cell); GC_DECLARE_ALLOCATOR(SessionHistoryTraversalQueueEntry); public: static GC::Ref create(JS::VM& vm, GC::Ref steps, GC::Ptr target_navigable); GC::Ptr target_navigable() const { return m_target_navigable; } void execute_steps(NonnullRefPtr> promise) const { m_steps->function()(move(promise)); } private: SessionHistoryTraversalQueueEntry(GC::Ref steps, GC::Ptr target_navigable) : m_steps(steps) , m_target_navigable(target_navigable) { } virtual void visit_edges(Cell::Visitor&) override; GC::Ref m_steps; GC::Ptr m_target_navigable; }; // https://html.spec.whatwg.org/multipage/document-sequences.html#tn-session-history-traversal-queue class WEB_API SessionHistoryTraversalQueue : public JS::Cell { GC_CELL(SessionHistoryTraversalQueue, JS::Cell); GC_DECLARE_ALLOCATOR(SessionHistoryTraversalQueue); public: SessionHistoryTraversalQueue(); void append(GC::Ref steps); void append_sync(GC::Ref steps, GC::Ptr target_navigable); // https://html.spec.whatwg.org/multipage/browsing-the-web.html#sync-navigations-jump-queue GC::Ptr first_synchronous_navigation_steps_with_target_navigable_not_contained_in(HashTable> const&); private: virtual void visit_edges(Cell::Visitor&) override; void process_queue(); void schedule_processing(); Vector> m_queue; bool m_processing_scheduled { false }; RefPtr> m_current_promise; }; }