From ce694490f310b6da886ef086ba9c32c407528883 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 8 Dec 2021 19:43:29 +0000 Subject: LibJS+WebContent+js: Bring console.assert() to spec --- Userland/Libraries/LibJS/Console.cpp | 44 +++++++++++++++++++++- Userland/Libraries/LibJS/Console.h | 3 +- .../WebContent/WebContentConsoleClient.cpp | 22 ----------- .../Services/WebContent/WebContentConsoleClient.h | 1 - Userland/Utilities/js.cpp | 15 +------- 5 files changed, 44 insertions(+), 41 deletions(-) (limited to 'Userland') diff --git a/Userland/Libraries/LibJS/Console.cpp b/Userland/Libraries/LibJS/Console.cpp index c56e2c6fa8..ce8ef04db6 100644 --- a/Userland/Libraries/LibJS/Console.cpp +++ b/Userland/Libraries/LibJS/Console.cpp @@ -149,10 +149,50 @@ ThrowCompletionOr Console::count_reset() return js_undefined(); } -Value Console::assert_() +// 1.1.1. assert(condition, ...data), https://console.spec.whatwg.org/#assert +ThrowCompletionOr Console::assert_() { + // 1. If condition is true, return. + auto condition = vm().argument(0).to_boolean(); + if (condition) + return js_undefined(); + + // 2. Let message be a string without any formatting specifiers indicating generically an assertion failure (such as "Assertion failed"). + auto message = js_string(vm(), "Assertion failed"); + + // NOTE: Assemble `data` from the function arguments. + Vector data; + if (vm().argument_count() > 1) { + data.ensure_capacity(vm().argument_count() - 1); + for (size_t i = 1; i < vm().argument_count(); ++i) { + data.append(vm().argument(i)); + } + } + + // 3. If data is empty, append message to data. + if (data.is_empty()) { + data.append(message); + } + // 4. Otherwise: + else { + // 1. Let first be data[0]. + auto& first = data[0]; + // 2. If Type(first) is not String, then prepend message to data. + if (!first.is_string()) { + data.prepend(message); + } + // 3. Otherwise: + else { + // 1. Let concat be the concatenation of message, U+003A (:), U+0020 SPACE, and first. + auto concat = js_string(vm(), String::formatted("{}: {}", message->string(), first.to_string(global_object()).value())); + // 2. Set data[0] to concat. + data[0] = concat; + } + } + + // 5. Perform Logger("assert", data). if (m_client) - return m_client->assert_(); + TRY(m_client->logger(LogLevel::Assert, data)); return js_undefined(); } diff --git a/Userland/Libraries/LibJS/Console.h b/Userland/Libraries/LibJS/Console.h index 2930dcc9eb..e6e3591ba1 100644 --- a/Userland/Libraries/LibJS/Console.h +++ b/Userland/Libraries/LibJS/Console.h @@ -65,7 +65,7 @@ public: Value trace(); ThrowCompletionOr count(); ThrowCompletionOr count_reset(); - Value assert_(); + ThrowCompletionOr assert_(); void output_debug_message(LogLevel log_level, String output) const; @@ -89,7 +89,6 @@ public: virtual void clear() = 0; virtual Value trace() = 0; - virtual Value assert_() = 0; protected: virtual ~ConsoleClient() = default; diff --git a/Userland/Services/WebContent/WebContentConsoleClient.cpp b/Userland/Services/WebContent/WebContentConsoleClient.cpp index 56e2eda098..414f1b2adf 100644 --- a/Userland/Services/WebContent/WebContentConsoleClient.cpp +++ b/Userland/Services/WebContent/WebContentConsoleClient.cpp @@ -134,27 +134,6 @@ JS::Value WebContentConsoleClient::trace() return JS::js_undefined(); } -JS::Value WebContentConsoleClient::assert_() -{ - auto& vm = this->vm(); - if (!vm.argument(0).to_boolean()) { - StringBuilder html; - if (vm.argument_count() > 1) { - html.append(""); - html.append("Assertion failed:"); - html.append(""); - html.append(" "); - html.append(escape_html_entities(vm.join_arguments(1))); - } else { - html.append(""); - html.append("Assertion failed"); - html.append(""); - } - print_html(html.string_view()); - } - return JS::js_undefined(); -} - // 2.3. Printer(logLevel, args[, options]), https://console.spec.whatwg.org/#printer JS::ThrowCompletionOr WebContentConsoleClient::printer(JS::Console::LogLevel log_level, Vector& arguments) { @@ -189,5 +168,4 @@ JS::ThrowCompletionOr WebContentConsoleClient::printer(JS::Console::L print_html(html.string_view()); return JS::js_undefined(); } - } diff --git a/Userland/Services/WebContent/WebContentConsoleClient.h b/Userland/Services/WebContent/WebContentConsoleClient.h index eecaca5e4d..f4dd879a77 100644 --- a/Userland/Services/WebContent/WebContentConsoleClient.h +++ b/Userland/Services/WebContent/WebContentConsoleClient.h @@ -26,7 +26,6 @@ public: private: virtual void clear() override; virtual JS::Value trace() override; - virtual JS::Value assert_() override; virtual JS::ThrowCompletionOr printer(JS::Console::LogLevel log_level, Vector&) override; ClientConnection& m_client; diff --git a/Userland/Utilities/js.cpp b/Userland/Utilities/js.cpp index 187e463847..3c7ea906db 100644 --- a/Userland/Utilities/js.cpp +++ b/Userland/Utilities/js.cpp @@ -1140,20 +1140,6 @@ public: return JS::js_undefined(); } - virtual JS::Value assert_() override - { - auto& vm = this->vm(); - if (!vm.argument(0).to_boolean()) { - if (vm.argument_count() > 1) { - js_out("\033[31;1mAssertion failed:\033[0m"); - js_outln(" {}", vm.join_arguments(1)); - } else { - js_outln("\033[31;1mAssertion failed\033[0m"); - } - } - return JS::js_undefined(); - } - virtual JS::ThrowCompletionOr printer(JS::Console::LogLevel log_level, Vector& arguments) override { auto output = String::join(" ", arguments); @@ -1164,6 +1150,7 @@ public: js_outln("\033[36;1m{}\033[0m", output); break; case JS::Console::LogLevel::Error: + case JS::Console::LogLevel::Assert: js_outln("\033[31;1m{}\033[0m", output); break; case JS::Console::LogLevel::Info: -- cgit v1.2.3