LibWeb+WebContent: Store console clients on the DOM document

We explicitly stopped visting the map of documents to console clients in
commit 44659f2f2a to avoid keeping the
document alive. However, if nothing else visits the console clients, we
may set the top-level console client to a client that has been garbage
collected.

So instead of storing this map, just store the console client on the
document itself. This will allow the document to visit its client.
This commit is contained in:
Timothy Flynn 2024-07-31 13:18:44 -04:00 committed by Andreas Kling
commit 0a819e628e
Notes: github-actions[bot] 2024-08-01 09:36:46 +00:00
5 changed files with 12 additions and 26 deletions

View file

@ -80,7 +80,6 @@ void PageClient::visit_edges(JS::Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_page);
visitor.ignore(m_console_clients);
}
ConnectionFromClient& PageClient::client() const
@ -342,13 +341,10 @@ void PageClient::page_did_create_new_document(Web::DOM::Document& document)
void PageClient::page_did_change_active_document_in_top_level_browsing_context(Web::DOM::Document& document)
{
if (auto console_client = m_console_clients.get(document); console_client.has_value())
m_top_level_document_console_client = *console_client.value();
}
void PageClient::page_did_destroy_document(Web::DOM::Document& document)
{
destroy_js_console(document);
if (auto console_client = document.console_client()) {
auto& web_content_console_client = verify_cast<WebContentConsoleClient>(*console_client);
m_top_level_document_console_client = web_content_console_client;
}
}
void PageClient::page_did_finish_loading(URL::URL const& url)
@ -671,12 +667,7 @@ void PageClient::initialize_js_console(Web::DOM::Document& document)
auto console_client = heap().allocate_without_realm<WebContentConsoleClient>(console_object->console(), document.realm(), *this);
console_object->console().set_client(*console_client);
m_console_clients.set(document, console_client);
}
void PageClient::destroy_js_console(Web::DOM::Document& document)
{
m_console_clients.remove(document);
document.set_console_client(console_client);
}
void PageClient::js_console_input(ByteString const& js_source)