diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index ab165ec566..4f43fe77d8 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -349,6 +349,7 @@ set(SOURCES HTML/Timer.cpp HTML/TimeRanges.cpp HTML/TrackEvent.cpp + HTML/TraversableNavigable.cpp HTML/VideoTrack.cpp HTML/VideoTrackList.cpp HTML/Window.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 4c751844cf..9192e8f7b6 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -385,6 +385,7 @@ class TextMetrics; class Timer; class TimeRanges; class TrackEvent; +class TraversableNavigable; class VideoTrack; class VideoTrackList; class Window; diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp new file mode 100644 index 0000000000..3576728331 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::HTML { + +TraversableNavigable::TraversableNavigable() = default; + +TraversableNavigable::~TraversableNavigable() = default; + +void TraversableNavigable::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + for (auto& entry : m_session_history_entries) + visitor.visit(entry); +} + +// https://html.spec.whatwg.org/multipage/document-sequences.html#top-level-traversable +bool TraversableNavigable::is_top_level_traversable() const +{ + // A top-level traversable is a traversable navigable with a null parent. + return parent() == nullptr; +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h new file mode 100644 index 0000000000..fba7537d32 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::HTML { + +// https://html.spec.whatwg.org/multipage/document-sequences.html#traversable-navigable +class TraversableNavigable final : public Navigable { + JS_CELL(TraversableNavigable, Navigable); + +public: + virtual ~TraversableNavigable() override; + + bool is_top_level_traversable() const; + + int current_session_history_step() const { return m_current_session_history_step; }; + Vector> const& session_history_entries() const { return m_session_history_entries; }; + bool running_nested_apply_history_step() const { return m_running_nested_apply_history_step; }; + VisibilityState system_visibility_state() const { return m_system_visibility_state; }; + +private: + TraversableNavigable(); + + virtual void visit_edges(Cell::Visitor&) override; + + // https://html.spec.whatwg.org/multipage/document-sequences.html#tn-current-session-history-step + int m_current_session_history_step { 0 }; + + // https://html.spec.whatwg.org/multipage/document-sequences.html#tn-session-history-entries + Vector> m_session_history_entries; + + // FIXME: https://html.spec.whatwg.org/multipage/document-sequences.html#tn-session-history-traversal-queue + + // https://html.spec.whatwg.org/multipage/document-sequences.html#tn-running-nested-apply-history-step + bool m_running_nested_apply_history_step { false }; + + // https://html.spec.whatwg.org/multipage/document-sequences.html#system-visibility-state + VisibilityState m_system_visibility_state { VisibilityState::Visible }; +}; + +}