diff options
-rw-r--r-- | Userland/Services/WebContent/ClientConnection.cpp | 4 | ||||
-rw-r--r-- | Userland/Services/WebContent/WebContentConsoleClient.cpp | 46 | ||||
-rw-r--r-- | Userland/Services/WebContent/WebContentConsoleClient.h | 16 |
3 files changed, 58 insertions, 8 deletions
diff --git a/Userland/Services/WebContent/ClientConnection.cpp b/Userland/Services/WebContent/ClientConnection.cpp index 7d9064ad04..0e1eda7639 100644 --- a/Userland/Services/WebContent/ClientConnection.cpp +++ b/Userland/Services/WebContent/ClientConnection.cpp @@ -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() diff --git a/Userland/Services/WebContent/WebContentConsoleClient.cpp b/Userland/Services/WebContent/WebContentConsoleClient.cpp index b3a9c0ef9d..eb87b410cd 100644 --- a/Userland/Services/WebContent/WebContentConsoleClient.cpp +++ b/Userland/Services/WebContent/WebContentConsoleClient.cpp @@ -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() diff --git a/Userland/Services/WebContent/WebContentConsoleClient.h b/Userland/Services/WebContent/WebContentConsoleClient.h index 3fbeb18062..16df4bcf9e 100644 --- a/Userland/Services/WebContent/WebContentConsoleClient.h +++ b/Userland/Services/WebContent/WebContentConsoleClient.h @@ -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; }; } |