Serenity Operating System
at master 89 lines 2.8 kB view raw
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