1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 14:27:35 +00:00

LibJS: Implement console.assert()

This commit is contained in:
Linus Groh 2021-04-18 17:08:14 +02:00
parent e37421bddc
commit 8d490aba76
12 changed files with 89 additions and 9 deletions

View file

@ -124,4 +124,25 @@ JS::Value BrowserConsoleClient::count_reset()
return JS::js_undefined(); return JS::js_undefined();
} }
JS::Value BrowserConsoleClient::assert_()
{
auto& vm = this->vm();
if (!vm.argument(0).to_boolean()) {
StringBuilder html;
if (vm.argument_count() > 1) {
html.append("<span class=\"error\">");
html.append("Assertion failed:");
html.append("</span>");
html.append(" ");
html.append(escape_html_entities(vm.join_arguments(1)));
} else {
html.append("<span class=\"error\">");
html.append("Assertion failed");
html.append("</span>");
}
m_console_widget.print_html(html.string_view());
}
return JS::js_undefined();
}
} }

View file

@ -53,6 +53,7 @@ private:
virtual JS::Value trace() override; virtual JS::Value trace() override;
virtual JS::Value count() override; virtual JS::Value count() override;
virtual JS::Value count_reset() override; virtual JS::Value count_reset() override;
virtual JS::Value assert_() override;
ConsoleWidget& m_console_widget; ConsoleWidget& m_console_widget;
}; };

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com> * Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com>
* Copyright (c) 2020, Linus Groh <mail@linusgroh.de> * Copyright (c) 2020-2021, Linus Groh <mail@linusgroh.de>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -118,6 +118,13 @@ Value Console::count_reset()
return js_undefined(); return js_undefined();
} }
Value Console::assert_()
{
if (m_client)
return m_client->assert_();
return js_undefined();
}
unsigned Console::counter_increment(String label) unsigned Console::counter_increment(String label)
{ {
auto value = m_counters.get(label); auto value = m_counters.get(label);

View file

@ -57,13 +57,11 @@ public:
Value info(); Value info();
Value log(); Value log();
Value warn(); Value warn();
Value clear(); Value clear();
Value trace(); Value trace();
Value count(); Value count();
Value count_reset(); Value count_reset();
Value assert_();
unsigned counter_increment(String label); unsigned counter_increment(String label);
bool counter_reset(String label); bool counter_reset(String label);
@ -77,7 +75,7 @@ private:
class ConsoleClient { class ConsoleClient {
public: public:
ConsoleClient(Console& console) explicit ConsoleClient(Console& console)
: m_console(console) : m_console(console)
{ {
} }
@ -91,6 +89,7 @@ public:
virtual Value trace() = 0; virtual Value trace() = 0;
virtual Value count() = 0; virtual Value count() = 0;
virtual Value count_reset() = 0; virtual Value count_reset() = 0;
virtual Value assert_() = 0;
protected: protected:
virtual ~ConsoleClient() = default; virtual ~ConsoleClient() = default;

View file

@ -71,6 +71,7 @@ namespace JS {
P(asUintN) \ P(asUintN) \
P(asin) \ P(asin) \
P(asinh) \ P(asinh) \
P(assert) \
P(at) \ P(at) \
P(atan) \ P(atan) \
P(atan2) \ P(atan2) \

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org> * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2020, Linus Groh <mail@linusgroh.de> * Copyright (c) 2020-2021, Linus Groh <mail@linusgroh.de>
* Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com> * Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com>
* All rights reserved. * All rights reserved.
* *
@ -50,6 +50,7 @@ void ConsoleObject::initialize(GlobalObject& global_object)
define_native_function(vm.names.count, count); define_native_function(vm.names.count, count);
define_native_function(vm.names.countReset, count_reset); define_native_function(vm.names.countReset, count_reset);
define_native_function(vm.names.clear, clear); define_native_function(vm.names.clear, clear);
define_native_function(vm.names.assert, assert_);
} }
ConsoleObject::~ConsoleObject() ConsoleObject::~ConsoleObject()
@ -101,4 +102,9 @@ JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::clear)
return global_object.console().clear(); return global_object.console().clear();
} }
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::assert_)
{
return global_object.console().assert_();
}
} }

View file

@ -48,6 +48,7 @@ private:
JS_DECLARE_NATIVE_FUNCTION(count); JS_DECLARE_NATIVE_FUNCTION(count);
JS_DECLARE_NATIVE_FUNCTION(count_reset); JS_DECLARE_NATIVE_FUNCTION(count_reset);
JS_DECLARE_NATIVE_FUNCTION(clear); JS_DECLARE_NATIVE_FUNCTION(clear);
JS_DECLARE_NATIVE_FUNCTION(assert_);
}; };
} }

View file

