From 204a6f9241fe2547288ff648e1b0e6f6d4b64dc4 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 30 Aug 2023 08:45:26 -0400 Subject: [PATCH] Ladybird+LibWebView: Move console history tracking to ConsoleClient This will allow other chromes to make use of history in their console implementations. --- Ladybird/AppKit/UI/Console.mm | 2 +- Ladybird/Qt/ConsoleWidget.cpp | 46 ++++++++----------- Ladybird/Qt/ConsoleWidget.h | 6 +-- .../Applications/Browser/ConsoleWidget.cpp | 2 +- .../Libraries/LibWebView/ConsoleClient.cpp | 38 ++++++++++++++- Userland/Libraries/LibWebView/ConsoleClient.h | 9 +++- 6 files changed, 69 insertions(+), 34 deletions(-) diff --git a/Ladybird/AppKit/UI/Console.mm b/Ladybird/AppKit/UI/Console.mm index 65edc65e64..b3b13f7a5b 100644 --- a/Ladybird/AppKit/UI/Console.mm +++ b/Ladybird/AppKit/UI/Console.mm @@ -141,7 +141,7 @@ static constexpr CGFloat const WINDOW_HEIGHT = 600; auto script = Ladybird::ns_string_to_string(ns_script); if (!script.bytes_as_string_view().is_whitespace()) { - m_console_client->execute(script); + m_console_client->execute(move(script)); [text_view setString:@""]; } diff --git a/Ladybird/Qt/ConsoleWidget.cpp b/Ladybird/Qt/ConsoleWidget.cpp index 6b44549a33..baaed6370d 100644 --- a/Ladybird/Qt/ConsoleWidget.cpp +++ b/Ladybird/Qt/ConsoleWidget.cpp @@ -58,6 +58,16 @@ ConsoleWidget::ConsoleWidget(WebContentView& content_view) ConsoleWidget::~ConsoleWidget() = default; +Optional ConsoleWidget::previous_history_item() +{ + return m_console_client->previous_history_item(); +} + +Optional ConsoleWidget::next_history_item() +{ + return m_console_client->next_history_item(); +} + void ConsoleWidget::reset() { m_console_client->reset(); @@ -66,38 +76,22 @@ void ConsoleWidget::reset() void ConsoleInputEdit::keyPressEvent(QKeyEvent* event) { switch (event->key()) { - case Qt::Key_Down: { - if (m_history.is_empty()) - break; - auto last_index = m_history.size() - 1; - if (m_history_index < last_index) { - m_history_index++; - setText(qstring_from_ak_deprecated_string(m_history.at(m_history_index))); - } else if (m_history_index == last_index) { - m_history_index++; - clear(); - } - break; - } - case Qt::Key_Up: - if (m_history_index > 0) { - m_history_index--; - setText(qstring_from_ak_deprecated_string(m_history.at(m_history_index))); - } + if (auto script = m_console_widget.previous_history_item(); script.has_value()) + setText(qstring_from_ak_string(*script)); + break; + + case Qt::Key_Down: + if (auto script = m_console_widget.next_history_item(); script.has_value()) + setText(qstring_from_ak_string(*script)); break; case Qt::Key_Return: { - auto js_source = ak_deprecated_string_from_qstring(text()); - if (js_source.is_whitespace()) + auto js_source = MUST(ak_string_from_qstring(text())); + if (js_source.bytes_as_string_view().is_whitespace()) return; - if (m_history.is_empty() || m_history.last() != js_source) { - m_history.append(js_source); - m_history_index = m_history.size(); - } - - m_console_widget.client().execute(js_source); + m_console_widget.client().execute(std::move(js_source)); clear(); break; diff --git a/Ladybird/Qt/ConsoleWidget.h b/Ladybird/Qt/ConsoleWidget.h index df736c99a7..148a77944b 100644 --- a/Ladybird/Qt/ConsoleWidget.h +++ b/Ladybird/Qt/ConsoleWidget.h @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -26,6 +25,9 @@ public: explicit ConsoleWidget(WebContentView& content_view); virtual ~ConsoleWidget(); + Optional previous_history_item(); + Optional next_history_item(); + WebView::ConsoleClient& client() { return *m_console_client; } WebContentView& view() { return *m_output_view; } @@ -51,8 +53,6 @@ private: virtual void keyPressEvent(QKeyEvent* event) override; ConsoleWidget& m_console_widget; - Vector m_history; - size_t m_history_index { 0 }; }; } diff --git a/Userland/Applications/Browser/ConsoleWidget.cpp b/Userland/Applications/Browser/ConsoleWidget.cpp index 6e30e14875..635ed0f844 100644 --- a/Userland/Applications/Browser/ConsoleWidget.cpp +++ b/Userland/Applications/Browser/ConsoleWidget.cpp @@ -48,7 +48,7 @@ ConsoleWidget::ConsoleWidget(WebView::OutOfProcessWebView& content_view) m_input->add_current_text_to_history(); m_input->clear(); - m_console_client->execute(js_source); + m_console_client->execute(MUST(String::from_deprecated_string(js_source))); }; set_focus_proxy(m_input); diff --git a/Userland/Libraries/LibWebView/ConsoleClient.cpp b/Userland/Libraries/LibWebView/ConsoleClient.cpp index 59aa8cac72..99c40dc8da 100644 --- a/Userland/Libraries/LibWebView/ConsoleClient.cpp +++ b/Userland/Libraries/LibWebView/ConsoleClient.cpp @@ -47,10 +47,44 @@ ConsoleClient::~ConsoleClient() m_content_web_view.on_received_console_messages = nullptr; } -void ConsoleClient::execute(StringView script) +void ConsoleClient::execute(String script) { print_source(script); - m_content_web_view.js_console_input(script); + m_content_web_view.js_console_input(script.to_deprecated_string()); + + if (m_history.is_empty() || m_history.last() != script) { + m_history.append(move(script)); + m_history_index = m_history.size(); + } +} + +Optional ConsoleClient::previous_history_item() +{ + if (m_history_index == 0) + return {}; + + --m_history_index; + return m_history.at(m_history_index); +} + +Optional ConsoleClient::next_history_item() +{ + if (m_history.is_empty()) + return {}; + + auto last_index = m_history.size() - 1; + + if (m_history_index < last_index) { + ++m_history_index; + return m_history.at(m_history_index); + } + + if (m_history_index == last_index) { + ++m_history_index; + return String {}; + } + + return {}; } void ConsoleClient::clear() diff --git a/Userland/Libraries/LibWebView/ConsoleClient.h b/Userland/Libraries/LibWebView/ConsoleClient.h index 669a92b1a5..218d6c00f9 100644 --- a/Userland/Libraries/LibWebView/ConsoleClient.h +++ b/Userland/Libraries/LibWebView/ConsoleClient.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -20,7 +21,10 @@ public: explicit ConsoleClient(ViewImplementation& content_web_view, ViewImplementation& console_web_view); ~ConsoleClient(); - void execute(StringView); + void execute(String); + + Optional previous_history_item(); + Optional next_history_item(); void clear(); void reset(); @@ -50,6 +54,9 @@ private: }; Vector m_group_stack; int m_next_group_id { 1 }; + + Vector m_history; + size_t m_history_index { 0 }; }; }