WorkerDebugConsoleClient.cpp 2.5 KB

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