diff --git a/Userland/Services/WebContent/ConsoleGlobalObject.cpp b/Userland/Services/WebContent/ConsoleGlobalObject.cpp index 2e16ea6aa9..1651005282 100644 --- a/Userland/Services/WebContent/ConsoleGlobalObject.cpp +++ b/Userland/Services/WebContent/ConsoleGlobalObject.cpp @@ -5,6 +5,8 @@ */ #include "ConsoleGlobalObject.h" +#include +#include #include #include #include @@ -20,6 +22,14 @@ ConsoleGlobalObject::~ConsoleGlobalObject() { } +void ConsoleGlobalObject::initialize_global_object() +{ + Base::initialize_global_object(); + + // $0 magic variable + define_native_accessor("$0", inspected_node_getter, nullptr, 0); +} + void ConsoleGlobalObject::visit_edges(Visitor& visitor) { Base::visit_edges(visitor); @@ -87,4 +97,24 @@ JS::MarkedValueList ConsoleGlobalObject::internal_own_property_keys() const return m_window_object->internal_own_property_keys(); } +JS_DEFINE_NATIVE_GETTER(ConsoleGlobalObject::inspected_node_getter) +{ + auto* this_object = vm.this_value(global_object).to_object(global_object); + if (!this_object) + return JS::js_null(); + + if (!is(this_object)) { + vm.throw_exception(global_object, JS::ErrorType::NotA, "ConsoleGlobalObject"); + return {}; + } + + auto console_global_object = static_cast(this_object); + auto& window = console_global_object->m_window_object->impl(); + auto* inspected_node = window.document().inspected_node(); + if (!inspected_node) + return JS::js_undefined(); + + return Web::Bindings::wrap(global_object, *inspected_node); +} + } diff --git a/Userland/Services/WebContent/ConsoleGlobalObject.h b/Userland/Services/WebContent/ConsoleGlobalObject.h index 03ec211f84..3ef87afbf7 100644 --- a/Userland/Services/WebContent/ConsoleGlobalObject.h +++ b/Userland/Services/WebContent/ConsoleGlobalObject.h @@ -34,9 +34,14 @@ public: virtual bool internal_delete(JS::PropertyName const& name) override; virtual JS::MarkedValueList internal_own_property_keys() const override; + virtual void initialize_global_object() override; + private: virtual void visit_edges(Visitor&) override; + // Because $0 is not a nice C++ function name + JS_DECLARE_NATIVE_GETTER(inspected_node_getter); + Web::Bindings::WindowObject* m_window_object; };