/* * Copyright (c) 2023, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Web::HTML { struct SessionHistoryTraversalQueueEntry : public JS::Cell { JS_CELL(SessionHistoryTraversalQueueEntry, JS::Cell); JS_DECLARE_ALLOCATOR(SessionHistoryTraversalQueueEntry); public: static JS::NonnullGCPtr create(JS::VM& vm, Function steps, JS::GCPtr target_navigable); JS::GCPtr target_navigable() const { return m_target_navigable; } void execute_steps() const { m_steps->function()(); } private: SessionHistoryTraversalQueueEntry(JS::NonnullGCPtr> steps, JS::GCPtr target_navigable) : m_steps(steps) , m_target_navigable(target_navigable) { } virtual void visit_edges(Cell::Visitor&) override; JS::NonnullGCPtr> m_steps; JS::GCPtr m_target_navigable; }; // https://html.spec.whatwg.org/multipage/document-sequences.html#tn-session-history-traversal-queue class SessionHistoryTraversalQueue : public JS::Cell { JS_CELL(SessionHistoryTraversalQueue, Cell); JS_DECLARE_ALLOCATOR(SessionHistoryTraversalQueue); public: SessionHistoryTraversalQueue(); void append(Function steps); void append_sync(Function 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(Vector> const& list); private: virtual void visit_edges(Cell::Visitor&) override; Vector> m_queue; RefPtr m_timer; bool m_is_task_running { false }; }; }