mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-26 16:22:07 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Vector.h>
 | |
| #include <LibWeb/HTML/Navigable.h>
 | |
| #include <LibWeb/HTML/VisibilityState.h>
 | |
| 
 | |
| namespace Web::HTML {
 | |
| 
 | |
| // https://html.spec.whatwg.org/multipage/document-sequences.html#traversable-navigable
 | |
| class TraversableNavigable final : public Navigable {
 | |
|     JS_CELL(TraversableNavigable, Navigable);
 | |
| 
 | |
| public:
 | |
|     static WebIDL::ExceptionOr<JS::NonnullGCPtr<TraversableNavigable>> create_a_new_top_level_traversable(Page&, JS::GCPtr<BrowsingContext> opener, String target_name);
 | |
|     static WebIDL::ExceptionOr<JS::NonnullGCPtr<TraversableNavigable>> create_a_fresh_top_level_traversable(Page&, AK::URL const& initial_navigation_url, Variant<Empty, String, POSTResource> = Empty {});
 | |
| 
 | |
|     virtual ~TraversableNavigable() override;
 | |
| 
 | |
|     bool is_top_level_traversable() const;
 | |
| 
 | |
|     int current_session_history_step() const { return m_current_session_history_step; }
 | |
|     Vector<JS::NonnullGCPtr<SessionHistoryEntry>>& session_history_entries() { return m_session_history_entries; }
 | |
|     Vector<JS::NonnullGCPtr<SessionHistoryEntry>> 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; }
 | |
| 
 | |
|     struct HistoryObjectLengthAndIndex {
 | |
|         size_t script_history_length;
 | |
|         size_t script_history_index;
 | |
|     };
 | |
|     HistoryObjectLengthAndIndex get_the_history_object_length_and_index(int) const;
 | |
| 
 | |
|     void apply_the_history_step(int step, Optional<SourceSnapshotParams> = {});
 | |
|     void apply_pending_history_changes();
 | |
| 
 | |
|     int get_the_used_step(int step) const;
 | |
|     Vector<JS::Handle<Navigable>> get_all_navigables_whose_current_session_history_entry_will_change_or_reload(int) const;
 | |
|     Vector<int> get_all_used_history_steps() const;
 | |
|     void clear_the_forward_session_history();
 | |
|     void traverse_the_history_by_delta(int delta);
 | |
| 
 | |
|     void destroy_top_level_traversable();
 | |
| 
 | |
| 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<JS::NonnullGCPtr<SessionHistoryEntry>> 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 };
 | |
| };
 | |
| 
 | |
| }
 | 
