WebContent: Store messages in WebContentConsoleClient

The `WebContentConsoleClient` now keeps a list of console messages it
has received, so these are not lost if the ConsoleWidget has not been
initialized yet.

This change does break JS console output, but only until the next
commit. :^)
This commit is contained in:
Sam Atkins 2021-09-04 11:45:36 +01:00 committed by Andreas Kling
parent c619a57cf8
commit f6a927fa20
Notes: sideshowbarker 2024-07-18 04:35:47 +09:00
3 changed files with 58 additions and 8 deletions

View file

@ -318,9 +318,9 @@ void ClientConnection::run_javascript(String const& js_source)
}
}
void ClientConnection::js_console_request_messages(i32)
void ClientConnection::js_console_request_messages(i32 start_index)
{
TODO();
m_console_client->send_messages(start_index);
}
Messages::WebContentServer::GetSelectedTextResponse ClientConnection::get_selected_text()

View file

@ -26,7 +26,7 @@ WebContentConsoleClient::WebContentConsoleClient(JS::Console& console, WeakPtr<J
m_console_global_object = JS::make_handle(console_global_object);
}
void WebContentConsoleClient::handle_input(const String& js_source)
void WebContentConsoleClient::handle_input(String const& js_source)
{
auto parser = JS::Parser(JS::Lexer(js_source));
auto program = parser.parse_program();
@ -58,14 +58,52 @@ void WebContentConsoleClient::handle_input(const String& js_source)
print_html(JS::MarkupGenerator::html_from_value(m_interpreter->vm().last_value()));
}
void WebContentConsoleClient::print_html(const String& line)
void WebContentConsoleClient::print_html(String const& line)
{
m_client.async_did_js_console_output("html", line);
m_message_log.append({ .type = ConsoleOutput::Type::HTML, .html = line });
m_client.async_did_output_js_console_message(m_message_log.size() - 1);
}
void WebContentConsoleClient::clear_output()
{
m_client.async_did_js_console_output("clear_output", {});
m_message_log.append({ .type = ConsoleOutput::Type::Clear, .html = "" });
m_client.async_did_output_js_console_message(m_message_log.size() - 1);
}
void WebContentConsoleClient::send_messages(i32 start_index)
{
// FIXME: Cap the number of messages we send at once?
auto messages_to_send = m_message_log.size() - start_index;
if (messages_to_send < 1) {
// When the console is first created, it requests any messages that happened before
// then, by requesting with start_index=0. If we don't have any messages at all, that
// is still a valid request, and we can just ignore it.
if (start_index != 0)
m_client.did_misbehave("Requested non-existent console message index.");
return;
}
// FIXME: Replace with a single Vector of message structs
Vector<String> message_types;
Vector<String> messages;
message_types.ensure_capacity(messages_to_send);
messages.ensure_capacity(messages_to_send);
for (size_t i = start_index; i < m_message_log.size(); i++) {
auto& message = m_message_log[i];
switch (message.type) {
case ConsoleOutput::Type::HTML:
message_types.append("html");
break;
case ConsoleOutput::Type::Clear:
message_types.append("clear");
break;
}
messages.append(message.html);
}
m_client.async_did_get_js_console_messages(start_index, message_types, messages);
}
JS::Value WebContentConsoleClient::log()

View file

@ -1,6 +1,7 @@
/*
* Copyright (c) 2021, Brandon Scott <xeon.productions@gmail.com>
* Copyright (c) 2020, Hunter Salyer <thefalsehonesty@gmail.com>
* Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -19,7 +20,8 @@ class WebContentConsoleClient final : public JS::ConsoleClient {
public:
WebContentConsoleClient(JS::Console&, WeakPtr<JS::Interpreter>, ClientConnection&);
void handle_input(const String& js_source);
void handle_input(String const& js_source);
void send_messages(i32 start_index);
private:
virtual JS::Value log() override;
@ -38,7 +40,17 @@ private:
JS::Handle<ConsoleGlobalObject> m_console_global_object;
void clear_output();
void print_html(const String& line);
void print_html(String const& line);
struct ConsoleOutput {
enum class Type {
HTML,
Clear
};
Type type;
String html;
};
Vector<ConsoleOutput> m_message_log;
};
}