WorkerDebugConsoleClient.cpp 2.6 KB

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