LibJS: Begin implementing console.dir

The intent of the spec is that the output of console.dir is interactable
within the console. Our Printer implementation currently just prints the
provided object as a string, and doesn't check the provided `options`
argument. But having console.dir defined prevents exceptions from being
thrown on real websites.
This commit is contained in:
Timothy Flynn 2023-06-21 21:29:24 -04:00 committed by Andreas Kling
parent 9f8e5f0b1c
commit 396655d145
5 changed files with 31 additions and 0 deletions

View file

@ -168,6 +168,26 @@ ThrowCompletionOr<Value> Console::warn()
return js_undefined();
}
// 1.1.10. dir(item, options), https://console.spec.whatwg.org/#dir
ThrowCompletionOr<Value> Console::dir()
{
auto& vm = realm().vm();
// 1. Let object be item with generic JavaScript object formatting applied.
// NOTE: Generic formatting is performed by ConsoleClient::printer().
auto object = vm.argument(0);
// 2. Perform Printer("dir", « object », options).
if (m_client) {
MarkedVector<Value> printer_arguments { vm.heap() };
TRY_OR_THROW_OOM(vm, printer_arguments.try_append(object));
return m_client->printer(LogLevel::Dir, move(printer_arguments));
}
return js_undefined();
}
static ThrowCompletionOr<String> label_or_fallback(VM& vm, StringView fallback)
{
return vm.argument_count() > 0

View file

@ -73,6 +73,7 @@ public:
ThrowCompletionOr<Value> log();
ThrowCompletionOr<Value> trace();
ThrowCompletionOr<Value> warn();
ThrowCompletionOr<Value> dir();
ThrowCompletionOr<Value> count();
ThrowCompletionOr<Value> count_reset();
ThrowCompletionOr<Value> group();

View file

@ -151,6 +151,7 @@ namespace JS {
P(deref) \
P(description) \
P(difference) \
P(dir) \
P(direction) \
P(disambiguation) \
P(disposed) \

View file

@ -31,6 +31,7 @@ ThrowCompletionOr<void> ConsoleObject::initialize(Realm& realm)
define_native_function(realm, vm.names.log, log, 0, attr);
define_native_function(realm, vm.names.trace, trace, 0, attr);
define_native_function(realm, vm.names.warn, warn, 0, attr);
define_native_function(realm, vm.names.dir, dir, 0, attr);
define_native_function(realm, vm.names.count, count, 0, attr);
define_native_function(realm, vm.names.countReset, count_reset, 0, attr);
define_native_function(realm, vm.names.group, group, 0, attr);
@ -99,6 +100,13 @@ JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::warn)
return console_object.console().warn();
}
// 1.1.10. dir(item, options), https://console.spec.whatwg.org/#warn
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::dir)
{
auto& console_object = *vm.current_realm()->intrinsics().console_object();
return console_object.console().dir();
}
// 1.2.1. count(label), https://console.spec.whatwg.org/#count
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::count)
{

View file

@ -30,6 +30,7 @@ private:
JS_DECLARE_NATIVE_FUNCTION(log);
JS_DECLARE_NATIVE_FUNCTION(trace);
JS_DECLARE_NATIVE_FUNCTION(warn);
JS_DECLARE_NATIVE_FUNCTION(dir);
JS_DECLARE_NATIVE_FUNCTION(count);
JS_DECLARE_NATIVE_FUNCTION(count_reset);
JS_DECLARE_NATIVE_FUNCTION(group);