From 30440134cbab4851413ea1f0649e5272b50ea48b Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 29 Mar 2020 00:37:33 +0100 Subject: [PATCH] LibJS+LibWeb: Move native properties to separate getters/setters This was a bit cumbersome now, but it gets us closer to a format suited for code generation. --- Libraries/LibJS/Runtime/Array.cpp | 26 +++++++---- Libraries/LibJS/Runtime/Array.h | 3 ++ Libraries/LibJS/Runtime/ErrorPrototype.cpp | 37 +++++++++------- Libraries/LibJS/Runtime/ErrorPrototype.h | 3 ++ Libraries/LibJS/Runtime/NativeProperty.cpp | 10 ++--- Libraries/LibJS/Runtime/NativeProperty.h | 10 ++--- Libraries/LibJS/Runtime/Object.cpp | 28 +++++++++--- Libraries/LibJS/Runtime/Object.h | 2 +- Libraries/LibJS/Runtime/StringPrototype.cpp | 19 +++++--- Libraries/LibJS/Runtime/StringPrototype.h | 2 + .../CanvasRenderingContext2DWrapper.cpp | 38 ++++++++++------ .../CanvasRenderingContext2DWrapper.h | 2 + Libraries/LibWeb/Bindings/ElementWrapper.cpp | 32 ++++++++++---- Libraries/LibWeb/Bindings/ElementWrapper.h | 3 ++ .../Bindings/HTMLCanvasElementWrapper.cpp | 43 ++++++++++++------- .../Bindings/HTMLCanvasElementWrapper.h | 3 ++ .../LibWeb/Bindings/MouseEventWrapper.cpp | 40 +++++++++++------ Libraries/LibWeb/Bindings/MouseEventWrapper.h | 3 ++ Libraries/LibWeb/DOM/Document.cpp | 2 +- 19 files changed, 210 insertions(+), 96 deletions(-) diff --git a/Libraries/LibJS/Runtime/Array.cpp b/Libraries/LibJS/Runtime/Array.cpp index 6d3149f423..019697fe74 100644 --- a/Libraries/LibJS/Runtime/Array.cpp +++ b/Libraries/LibJS/Runtime/Array.cpp @@ -27,20 +27,14 @@ #include #include #include +#include namespace JS { Array::Array() { set_prototype(interpreter().array_prototype()); - put_native_property( - "length", - [this](Object*) { - return Value(length()); - }, - [](Object*, Value) { - ASSERT_NOT_REACHED(); - }); + put_native_property("length", length_getter, length_setter); } Array::~Array() @@ -96,4 +90,20 @@ bool Array::put_own_property(Object& this_object, const FlyString& property_name } return Object::put_own_property(this_object, property_name, value); } + +Value Array::length_getter(Interpreter& interpreter) +{ + auto* this_object = interpreter.this_value().to_object(interpreter.heap()); + if (!this_object) + return {}; + if (!this_object->is_array()) + return interpreter.throw_exception("TypeError", "Not an array"); + return Value(static_cast(this_object)->length()); +} + +void Array::length_setter(Interpreter&, Value) +{ + ASSERT_NOT_REACHED(); +} + } diff --git a/Libraries/LibJS/Runtime/Array.h b/Libraries/LibJS/Runtime/Array.h index e43e845526..61c45644a0 100644 --- a/Libraries/LibJS/Runtime/Array.h +++ b/Libraries/LibJS/Runtime/Array.h @@ -50,6 +50,9 @@ private: virtual Optional get_own_property(const Object& this_object, const FlyString& property_name) const override; virtual bool put_own_property(Object& this_object, const FlyString& property_name, Value) override; + static Value length_getter(Interpreter&); + static void length_setter(Interpreter&, Value); + Vector m_elements; }; diff --git a/Libraries/LibJS/Runtime/ErrorPrototype.cpp b/Libraries/LibJS/Runtime/ErrorPrototype.cpp index 165dd2d9e7..a15707c0da 100644 --- a/Libraries/LibJS/Runtime/ErrorPrototype.cpp +++ b/Libraries/LibJS/Runtime/ErrorPrototype.cpp @@ -36,25 +36,32 @@ namespace JS { ErrorPrototype::ErrorPrototype() { - put_native_property( - "name", [](Object* this_object) { - ASSERT(this_object); - ASSERT(this_object->is_error()); - return js_string(this_object->heap(), static_cast(this_object)->name()); - }, - nullptr); - - put_native_property( - "message", [](Object* this_object) { - ASSERT(this_object); - ASSERT(this_object->is_error()); - return js_string(this_object->heap(), static_cast(this_object)->message()); - }, - nullptr); + put_native_property("name", name_getter, nullptr); + put_native_property("message", message_getter, nullptr); } ErrorPrototype::~ErrorPrototype() { } +Value ErrorPrototype::name_getter(Interpreter& interpreter) +{ + auto* this_object = interpreter.this_value().to_object(interpreter.heap()); + if (!this_object) + return {}; + if (!this_object->is_error()) + return interpreter.throw_exception("TypeError", "Not an Error object"); + return js_string(interpreter.heap(), static_cast(this_object)->name()); +} + +Value ErrorPrototype::message_getter(Interpreter& interpreter) +{ + auto* this_object = interpreter.this_value().to_object(interpreter.heap()); + if (!this_object) + return {}; + if (!this_object->is_error()) + return interpreter.throw_exception("TypeError", "Not an Error object"); + return js_string(interpreter.heap(), static_cast(this_object)->message()); +} + } diff --git a/Libraries/LibJS/Runtime/ErrorPrototype.h b/Libraries/LibJS/Runtime/ErrorPrototype.h index 8775b6aa51..dd334f1cc4 100644 --- a/Libraries/LibJS/Runtime/ErrorPrototype.h +++ b/Libraries/LibJS/Runtime/ErrorPrototype.h @@ -37,6 +37,9 @@ public: private: virtual const char* class_name() const override { return "ErrorPrototype"; } + + static Value name_getter(Interpreter&); + static Value message_getter(Interpreter&); }; } diff --git a/Libraries/LibJS/Runtime/NativeProperty.cpp b/Libraries/LibJS/Runtime/NativeProperty.cpp index 58ea73b9b3..c19a1f1d9d 100644 --- a/Libraries/LibJS/Runtime/NativeProperty.cpp +++ b/Libraries/LibJS/Runtime/NativeProperty.cpp @@ -29,7 +29,7 @@ namespace JS { -NativeProperty::NativeProperty(AK::Function getter, AK::Function setter) +NativeProperty::NativeProperty(AK::Function getter, AK::Function setter) : m_getter(move(getter)) , m_setter(move(setter)) { @@ -39,18 +39,18 @@ NativeProperty::~NativeProperty() { } -Value NativeProperty::get(Object* object) const +Value NativeProperty::get(Interpreter& interpreter) const { if (!m_getter) return js_undefined(); - return m_getter(object); + return m_getter(interpreter); } -void NativeProperty::set(Object* object, Value value) +void NativeProperty::set(Interpreter& interpreter, Value value) { if (!m_setter) return; - m_setter(object, move(value)); + m_setter(interpreter, move(value)); } } diff --git a/Libraries/LibJS/Runtime/NativeProperty.h b/Libraries/LibJS/Runtime/NativeProperty.h index 0044ac5a0f..0c9619e2bd 100644 --- a/Libraries/LibJS/Runtime/NativeProperty.h +++ b/Libraries/LibJS/Runtime/NativeProperty.h @@ -33,18 +33,18 @@ namespace JS { class NativeProperty final : public Object { public: - NativeProperty(AK::Function getter, AK::Function setter); + NativeProperty(AK::Function getter, AK::Function setter); virtual ~NativeProperty() override; - Value get(Object*) const; - void set(Object*, Value); + Value get(Interpreter&) const; + void set(Interpreter&, Value); private: virtual bool is_native_property() const override { return true; } virtual const char* class_name() const override { return "NativeProperty"; } - AK::Function m_getter; - AK::Function m_setter; + AK::Function m_getter; + AK::Function m_setter; }; } diff --git a/Libraries/LibJS/Runtime/Object.cpp b/Libraries/LibJS/Runtime/Object.cpp index da75c7f7c4..d398a7093b 100644 --- a/Libraries/LibJS/Runtime/Object.cpp +++ b/Libraries/LibJS/Runtime/Object.cpp @@ -56,8 +56,15 @@ bool Object::has_prototype(const Object* prototype) const Optional Object::get_own_property(const Object& this_object, const FlyString& property_name) const { auto value_here = m_properties.get(property_name); - if (value_here.has_value() && value_here.value().is_object() && value_here.value().as_object()->is_native_property()) - return static_cast(value_here.value().as_object())->get(&const_cast(this_object)); + if (value_here.has_value() && value_here.value().is_object() && value_here.value().as_object()->is_native_property()) { + auto& native_property = static_cast(*value_here.value().as_object()); + auto& interpreter = const_cast(this)->interpreter(); + auto& call_frame = interpreter.push_call_frame(); + call_frame.this_value = const_cast(&this_object); + auto result = native_property.get(interpreter); + interpreter.pop_call_frame(); + return result; + } return value_here; } @@ -65,7 +72,13 @@ bool Object::put_own_property(Object& this_object, const FlyString& property_nam { auto value_here = m_properties.get(property_name); if (value_here.has_value() && value_here.value().is_object() && value_here.value().as_object()->is_native_property()) { - static_cast(value_here.value().as_object())->set(&this_object, value); + auto& native_property = static_cast(*value_here.value().as_object()); + auto& interpreter = const_cast(this)->interpreter(); + auto& call_frame = interpreter.push_call_frame(); + call_frame.this_value = &this_object; + dbg() << "put_own_property: " << &this_object << " . " << property_name << " = " << value; + native_property.set(interpreter, value); + interpreter.pop_call_frame(); } else { m_properties.set(property_name, value); } @@ -91,7 +104,12 @@ void Object::put(const FlyString& property_name, Value value) auto value_here = object->m_properties.get(property_name); if (value_here.has_value()) { if (value_here.value().is_object() && value_here.value().as_object()->is_native_property()) { - static_cast(value_here.value().as_object())->set(const_cast(this), value); + auto& native_property = static_cast(*value_here.value().as_object()); + auto& interpreter = const_cast(this)->interpreter(); + auto& call_frame = interpreter.push_call_frame(); + call_frame.this_value = this; + native_property.set(interpreter, value); + interpreter.pop_call_frame(); return; } if (object->put_own_property(*this, property_name, value)) @@ -107,7 +125,7 @@ void Object::put_native_function(const FlyString& property_name, AK::Function(move(native_function))); } -void Object::put_native_property(const FlyString& property_name, AK::Function getter, AK::Function setter) +void Object::put_native_property(const FlyString& property_name, AK::Function getter, AK::Function setter) { put(property_name, heap().allocate(move(getter), move(setter))); } diff --git a/Libraries/LibJS/Runtime/Object.h b/Libraries/LibJS/Runtime/Object.h index 3ac6202662..537037dfa8 100644 --- a/Libraries/LibJS/Runtime/Object.h +++ b/Libraries/LibJS/Runtime/Object.h @@ -47,7 +47,7 @@ public: virtual bool put_own_property(Object& this_object, const FlyString& property_name, Value); void put_native_function(const FlyString& property_name, AK::Function); - void put_native_property(const FlyString& property_name, AK::Function getter, AK::Function setter); + void put_native_property(const FlyString& property_name, AK::Function getter, AK::Function setter); virtual bool is_error() const { return false; } virtual bool is_array() const { return false; } diff --git a/Libraries/LibJS/Runtime/StringPrototype.cpp b/Libraries/LibJS/Runtime/StringPrototype.cpp index ffdaddd4de..5d05545d05 100644 --- a/Libraries/LibJS/Runtime/StringPrototype.cpp +++ b/Libraries/LibJS/Runtime/StringPrototype.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -37,13 +38,7 @@ namespace JS { StringPrototype::StringPrototype() { - put_native_property( - "length", [](Object* this_object) { - ASSERT(this_object); - ASSERT(this_object->is_string_object()); - return Value((i32) static_cast(this_object)->primitive_string()->string().length()); - }, - nullptr); + put_native_property("length", length_getter, nullptr); put_native_function("charAt", char_at); put_native_function("repeat", repeat); } @@ -88,4 +83,14 @@ Value StringPrototype::repeat(Interpreter& interpreter) return js_string(interpreter.heap(), builder.to_string()); } +Value StringPrototype::length_getter(Interpreter& interpreter) +{ + auto* this_object = interpreter.this_value().to_object(interpreter.heap()); + if (!this_object) + return {}; + if (!this_object->is_string_object()) + return interpreter.throw_exception("TypeError", "Not a String object"); + return Value((i32) static_cast(this_object)->primitive_string()->string().length()); +} + } diff --git a/Libraries/LibJS/Runtime/StringPrototype.h b/Libraries/LibJS/Runtime/StringPrototype.h index 74beb46bdd..b12c674584 100644 --- a/Libraries/LibJS/Runtime/StringPrototype.h +++ b/Libraries/LibJS/Runtime/StringPrototype.h @@ -40,6 +40,8 @@ private: static Value char_at(Interpreter&); static Value repeat(Interpreter&); + + static Value length_getter(Interpreter&); }; } diff --git a/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.cpp b/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.cpp index 4e620d646b..5c095ccaa7 100644 --- a/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.cpp +++ b/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.cpp @@ -43,14 +43,7 @@ CanvasRenderingContext2DWrapper* wrap(JS::Heap& heap, CanvasRenderingContext2D& CanvasRenderingContext2DWrapper::CanvasRenderingContext2DWrapper(CanvasRenderingContext2D& impl) : m_impl(impl) { - put_native_property( - "fillStyle", - [this](JS::Object*) { - return JS::js_string(heap(), m_impl->fill_style()); - }, - [this](JS::Object*, JS::Value value) { - m_impl->set_fill_style(value.to_string()); - }); + put_native_property("fillStyle", fill_style_getter, fill_style_setter); put_native_function("fillRect", fill_rect); } @@ -58,18 +51,39 @@ CanvasRenderingContext2DWrapper::~CanvasRenderingContext2DWrapper() { } -JS::Value CanvasRenderingContext2DWrapper::fill_rect(JS::Interpreter& interpreter) +static CanvasRenderingContext2D* impl_from(JS::Interpreter& interpreter) { auto* this_object = interpreter.this_value().to_object(interpreter.heap()); if (!this_object) - return {}; + return nullptr; // FIXME: Verify that it's a CanvasRenderingContext2DWrapper somehow! - auto& impl = static_cast(this_object)->impl(); + return &static_cast(this_object)->impl(); +} + +JS::Value CanvasRenderingContext2DWrapper::fill_rect(JS::Interpreter& interpreter) +{ + auto* impl = impl_from(interpreter); + if (!impl) + return {}; auto& arguments = interpreter.call_frame().arguments; if (arguments.size() >= 4) - impl.fill_rect(arguments[0].to_i32(), arguments[1].to_i32(), arguments[2].to_i32(), arguments[3].to_i32()); + impl->fill_rect(arguments[0].to_i32(), arguments[1].to_i32(), arguments[2].to_i32(), arguments[3].to_i32()); return JS::js_undefined(); } +JS::Value CanvasRenderingContext2DWrapper::fill_style_getter(JS::Interpreter& interpreter) +{ + auto* impl = impl_from(interpreter); + if (!impl) + return {}; + return JS::js_string(interpreter.heap(), impl->fill_style()); +} + +void CanvasRenderingContext2DWrapper::fill_style_setter(JS::Interpreter& interpreter, JS::Value value) +{ + if (auto* impl = impl_from(interpreter)) + impl->set_fill_style(value.to_string()); +} + } } diff --git a/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h b/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h index a2e6c50fa1..8e8f1ad1a0 100644 --- a/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h +++ b/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h @@ -43,6 +43,8 @@ private: virtual const char* class_name() const override { return "CanvasRenderingContext2DWrapper"; } static JS::Value fill_rect(JS::Interpreter&); + static JS::Value fill_style_getter(JS::Interpreter&); + static void fill_style_setter(JS::Interpreter&, JS::Value); NonnullRefPtr m_impl; }; diff --git a/Libraries/LibWeb/Bindings/ElementWrapper.cpp b/Libraries/LibWeb/Bindings/ElementWrapper.cpp index d392853973..0639bc62bd 100644 --- a/Libraries/LibWeb/Bindings/ElementWrapper.cpp +++ b/Libraries/LibWeb/Bindings/ElementWrapper.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -37,14 +38,7 @@ namespace Bindings { ElementWrapper::ElementWrapper(Element& element) : NodeWrapper(element) { - put_native_property( - "innerHTML", - [this](JS::Object*) { - return JS::js_string(heap(), node().inner_html()); - }, - [this](JS::Object*, JS::Value value) { - node().set_inner_html(value.to_string()); - }); + put_native_property("innerHTML", inner_html_getter, inner_html_setter); } ElementWrapper::~ElementWrapper() @@ -61,5 +55,27 @@ const Element& ElementWrapper::node() const return static_cast(NodeWrapper::node()); } +static Element* impl_from(JS::Interpreter& interpreter) +{ + auto* this_object = interpreter.this_value().to_object(interpreter.heap()); + if (!this_object) + return nullptr; + // FIXME: Verify that it's an ElementWrapper somehow! + return &static_cast(this_object)->node(); +} + +JS::Value ElementWrapper::inner_html_getter(JS::Interpreter& interpreter) +{ + if (auto* impl = impl_from(interpreter)) + return JS::js_string(interpreter.heap(), impl->inner_html()); + return {}; +} + +void ElementWrapper::inner_html_setter(JS::Interpreter& interpreter, JS::Value value) +{ + if (auto* impl = impl_from(interpreter)) + impl->set_inner_html(value.to_string()); +} + } } diff --git a/Libraries/LibWeb/Bindings/ElementWrapper.h b/Libraries/LibWeb/Bindings/ElementWrapper.h index d91c94ccf0..921db73215 100644 --- a/Libraries/LibWeb/Bindings/ElementWrapper.h +++ b/Libraries/LibWeb/Bindings/ElementWrapper.h @@ -41,6 +41,9 @@ public: private: virtual const char* class_name() const override { return "ElementWrapper"; } + + static JS::Value inner_html_getter(JS::Interpreter&); + static void inner_html_setter(JS::Interpreter&, JS::Value); }; } diff --git a/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.cpp b/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.cpp index 0e50bd1bf4..b80c15d4d6 100644 --- a/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.cpp +++ b/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.cpp @@ -42,18 +42,8 @@ HTMLCanvasElementWrapper::HTMLCanvasElementWrapper(HTMLCanvasElement& element) { put_native_function("getContext", get_context); - put_native_property( - "width", - [this](JS::Object*) { - return JS::Value(node().preferred_width()); - }, - nullptr); - put_native_property( - "height", - [this](JS::Object*) { - return JS::Value(node().preferred_height()); - }, - nullptr); + put_native_property("width", width_getter, nullptr); + put_native_property("height", height_getter, nullptr); } HTMLCanvasElementWrapper::~HTMLCanvasElementWrapper() @@ -70,20 +60,41 @@ const HTMLCanvasElement& HTMLCanvasElementWrapper::node() const return static_cast(NodeWrapper::node()); } -JS::Value HTMLCanvasElementWrapper::get_context(JS::Interpreter& interpreter) +static HTMLCanvasElement* impl_from(JS::Interpreter& interpreter) { auto* this_object = interpreter.this_value().to_object(interpreter.heap()); if (!this_object) + return nullptr; + // FIXME: Verify that it's a HTMLCanvasElementWrapper somehow! + return &static_cast(this_object)->node(); +} + +JS::Value HTMLCanvasElementWrapper::get_context(JS::Interpreter& interpreter) +{ + auto* impl = impl_from(interpreter); + if (!impl) return {}; - // FIXME: Verify that it's an HTMLCanvasElementWrapper somehow! - auto& node = static_cast(this_object)->node(); auto& arguments = interpreter.call_frame().arguments; if (arguments.size() >= 1) { - auto* context = node.get_context(arguments[0].to_string()); + auto* context = impl->get_context(arguments[0].to_string()); return wrap(interpreter.heap(), *context); } return JS::js_undefined(); } +JS::Value HTMLCanvasElementWrapper::width_getter(JS::Interpreter& interpreter) +{ + if (auto* impl = impl_from(interpreter)) + return JS::Value(impl->preferred_width()); + return {}; +} + +JS::Value HTMLCanvasElementWrapper::height_getter(JS::Interpreter& interpreter) +{ + if (auto* impl = impl_from(interpreter)) + return JS::Value(impl->preferred_height()); + return {}; +} + } } diff --git a/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.h b/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.h index fb27d0c6b1..4f5ae3fc79 100644 --- a/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.h +++ b/Libraries/LibWeb/Bindings/HTMLCanvasElementWrapper.h @@ -43,6 +43,9 @@ private: virtual const char* class_name() const override { return "HTMLCanvasElementWrapper"; } static JS::Value get_context(JS::Interpreter&); + + static JS::Value width_getter(JS::Interpreter&); + static JS::Value height_getter(JS::Interpreter&); }; } diff --git a/Libraries/LibWeb/Bindings/MouseEventWrapper.cpp b/Libraries/LibWeb/Bindings/MouseEventWrapper.cpp index f002d50732..51949df663 100644 --- a/Libraries/LibWeb/Bindings/MouseEventWrapper.cpp +++ b/Libraries/LibWeb/Bindings/MouseEventWrapper.cpp @@ -24,8 +24,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include #include +#include +#include #include #include #include @@ -36,18 +37,8 @@ namespace Bindings { MouseEventWrapper::MouseEventWrapper(MouseEvent& event) : EventWrapper(event) { - put_native_property( - "offsetX", - [this](JS::Object*) { - return JS::Value(this->event().offset_x()); - }, - nullptr); - put_native_property( - "offsetY", - [this](JS::Object*) { - return JS::Value(this->event().offset_y()); - }, - nullptr); + put_native_property("offsetX", offset_x_getter, nullptr); + put_native_property("offsetY", offset_y_getter, nullptr); } MouseEventWrapper::~MouseEventWrapper() @@ -64,5 +55,28 @@ MouseEvent& MouseEventWrapper::event() return static_cast(EventWrapper::event()); } +static MouseEvent* impl_from(JS::Interpreter& interpreter) +{ + auto* this_object = interpreter.this_value().to_object(interpreter.heap()); + if (!this_object) + return nullptr; + // FIXME: Verify that it's a CanvasRenderingContext2DWrapper somehow! + return &static_cast(this_object)->event(); +} + +JS::Value MouseEventWrapper::offset_x_getter(JS::Interpreter& interpreter) +{ + if (auto* impl = impl_from(interpreter)) + return JS::Value(impl->offset_x()); + return {}; +} + +JS::Value MouseEventWrapper::offset_y_getter(JS::Interpreter& interpreter) +{ + if (auto* impl = impl_from(interpreter)) + return JS::Value(impl->offset_y()); + return {}; +} + } } diff --git a/Libraries/LibWeb/Bindings/MouseEventWrapper.h b/Libraries/LibWeb/Bindings/MouseEventWrapper.h index e5f0a1e693..606e4017df 100644 --- a/Libraries/LibWeb/Bindings/MouseEventWrapper.h +++ b/Libraries/LibWeb/Bindings/MouseEventWrapper.h @@ -41,6 +41,9 @@ public: private: virtual const char* class_name() const override { return "MouseEventWrapper"; } + + static JS::Value offset_x_getter(JS::Interpreter&); + static JS::Value offset_y_getter(JS::Interpreter&); }; } diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 254eb676d4..26bcc9f127 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -392,7 +392,7 @@ JS::Interpreter& Document::interpreter() m_interpreter->global_object().put_native_property( "document", - [this](JS::Object*) { + [this](JS::Interpreter&) { return wrap(m_interpreter->heap(), *this); }, nullptr);