diff --git a/Ladybird/Qt/BrowserWindow.cpp b/Ladybird/Qt/BrowserWindow.cpp index 924a6492d9..b1812e354a 100644 --- a/Ladybird/Qt/BrowserWindow.cpp +++ b/Ladybird/Qt/BrowserWindow.cpp @@ -195,6 +195,12 @@ BrowserWindow::BrowserWindow(Vector const& initial_urls, WebView::CookieJar auto* debug_menu = menuBar()->addMenu("&Debug"); + auto* dump_session_history_tree_action = new QAction("Dump Session History Tree", this); + debug_menu->addAction(dump_session_history_tree_action); + QObject::connect(dump_session_history_tree_action, &QAction::triggered, this, [this] { + debug_request("dump-session-history"); + }); + auto* dump_dom_tree_action = new QAction("Dump &DOM Tree", this); dump_dom_tree_action->setIcon(QIcon(QString("%1/res/icons/browser/dom-tree.png").arg(s_serenity_resource_root.characters()))); debug_menu->addAction(dump_dom_tree_action); diff --git a/Userland/Libraries/LibWeb/Dump.cpp b/Userland/Libraries/LibWeb/Dump.cpp index 3270bae11a..2dcefeb9ab 100644 --- a/Userland/Libraries/LibWeb/Dump.cpp +++ b/Userland/Libraries/LibWeb/Dump.cpp @@ -23,9 +23,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -46,6 +48,28 @@ static void indent(StringBuilder& builder, int levels) builder.append(" "sv); } +static ErrorOr dump_session_history_entry(StringBuilder& builder, HTML::SessionHistoryEntry const& session_history_entry, int indent_levels) +{ + indent(builder, indent_levels); + auto const& document = session_history_entry.document_state->document(); + TRY(builder.try_appendff("step=({}) url=({}) is-active=({})\n", session_history_entry.step.get(), session_history_entry.url, document && document->is_active())); + for (auto const& nested_history : session_history_entry.document_state->nested_histories()) { + for (auto const& nested_she : nested_history.entries) { + TRY(dump_session_history_entry(builder, *nested_she, indent_levels + 1)); + } + } + return {}; +} + +void dump_tree(HTML::TraversableNavigable& traversable) +{ + StringBuilder builder; + for (auto const& she : traversable.session_history_entries()) { + dump_session_history_entry(builder, *she, 0).release_value_but_fixme_should_propagate_errors(); + } + dbgln("{}", builder.string_view()); +} + void dump_tree(DOM::Node const& node) { StringBuilder builder; diff --git a/Userland/Libraries/LibWeb/Dump.h b/Userland/Libraries/LibWeb/Dump.h index 58f3035f31..3bb5b8ddd7 100644 --- a/Userland/Libraries/LibWeb/Dump.h +++ b/Userland/Libraries/LibWeb/Dump.h @@ -13,6 +13,7 @@ namespace Web { +void dump_tree(HTML::TraversableNavigable&); void dump_tree(StringBuilder&, DOM::Node const&); void dump_tree(DOM::Node const&); void dump_tree(StringBuilder&, Layout::Node const&, bool show_box_model = false, bool show_specified_style = false, bool colorize = false); diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index a09b8755e0..f4b2c90e5d 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -359,6 +360,11 @@ void ConnectionFromClient::report_finished_handling_input_event(bool event_was_h void ConnectionFromClient::debug_request(DeprecatedString const& request, DeprecatedString const& argument) { + if (request == "dump-session-history") { + auto const& traversable = page().top_level_traversable(); + Web::dump_tree(*traversable); + } + if (request == "dump-dom-tree") { if (auto* doc = page().top_level_browsing_context().active_document()) Web::dump_tree(*doc);