mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:02:45 +00:00 
			
		
		
		
	 57dc179b1f
			
		
	
	
		57dc179b1f
		
	
	
	
	
		
			
			This will make it easier to support both string types at the same time while we convert code, and tracking down remaining uses. One big exception is Value::to_string() in LibJS, where the name is dictated by the ToString AO.
		
			
				
	
	
		
			124 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com>
 | |
|  * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Function.h>
 | |
| #include <AK/HashMap.h>
 | |
| #include <AK/Noncopyable.h>
 | |
| #include <AK/Vector.h>
 | |
| #include <LibCore/ElapsedTimer.h>
 | |
| #include <LibJS/Forward.h>
 | |
| #include <LibJS/Runtime/Value.h>
 | |
| 
 | |
| namespace JS {
 | |
| 
 | |
| class ConsoleClient;
 | |
| 
 | |
| // https://console.spec.whatwg.org
 | |
| class Console {
 | |
|     AK_MAKE_NONCOPYABLE(Console);
 | |
|     AK_MAKE_NONMOVABLE(Console);
 | |
| 
 | |
| public:
 | |
|     // These are not really levels, but that's the term used in the spec.
 | |
|     enum class LogLevel {
 | |
|         Assert,
 | |
|         Count,
 | |
|         CountReset,
 | |
|         Debug,
 | |
|         Dir,
 | |
|         DirXML,
 | |
|         Error,
 | |
|         Group,
 | |
|         GroupCollapsed,
 | |
|         Info,
 | |
|         Log,
 | |
|         TimeEnd,
 | |
|         TimeLog,
 | |
|         Trace,
 | |
|         Warn,
 | |
|     };
 | |
| 
 | |
|     struct Group {
 | |
|         DeprecatedString label;
 | |
|     };
 | |
| 
 | |
|     struct Trace {
 | |
|         DeprecatedString label;
 | |
|         Vector<DeprecatedString> stack;
 | |
|     };
 | |
| 
 | |
|     explicit Console(Realm&);
 | |
| 
 | |
|     void set_client(ConsoleClient& client) { m_client = &client; }
 | |
| 
 | |
|     Realm& realm() const { return m_realm; }
 | |
| 
 | |
|     MarkedVector<Value> vm_arguments();
 | |
| 
 | |
|     HashMap<DeprecatedString, unsigned>& counters() { return m_counters; }
 | |
|     HashMap<DeprecatedString, unsigned> const& counters() const { return m_counters; }
 | |
| 
 | |
|     ThrowCompletionOr<Value> debug();
 | |
|     ThrowCompletionOr<Value> error();
 | |
|     ThrowCompletionOr<Value> info();
 | |
|     ThrowCompletionOr<Value> log();
 | |
|     ThrowCompletionOr<Value> warn();
 | |
|     Value clear();
 | |
|     ThrowCompletionOr<Value> trace();
 | |
|     ThrowCompletionOr<Value> count();
 | |
|     ThrowCompletionOr<Value> count_reset();
 | |
|     ThrowCompletionOr<Value> assert_();
 | |
|     ThrowCompletionOr<Value> group();
 | |
|     ThrowCompletionOr<Value> group_collapsed();
 | |
|     ThrowCompletionOr<Value> group_end();
 | |
|     ThrowCompletionOr<Value> time();
 | |
|     ThrowCompletionOr<Value> time_log();
 | |
|     ThrowCompletionOr<Value> time_end();
 | |
| 
 | |
|     void output_debug_message(LogLevel log_level, DeprecatedString const& output) const;
 | |
|     void report_exception(JS::Error const&, bool) const;
 | |
| 
 | |
| private:
 | |
|     ThrowCompletionOr<DeprecatedString> value_vector_to_deprecated_string(MarkedVector<Value> const&);
 | |
|     ThrowCompletionOr<DeprecatedString> format_time_since(Core::ElapsedTimer timer);
 | |
| 
 | |
|     Realm& m_realm;
 | |
|     ConsoleClient* m_client { nullptr };
 | |
| 
 | |
|     HashMap<DeprecatedString, unsigned> m_counters;
 | |
|     HashMap<DeprecatedString, Core::ElapsedTimer> m_timer_table;
 | |
|     Vector<Group> m_group_stack;
 | |
| };
 | |
| 
 | |
| class ConsoleClient {
 | |
| public:
 | |
|     explicit ConsoleClient(Console& console)
 | |
|         : m_console(console)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     using PrinterArguments = Variant<Console::Group, Console::Trace, MarkedVector<Value>>;
 | |
| 
 | |
|     ThrowCompletionOr<Value> logger(Console::LogLevel log_level, MarkedVector<Value> const& args);
 | |
|     ThrowCompletionOr<MarkedVector<Value>> formatter(MarkedVector<Value> const& args);
 | |
|     virtual ThrowCompletionOr<Value> printer(Console::LogLevel log_level, PrinterArguments) = 0;
 | |
| 
 | |
|     virtual void add_css_style_to_current_message(StringView) { }
 | |
|     virtual void report_exception(JS::Error const&, bool) { }
 | |
| 
 | |
|     virtual void clear() = 0;
 | |
|     virtual void end_group() = 0;
 | |
| 
 | |
| protected:
 | |
|     virtual ~ConsoleClient() = default;
 | |
| 
 | |
|     Console& m_console;
 | |
| };
 | |
| 
 | |
| }
 |