@ -321,10 +321,10 @@ void VM::throw_exception(Exception& exception)
unwind(ScopeType::Try); unwind(ScopeType::Try);
} }
String VM::join_arguments() const String VM::join_arguments(size_t start_index) const
{ {
StringBuilder joined_arguments; StringBuilder joined_arguments;
for (size_t i = 0; i < argument_count(); ++i) { for (size_t i = start_index; i < argument_count(); ++i) {
joined_arguments.append(argument(i).to_string_without_side_effects().characters()); joined_arguments.append(argument(i).to_string_without_side_effects().characters());
if (i != argument_count() - 1) if (i != argument_count() - 1)
joined_arguments.append(' '); joined_arguments.append(' ');

View file

@ -222,7 +222,7 @@ public:
Value construct(Function&, Function& new_target, Optional<MarkedValueList> arguments, GlobalObject&); Value construct(Function&, Function& new_target, Optional<MarkedValueList> arguments, GlobalObject&);
String join_arguments() const; String join_arguments(size_t start_index = 0) const;
Value resolve_this_binding(GlobalObject&) const; Value resolve_this_binding(GlobalObject&) const;
const ScopeObject* find_this_scope() const; const ScopeObject* find_this_scope() const;

View file

@ -168,4 +168,25 @@ JS::Value WebContentConsoleClient::count_reset()
return JS::js_undefined(); 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("<span class=\"error\">");
html.append("Assertion failed:");
html.append("</span>");
html.append(" ");
html.append(escape_html_entities(vm.join_arguments(1)));
} else {
html.append("<span class=\"error\">");
html.append("Assertion failed");
html.append("</span>");
}
print_html(html.string_view());
}
return JS::js_undefined();
}
} }

View file

@ -56,6 +56,7 @@ private:
virtual JS::Value trace() override; virtual JS::Value trace() override;
virtual JS::Value count() override; virtual JS::Value count() override;
virtual JS::Value count_reset() override; virtual JS::Value count_reset() override;
virtual JS::Value assert_() override;
ClientConnection& m_client; ClientConnection& m_client;
WeakPtr<JS::Interpreter> m_interpreter; WeakPtr<JS::Interpreter> m_interpreter;

View file

@ -650,32 +650,38 @@ public:
outln("{}", vm().join_arguments()); outln("{}", vm().join_arguments());
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value info() override virtual JS::Value info() override
{ {
outln("(i) {}", vm().join_arguments()); outln("(i) {}", vm().join_arguments());
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value debug() override virtual JS::Value debug() override
{ {
outln("\033[36;1m{}\033[0m", vm().join_arguments()); outln("\033[36;1m{}\033[0m", vm().join_arguments());
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value warn() override virtual JS::Value warn() override
{ {
outln("\033[33;1m{}\033[0m", vm().join_arguments()); outln("\033[33;1m{}\033[0m", vm().join_arguments());
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value error() override virtual JS::Value error() override
{ {
outln("\033[31;1m{}\033[0m", vm().join_arguments()); outln("\033[31;1m{}\033[0m", vm().join_arguments());
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value clear() override virtual JS::Value clear() override
{ {
out("\033[3J\033[H\033[2J"); out("\033[3J\033[H\033[2J");
fflush(stdout); fflush(stdout);
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value trace() override virtual JS::Value trace() override
{ {
outln("{}", vm().join_arguments()); outln("{}", vm().join_arguments());
@ -687,6 +693,7 @@ public:
} }
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value count() override virtual JS::Value count() override
{ {
auto label = vm().argument_count() ? vm().argument(0).to_string_without_side_effects() : "default"; auto label = vm().argument_count() ? vm().argument(0).to_string_without_side_effects() : "default";
@ -694,6 +701,7 @@ public:
outln("{}: {}", label, counter_value); outln("{}: {}", label, counter_value);
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value count_reset() override virtual JS::Value count_reset() override
{ {
auto label = vm().argument_count() ? vm().argument(0).to_string_without_side_effects() : "default"; auto label = vm().argument_count() ? vm().argument(0).to_string_without_side_effects() : "default";
@ -703,6 +711,20 @@ public:
outln("\033[33;1m\"{}\" doesn't have a count\033[0m", label); outln("\033[33;1m\"{}\" doesn't have a count\033[0m", label);
return JS::js_undefined(); return JS::js_undefined();
} }
virtual JS::Value assert_() override
{
auto& vm = this->vm();
if (!vm.argument(0).to_boolean()) {
if (vm.argument_count() > 1) {
out("\033[31;1mAssertion failed:\033[0m");
outln(" {}", vm.join_arguments(1));
} else {
outln("\033[31;1mAssertion failed\033[0m");
}
}
return JS::js_undefined();
}
}; };
int main(int argc, char** argv) int main(int argc, char** argv)