@@ -484,6 +484,85 @@ void TraversableSessionHistory::clear_current_entry_reload_pending()
484484 m_entries[*current_top_level_entry_index].document_state .reload_pending = false ;
485485}
486486
487+ template <typename UpdateEntry>
488+ static bool update_session_history_entry_by_navigation_api_key (Vector<TraversableSessionHistory::Entry>& entries, Utf16String const & navigation_api_key, UpdateEntry const & update_entry)
489+ {
490+ auto did_update = false ;
491+ for (auto & entry : entries) {
492+ if (entry.navigation_api_key == navigation_api_key) {
493+ update_entry (entry);
494+ did_update = true ;
495+ }
496+ }
497+ return did_update;
498+ }
499+
500+ template <typename UpdateEntry>
501+ static bool update_nested_session_history_entries_by_navigation_api_key (Vector<TraversableSessionHistory::Entry>& entries, Web::HTML ::CrossProcessId navigable_id, Utf16String const & navigation_api_key, UpdateEntry const & update_entry)
502+ {
503+ auto did_update = false ;
504+ for (auto & entry : entries) {
505+ for (auto & nested_history : entry.document_state .nested_histories ) {
506+ if (nested_history.id == navigable_id)
507+ did_update |= update_session_history_entry_by_navigation_api_key (nested_history.entries , navigation_api_key, update_entry);
508+ did_update |= update_nested_session_history_entries_by_navigation_api_key (nested_history.entries , navigable_id, navigation_api_key, update_entry);
509+ }
510+ }
511+ return did_update;
512+ }
513+
514+ template <typename UpdateEntry>
515+ static bool update_top_level_session_history_entries_by_navigation_api_key (Vector<TraversableSessionHistory::Entry>& entries, Vector<TraversableSessionHistory::Entry>& web_content_known_entries, Utf16String const & navigation_api_key, UpdateEntry const & update_entry)
516+ {
517+ auto did_update = update_session_history_entry_by_navigation_api_key (entries, navigation_api_key, update_entry);
518+ if (!did_update)
519+ return false ;
520+
521+ update_session_history_entry_by_navigation_api_key (web_content_known_entries, navigation_api_key, update_entry);
522+
523+ return true ;
524+ }
525+
526+ template <typename UpdateEntry>
527+ static bool update_nested_session_history_entries_by_navigation_api_key (Vector<TraversableSessionHistory::Entry>& entries, Vector<TraversableSessionHistory::Entry>& web_content_known_entries, Web::HTML ::CrossProcessId nested_history_id, Utf16String const & navigation_api_key, UpdateEntry const & update_entry)
528+ {
529+ auto did_update = update_nested_session_history_entries_by_navigation_api_key (entries, nested_history_id, navigation_api_key, update_entry);
530+ if (!did_update)
531+ return false ;
532+
533+ update_nested_session_history_entries_by_navigation_api_key (web_content_known_entries, nested_history_id, navigation_api_key, update_entry);
534+
535+ return true ;
536+ }
537+
538+ bool TraversableSessionHistory::update_top_level_navigation_api_state (Utf16String const & navigation_api_key, Web::HTML ::StorageSerializationRecord navigation_api_state)
539+ {
540+ return update_top_level_session_history_entries_by_navigation_api_key (m_entries, m_web_content_known_entries, navigation_api_key, [&](Entry& entry) {
541+ entry.navigation_api_state = navigation_api_state;
542+ });
543+ }
544+
545+ bool TraversableSessionHistory::update_nested_navigation_api_state (Web::HTML ::CrossProcessId nested_history_id, Utf16String const & navigation_api_key, Web::HTML ::StorageSerializationRecord navigation_api_state)
546+ {
547+ return update_nested_session_history_entries_by_navigation_api_key (m_entries, m_web_content_known_entries, nested_history_id, navigation_api_key, [&](Entry& entry) {
548+ entry.navigation_api_state = navigation_api_state;
549+ });
550+ }
551+
552+ bool TraversableSessionHistory::update_top_level_scroll_restoration_mode (Utf16String const & navigation_api_key, Web::HTML ::ScrollRestorationMode scroll_restoration_mode)
553+ {
554+ return update_top_level_session_history_entries_by_navigation_api_key (m_entries, m_web_content_known_entries, navigation_api_key, [&](Entry& entry) {
555+ entry.scroll_restoration_mode = scroll_restoration_mode;
556+ });
557+ }
558+
559+ bool TraversableSessionHistory::update_nested_scroll_restoration_mode (Web::HTML ::CrossProcessId nested_history_id, Utf16String const & navigation_api_key, Web::HTML ::ScrollRestorationMode scroll_restoration_mode)
560+ {
561+ return update_nested_session_history_entries_by_navigation_api_key (m_entries, m_web_content_known_entries, nested_history_id, navigation_api_key, [&](Entry& entry) {
562+ entry.scroll_restoration_mode = scroll_restoration_mode;
563+ });
564+ }
565+
487566Optional<size_t > TraversableSessionHistory::current_top_level_entry_index () const
488567{
489568 if (!m_current_used_step_index.has_value ())
0 commit comments