Serenity Operating System
1/*
2 * Copyright (c) 2022, Ben Abraham <ben.d.abraham@gmail.com>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibJS/Heap/MarkedVector.h>
8#include <LibJS/Runtime/Completion.h>
9#include <LibJS/Runtime/Realm.h>
10#include <LibJS/Runtime/ThrowableStringBuilder.h>
11#include <LibJS/Runtime/VM.h>
12#include <LibWeb/HTML/WorkerDebugConsoleClient.h>
13
14namespace Web::HTML {
15
16WorkerDebugConsoleClient::WorkerDebugConsoleClient(JS::Console& console)
17 : ConsoleClient(console)
18{
19}
20
21void WorkerDebugConsoleClient::clear()
22{
23 dbgln("\033[3J\033[H\033[2J");
24 m_group_stack_depth = 0;
25 fflush(stdout);
26}
27
28void WorkerDebugConsoleClient::end_group()
29{
30 if (m_group_stack_depth > 0)
31 m_group_stack_depth--;
32}
33
34// 2.3. Printer(logLevel, args[, options]), https://console.spec.whatwg.org/#printer
35JS::ThrowCompletionOr<JS::Value> WorkerDebugConsoleClient::printer(JS::Console::LogLevel log_level, PrinterArguments arguments)
36{
37 auto& vm = m_console.realm().vm();
38
39 auto indent = TRY_OR_THROW_OOM(vm, String::repeated(' ', m_group_stack_depth * 2));
40
41 if (log_level == JS::Console::LogLevel::Trace) {
42 auto trace = arguments.get<JS::Console::Trace>();
43 JS::ThrowableStringBuilder builder(vm);
44 if (!trace.label.is_empty())
45 MUST_OR_THROW_OOM(builder.appendff("{}\033[36;1m{}\033[0m\n", indent, trace.label));
46
47 for (auto& function_name : trace.stack)
48 MUST_OR_THROW_OOM(builder.appendff("{}-> {}\n", indent, function_name));
49
50 dbgln("{}", builder.string_view());
51 return JS::js_undefined();
52 }
53
54 if (log_level == JS::Console::LogLevel::Group || log_level == JS::Console::LogLevel::GroupCollapsed) {
55 auto group = arguments.get<JS::Console::Group>();
56 dbgln("{}\033[36;1m{}\033[0m", indent, group.label);
57 m_group_stack_depth++;
58 return JS::js_undefined();
59 }
60
61 auto output = TRY(generically_format_values(arguments.get<JS::MarkedVector<JS::Value>>()));
62 m_console.output_debug_message(log_level, output);
63
64 switch (log_level) {
65 case JS::Console::LogLevel::Debug:
66 dbgln("{}\033[36;1m{}\033[0m", indent, output);
67 break;
68 case JS::Console::LogLevel::Error:
69 case JS::Console::LogLevel::Assert:
70 dbgln("{}\033[31;1m{}\033[0m", indent, output);
71 break;
72 case JS::Console::LogLevel::Info:
73 dbgln("{}(i) {}", indent, output);
74 break;
75 case JS::Console::LogLevel::Log:
76 dbgln("{}{}", indent, output);
77 break;
78 case JS::Console::LogLevel::Warn:
79 case JS::Console::LogLevel::CountReset:
80 dbgln("{}\033[33;1m{}\033[0m", indent, output);
81 break;
82 default:
83 dbgln("{}{}", indent, output);
84 break;
85 }
86 return JS::js_undefined();
87}
88
89} // namespace Web::HTML