Skip to content

Commit

Permalink
LibJS+LibWebView+WebContent+Ladybird: Output GC-graph into a file
Browse files Browse the repository at this point in the history
Instead of displaying a massive JSON in stdout, it's more practical
to save the GC-graph to a file.
  • Loading branch information
kalenikaliaksandr authored and awesomekling committed Dec 12, 2023
1 parent ed1bee2 commit 57e5aba
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 13 deletions.
7 changes: 6 additions & 1 deletion Ladybird/Qt/BrowserWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,12 @@ BrowserWindow::BrowserWindow(Vector<URL> const& initial_urls, WebView::CookieJar
auto* dump_gc_graph_action = new QAction("Dump GC graph", this);
debug_menu->addAction(dump_gc_graph_action);
QObject::connect(dump_gc_graph_action, &QAction::triggered, this, [this] {
debug_request("dump-gc-graph");
if (m_current_tab) {
auto gc_graph_path = m_current_tab->view().dump_gc_graph();
warnln("\033[33;1mDumped GC-graph into {}"
"\033[0m",
gc_graph_path);
}
});

auto* clear_cache_action = new QAction("Clear &Cache", this);
Expand Down
8 changes: 4 additions & 4 deletions Userland/Libraries/LibJS/Heap/Heap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ class GraphConstructorVisitor final : public Cell::Visitor {
}
}

void dump()
AK::JsonObject dump()
{
auto graph = AK::JsonObject();
for (auto& it : m_graph) {
Expand Down Expand Up @@ -233,7 +233,7 @@ class GraphConstructorVisitor final : public Cell::Visitor {
graph.set(DeprecatedString::number(it.key), node);
}

dbgln("{}", graph.to_deprecated_string());
return graph;
}

private:
Expand All @@ -253,14 +253,14 @@ class GraphConstructorVisitor final : public Cell::Visitor {
FlatPtr m_max_block_address;
};

void Heap::dump_graph()
AK::JsonObject Heap::dump_graph()
{
HashMap<Cell*, HeapRoot> roots;
gather_roots(roots);
GraphConstructorVisitor visitor(*this, roots);
vm().bytecode_interpreter().visit_edges(visitor);
visitor.visit_all_cells();
visitor.dump();
return visitor.dump();
}

void Heap::collect_garbage(CollectionType collection_type, bool print_report)
Expand Down
2 changes: 1 addition & 1 deletion Userland/Libraries/LibJS/Heap/Heap.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class Heap : public HeapBase {
};

void collect_garbage(CollectionType = CollectionType::CollectGarbage, bool print_report = false);
void dump_graph();
AK::JsonObject dump_graph();

bool should_collect_on_every_allocation() const { return m_should_collect_on_every_allocation; }
void set_should_collect_on_every_allocation(bool b) { m_should_collect_on_every_allocation = b; }
Expand Down
17 changes: 15 additions & 2 deletions Userland/Libraries/LibWebView/ViewImplementation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,8 @@ static ErrorOr<LexicalPath> save_screenshot(Gfx::ShareableBitmap const& bitmap)

auto encoded = TRY(Gfx::PNGWriter::encode(*bitmap.bitmap()));

auto screenshot_file = TRY(Core::File::open(path.string(), Core::File::OpenMode::Write));
TRY(screenshot_file->write_until_depleted(encoded));
auto dump_file = TRY(Core::File::open(path.string(), Core::File::OpenMode::Write));
TRY(dump_file->write_until_depleted(encoded));

return path;
}
Expand Down Expand Up @@ -432,6 +432,19 @@ ErrorOr<LexicalPath> ViewImplementation::take_dom_node_screenshot(i32 node_id)
return save_screenshot(bitmap);
}

ErrorOr<LexicalPath> ViewImplementation::dump_gc_graph()
{
auto gc_graph_json = client().dump_gc_graph();

LexicalPath path { Core::StandardPaths::tempfile_directory() };
path = path.append(TRY(Core::DateTime::now().to_string("gc-graph-%Y-%m-%d-%H-%M-%S.json"sv)));

auto screenshot_file = TRY(Core::File::open(path.string(), Core::File::OpenMode::Write));
TRY(screenshot_file->write_until_depleted(gc_graph_json.bytes()));

return path;
}

void ViewImplementation::set_user_style_sheet(String source)
{
client().async_set_user_style(move(source));
Expand Down
2 changes: 2 additions & 0 deletions Userland/Libraries/LibWebView/ViewImplementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ class ViewImplementation {
ErrorOr<LexicalPath> take_screenshot(ScreenshotType);
ErrorOr<LexicalPath> take_dom_node_screenshot(i32);

ErrorOr<LexicalPath> dump_gc_graph();

void set_user_style_sheet(String source);
// Load Native.css as the User style sheet, which attempts to make WebView content look as close to
// native GUI widgets as possible.
Expand Down
11 changes: 6 additions & 5 deletions Userland/Services/WebContent/ConnectionFromClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,11 +443,6 @@ void ConnectionFromClient::debug_request(DeprecatedString const& request, Deprec
return;
}

if (request == "dump-gc-graph") {
Web::Bindings::main_thread_vm().heap().dump_graph();
return;
}

if (request == "set-line-box-borders") {
bool state = argument == "on";
page().set_should_show_line_box_borders(state);
Expand Down Expand Up @@ -876,6 +871,12 @@ Messages::WebContentServer::TakeDomNodeScreenshotResponse ConnectionFromClient::
return bitmap->to_shareable_bitmap();
}

Messages::WebContentServer::DumpGcGraphResponse ConnectionFromClient::dump_gc_graph()
{
auto gc_graph_json = Web::Bindings::main_thread_vm().heap().dump_graph();
return MUST(String::from_deprecated_string(gc_graph_json.to_deprecated_string()));
}

Messages::WebContentServer::GetSelectedTextResponse ConnectionFromClient::get_selected_text()
{
return page().page().focused_context().selected_text();
Expand Down
2 changes: 2 additions & 0 deletions Userland/Services/WebContent/ConnectionFromClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ class ConnectionFromClient final
virtual Messages::WebContentServer::TakeDocumentScreenshotResponse take_document_screenshot() override;
virtual Messages::WebContentServer::TakeDomNodeScreenshotResponse take_dom_node_screenshot(i32 node_id) override;

virtual Messages::WebContentServer::DumpGcGraphResponse dump_gc_graph() override;

virtual Messages::WebContentServer::GetLocalStorageEntriesResponse get_local_storage_entries() override;
virtual Messages::WebContentServer::GetSessionStorageEntriesResponse get_session_storage_entries() override;

Expand Down
2 changes: 2 additions & 0 deletions Userland/Services/WebContent/WebContentServer.ipc
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ endpoint WebContentServer
take_document_screenshot() => (Gfx::ShareableBitmap data)
take_dom_node_screenshot(i32 node_id) => (Gfx::ShareableBitmap data)

dump_gc_graph() => (String json)

run_javascript(DeprecatedString js_source) =|

dump_layout_tree() => (DeprecatedString dump)
Expand Down

0 comments on commit 57e5aba

Please sign in to comment.